使用WLS 10.3.3进行JAX-WS客户端ASYNC服务调用

时间:2010-06-25 19:37:30

标签: asynchronous weblogic jax-ws

我正在编写一个集成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("");
    }
}  

我希望所有这些请求最终都会被取消,但实际上它们都会继续执行,只有在后端最终决定向我们发送回复时才会返回。

1 个答案:

答案 0 :(得分:0)

事实证明这确实是jax-ws实现中的一个错误。 Oracle针对wls 10.3.3发布了一个补丁(RHEL)来解决这个问题。