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

时间:2016-08-08 08:13:53

标签: java web-services timeout esb jboss-esb

我已经为120000ms = 2min生成了一个CXF服务并设置了超时:

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

它工作正常,我已经为20s, 1min, 3min测试了它 - 每当它等待时间的响应时就会出现。

但是当我想在5min上设置问题时,问题就出现了。服务正在等待~240800ms = ~4min

的resposne

我正在调用jboss esb服务。这个持续最多5min。从我的PC中的简单.jar应用程序内部调用CXF服务,因此之间没有其他服务器/容器(如tomcat等)。

修复超时设置的想法是什么?

使用Apache CXF 3.0.1

修改

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

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

    org.apache.cxf.interceptor.Fault:无法发送消息。 at org.apache.cxf.interceptor.MessageSenderInterceptor $ MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64) at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307) 在org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:516)

    引起:java.net.SocketTimeoutException:调用http://esb:8080/MyService/ebws/Category/MyService的SocketTimeoutException:读取超时

  • 如果我将其设为>4min0,我就会:

    javax.xml.ws.soap.SOAPFaultException:未收到服务响应[类别: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在评论中提到了这一点。有什么建议可以吗?

1 个答案:

答案 0 :(得分:4)

也许您的问题类似于此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);

完整的参数列表为here。 0表示没有超时。