RestKit/RestEASY—排队请求操作时出现ClientAbortException



我正在开发一个iOS应用程序,该应用程序将使用RestKit 0.20对运行在JBoss AS 7.1.1上的服务进行基于rest的调用,并使用restasy作为其基于rest的web服务框架。

客户端应用程序将调用的REST服务用于根据其唯一标识符检索对象。因为这些对象可以是大的或小的(> 1MB),也可以是大的(20?50 ?100个或更多)我不想一次进行一次大的调用来检索它们。相反,我计划使用RestKit的排队操作支持,基于对象标识符为每个对象创建GET请求,并异步执行调用。一旦GET完成,每个对象将通过使用Objective-C块进行处理,以避免任何不必要的阻塞。

我的RestKit客户端代码看起来像这样…

    NSArray *identifiers = ...
    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    RKResponseDescriptor *getObjResp = [RKResponseDescriptor responseDescriptorWithMapping:[MyObject mapping] pathPattern:[WebServiceHelper pathForServiceOperation:@"/objects/:uniqueIdentifier"] keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    for (int i=0; i < identifiers.count; i++) {
        NSString *identifier = [identifiers objectAtIndex:i];
        NSURL *serviceURL = [WebServiceHelper urlForServiceOperation:[NSString stringWithFormat:@"/objects/%@", identifier]];
        NSURLRequest *request = [NSURLRequest requestWithURL:serviceURL];
        RKObjectRequestOperation *requestOp = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[getObjResp]];
        [requestOp setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
            MyObject *obj = [mappingResult firstObject];
            if (self.delegate != nil) {
                [self.delegate didLoadObjectWithIdentifier:identifier myObj:obj];
            }
        } failure:^(RKObjectRequestOperation *operation, NSError *error){
            if (self.delegate != nil) {
                [self.delegate didFinishWithError:error];
            }
        }];
        [objectManager enqueueObjectRequestOperation:requestOp];
    }

从那里,当对象被检索时被调用的委托方法看起来像这样:

-(void)didLoadObjectWithIdentifier:(NSString *)identifier myObj:(MyObject *)myObj {
    if(secureMessage != nil) {
        NSLog(@"Message %@ retrieved successfully : %@:%@", identifier, myObj);
    } else {
        NSLog(@"NO OBJ");
    }
}

调用似乎按预期运行,因为我能够打印出有关检索对象的信息。然而,我在服务端看到了一些奇怪的/意想不到的行为。

首先,我看到restEASY抛出了许多异常:

13:22:02,903 WARN  [org.jboss.resteasy.core.SynchronousDispatcher] (http--0.0.0.0-8080-10) Failed executing GET /objects/BBFE39EA126F610C: org.jboss.resteasy.spi.WriterException: ClientAbortException:  java.net.SocketException: Broken pipe
    at org.jboss.resteasy.core.ServerResponse.writeTo(ServerResponse.java:262) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.writeJaxrsResponse(SynchronousDispatcher.java:585) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:506) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119) [resteasy-jaxrs-2.3.2.Final.jar:]
    at org.jboss.seam.resteasy.ResteasyResourceAdapter$1.process(ResteasyResourceAdapter.java:145) [jboss-seam-resteasy.jar:2.3.0.Final]
    at org.jboss.seam.servlet.ContextualHttpServletRequest.run(ContextualHttpServletRequest.java:65) [jboss-seam.jar:2.3.0.Final]
    at org.jboss.seam.resteasy.ResteasyResourceAdapter.getResource(ResteasyResourceAdapter.java:120) [jboss-seam-resteasy.jar:2.3.0.Final]
    ...

看起来好像RestKit正在以某种方式关闭套接字(或者一些其他错误正在阻止从服务器读取对象)。我在文档中找不到任何可以解释这里发生的事情的东西。

其次,当请求失败并出现此错误时,我还看到对同一个对象的另一个调用。为什么多次调用GET ?RestKit重新做失败的GET请求?

我最关心的是为什么Exception在restEASY中发生,因为它将使诊断真正失败的调用变得困难。有人见过这种行为吗?关于如何纠正这些问题,有什么建议吗?谢谢你给的任何帮助!!

这些异常是由断开连接的客户端导致的,即一些用户可能在等待进程完成或(在客户端)出现网络故障时退出应用程序。

相关内容

  • 没有找到相关文章

最新更新