我正在开发一个iOS应用程序,它将使用RestKit 0.20对运行在JBoss AS 7.1.1上的服务进行基于REST的调用,并使用restEASY作为基于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请求?
我最关心的是为什么在restEASY中发生异常,因为它会很难诊断真正失败的调用。以前有人见过这种行为吗?关于如何纠正这些问题的任何提示?感谢您提供任何帮助!!
答案 0 :(得分:1)
这些异常是由断开连接的客户端导致的,即某些用户可能在等待进程完成时退出应用程序或网络出现故障(在客户端)。 因此,破管。