2010-06-25 56 views
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(""); 
    } 
} 

我希望所有這些請求最終會被取消,但是在現實中,他們都將繼續執行,並只返回時,後端最終決定向我們發送回覆。

+0

我忘了提及WLS 10.3.3從玻璃魚發運非股票JAX-WS 2.1.5參考實現。我說非股票,因爲他們顯然修改了很多代碼。這種行爲是否可以歸因於此修改引入的一些錯誤?或者可能是由於我不理解異步API的語義? – 2010-06-25 19:39:27

+0

我開始了一個博客,以跟蹤我正在嘗試回答此問題的進度和步驟/測試:http://differentframeofmind.blogspot.com/ – 2010-07-22 03:49:35

+0

,事實證明這確實是jax- ws執行。 Oracle針對wls 10.3.3發佈了一個補丁(RHEL)來解決這個問題。 – 2011-03-09 23:49:01

回答

0

事實證明這確實是jax-ws實現中的一個錯誤。 Oracle針對wls 10.3.3發佈了一個補丁(RHEL)來解決這個問題。