1
我正在編寫一個集成web服務,它將消耗來自兩個不同後端系統的各種web服務。我希望能夠並行處理非依賴性服務調用,並且能夠取消需要花費很長時間的請求(因爲我有SLA可以見面)。使用WLS的JAX-WS客戶端ASYNC服務調用10.3.3
並行後端調用幫助,我現在用的是異步客戶端API
我遇到的問題是(使用客戶端JAX-WS結合改變文件wsimport生成),當我嘗試取消請求,響應<>將請求標記爲取消,但實際請求並未真正取消。顯然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("");
}
}
我希望所有這些請求最終會被取消,但是在現實中,他們都將繼續執行,並只返回時,後端最終決定向我們發送回覆。
我忘了提及WLS 10.3.3從玻璃魚發運非股票JAX-WS 2.1.5參考實現。我說非股票,因爲他們顯然修改了很多代碼。這種行爲是否可以歸因於此修改引入的一些錯誤?或者可能是由於我不理解異步API的語義? – 2010-06-25 19:39:27
我開始了一個博客,以跟蹤我正在嘗試回答此問題的進度和步驟/測試:http://differentframeofmind.blogspot.com/ – 2010-07-22 03:49:35
,事實證明這確實是jax- ws執行。 Oracle針對wls 10.3.3發佈了一個補丁(RHEL)來解決這個問題。 – 2011-03-09 23:49:01