将CXF服务的客户端receiveTimeout设置为4分钟以上



我已经生成了一个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的响应。

我正在调用jbossesb服务。这一次最多持续5min。CXF服务是从我的PC上的简单.jar应用程序内部调用的,因此两者之间没有其他服务器/容器(如tomcat等(。

有什么想法可以修复我的超时设置吗?

使用Apache CXF 3.0.1

编辑

我现在意识到我收到了2条不同的消息,这取决于我的超时设置:

  • 如果我将其设置为<=4min(通过我的或@pedrofb方法(,那么在这段时间之后,我将得到:

    org.apache.cxf.enterceptor.Fault:无法发送消息。在org.apache.cxf.entercept.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64(网址:org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntersectorChain.java:307(在org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:516(

    引起原因:java.net.SocketTimeoutException:调用SocketTimeoutExceptionhttp://esb:8080/MyService/ebws/Category/MyService:读取超时

  • 如果我将其设置为>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.htmlESB继续处理时,客户端收到超时。在这种情况下,需要在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表示没有超时。

相关内容

  • 没有找到相关文章

最新更新