我正在编写一个集成Web服务,它将使用来自几个不同后端系统的各种Web服务。我希望能够并行化非依赖服务调用,并能够取消花费太长时间的请求(因为我有一个SLA可以满足)。
帮助并行后端调用,我正在使用ASYNC客户端api(由wsimport使用客户端jax-ws绑定更改文件生成)
我遇到的问题是当我尝试取消请求时,响应<>适当地将请求标记为已取消,但实际请求并未真正取消。显然,JAX-WS运行时的某些部分实际上将com.sun.xml.ws.api.pipe.Fiber提交给运行队列,这实际上就是请求。取消结果<>不会阻止这些PIPE在队列上运行并发出请求。
之前是否有人遇到此问题或类似问题?
我的代码如下所示:
List<Response<QuerySubscriberResponse>> resps = new ArrayList<Response<QuerySubscriberResponse>>();
for (int i = 0; i < 10; i++) {
resps.add(FPPort.querySubscriberAsync(req));
}
for (int i = 0; i < 10; i++) {
logger.info("Waiting for " + i);
try {
QuerySubscriberResponse re = resps.get(i).get(1,
TimeUnit.SECONDS); // execution time for this request is 15 seconds, so we should always get a TimeoutException
logger.info("Got: "
+ new Marshaller().marshalDocumentToString(re));
} catch (TimeoutException e) {
logger.error(e);
logger.error("Cancelled: " + resps.get(i).cancel(true));
try {
logger.info("Waiting for my timed out thing to finish -- technically I've canceled it");
QuerySubscriberResponse re = resps.get(i).get(); // this causes a CancelledExceptio as we would expect
logger.info("Finished waiting for the canceled req");
} catch (Exception e1) {
e1.printStackTrace();
}
} catch (Exception e) {
logger.error(e);
} finally {
logger.info("");
logger.info("");
}
}
我希望所有这些请求最终都会被取消,但实际上它们都会继续执行,只有在后端最终决定向我们发送回复时才会返回。
答案 0 :(得分:0)
事实证明这确实是jax-ws实现中的一个错误。 Oracle针对wls 10.3.3发布了一个补丁(RHEL)来解决这个问题。