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

标签 java web-services timeout esb jboss-esb

我已生成 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 。从简单.jar内部调用CXF服务应用程序来 self 的 PC,因此之间没有其他服务器/容器(如 tomcat 等)。

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

使用 Apache CXF 3.0.1

编辑

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

  • 如果我将其设置为 <=4min (通过我或@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 : 读取超时

  • 如果我将其设置为 >4min0 ,我得到:

    javax.xml.ws.soap.SOAPFaultException:未收到服务 [Category:MyService] 的响应,告知不要重试。

说实话,我很困惑什么是预期结果(我认为是第一个)

编辑2

我已经测试过MyService通过SoapUI 。我设置了5min在那里超时并根据 sample 请求进行拍摄。

再一次,过了 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 继续处理时,客户端收到超时。在这种情况下需要配置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);

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

关于java - 将 CXF 服务的客户端 receiveTimeout 设置为 4 分钟以上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38824218/

相关文章:

web-services - 通过 MATLAB 中的 Web 服务进行货币汇率

c# - 这段代码会杀死我的服务器吗?

java - 为什么 Joda DateTimeZone 名称不返回我传入的内容?

java - 需要帮助创建类以反向返回名称并返回缩写

java - 如果可能的话,是否可以在请求范围内注入(inject)bean,如果它对于线程不活跃,则注入(inject)原型(prototype)?

java - 为什么gson在toJSONString()方法中使用StringWriter?

java - 使用多态 JAX-WS web 服务参数

java - 使用 Web 服务和 2 路 SSL

javascript - 如何在超时时分派(dispatch) Redux 操作?

sockets - JMeter:java.net.SocketException:连接重置