簡體   English   中英

將客戶端接收超時設置為4分鍾以上的CXF服務

[英]Setting a client receiveTimeout for CXF service above 4 minutes

我已經生成了CXF服務,並為這兩個都設置了120000ms = 2min超時:

requestContext.put("javax.xml.ws.client.receiveTimeout", 120000);
requestContext.put("javax.xml.ws.client.connectionTimeout", 120000);

它運行良好,我已經對其進行了20s, 1min, 3min -每次它都在等待足夠多的時間來響應。

但是,當我想將其設置為5min時,問題仍然存在。 服務僅在~240800ms = ~4min 〜4min內等待響應。

我正在打電話給jboss esb服務。 此過程最多持續5min 從我的PC的簡單.jar應用程序內部調用CXF服務,因此之間沒有其他服務器/容器(例如tomcat等)。

有什么想法可以解決我的超時設置?

使用Apache CXF 3.0.1

編輯

我現在知道要收到2條不同的消息,這取決於我的超時設置:

  • 如果我將其設置為<=4min (通過我的@pedrofb方法),那么經過這段時間后,我會得到:

    org.apache.cxf.interceptor.Fault:無法發送消息。 在org.apache.cxf.endpointClient的org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)的org.apache.cxf.interceptor.MessageSenderInterceptor $ MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)處.doInvoke(ClientImpl.java:516)

    引起原因:java.net.SocketTimeoutException:調用http:// esb:8080 / MyService / ebws / Category / MyService的 SocketTimeoutException:讀取超時

  • 如果我將其設置為>4min0 ,則會得到:

    javax.xml.ws.soap.SOAPFaultException:未收到對服務[Category:MyService]的響應,請不要重試。

老實說,我很困惑預期的結果(我認為是第一個)

編輯2

我已經通過SoapUI測試了MyService 我在那里設置了5min超時時間,並根據樣品要求進行拍攝。

同樣,再過4分鍾后,我得到了:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body>
  <env:Fault>
     <faultcode>env:Server</faultcode>
     <faultstring>No response received for service [Category:MyService], Told not to retry.</faultstring>
  </env:Fault>
</env:Body>
</env:Envelope>

但是,當我查看Jboss ESB的日志時,我沒有異常,沒有錯誤, MyService了1分鍾(約5分鍾)並返回正常響應-由審核工具確認(該響應將每個請求注冊到我的esb-帶有響應)和時間)。

我認為@pedrofb在評論中提到的這一點。 有什么建議嗎?

也許您的問題類似於此http://rayploski.blogspot.com.es/2010/08/jbossesb-setting-up-long-running.html客戶端在ESB繼續處理時收到超時。 在這種情況下,需要在ESB中配置org.jboss.soa.esb.ws.timeout

要配置客戶端超時,似乎對requestContext參數的使用似乎不合理,請參見https://java.net/jira/browse/JAX_WS-1166 CXF團隊建議他們可以改變

嘗試使用CXF特定參數進行超時

Client client = ClientProxy.getClient(proxy);
HTTPConduit http = (HTTPConduit) client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
httpClientPolicy.setConnectionTimeout(0);
httpClientPolicy.setReceiveTimeout(0);
http.setClient(httpClientPolicy);

參數的完整列表在此處 0表示沒有超時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM