0

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ます。

jboss esb サービスを呼び出しています。これは最大持続し5minます。CXF サービスは.jar、PC から単純なアプリケーション内から呼び出されるため、間に他のサーバー/コンテナーはありません (Tomcat など)。

タイムアウト設定を修正するアイデアはありますか?

を使ってApache CXF 3.0.1

編集

2 つの異なるメッセージを受け取っていることに気付いたのは、タイムアウトの設定によって異なります。

  • <=4min(my または @pedrofb メソッドを介して)に設定すると、その時間の後に次のようになります。

    org.apache.cxf.interceptor.Fault: メッセージを送信できませんでした。org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64) で org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) で org.apache.cxf.endpoint.ClientImpl .doInvoke(ClientImpl.java:516)

    原因: java.net.SocketTimeoutException: SocketTimeoutException 呼び出しhttp://esb:8080/MyService/ebws/Category/MyService : 読み取りタイムアウト

  • >4minまたはに設定すると0、次のようになります。

    javax.xml.ws.soap.SOAPFaultException: サービス [Category:MyService] に対する応答がありません。再試行しないように指示されました。

正直なところ、私は予想される結果が何であるかについてかなり混乱しています(最初の結果だと思います)

編集2

MyService経由でテストしSoapUIました。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がコメントで言及したことについて、この点が指摘されていると思います。これが何であるかについての提案はありますか?

4

1 に答える 1

7

おそらく、あなたの問題はこれに似ていますhttp://rayploski.blogspot.com.es/2010/08/jbossesb-setting-up-long-running.html ESB が処理を続行している間に、クライアントがタイムアウトを受け取ります。org.jboss.soa.esb.ws.timeoutこの場合、ESBで構成する必要があります。

クライアントのタイムアウトを設定するには、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 はタイムアウトなしを意味します。

于 2016-08-08T08:48:17.993 に答える