将 CXF 服务的客户端接收超时设置为 4 分钟以上

ilo*_*tie 0 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);
Run Code Online (Sandbox Code Playgroud)

它工作正常,我已经对其进行了测试20s, 1min, 3min- 每次它都在等待响应的时间。

但是,当我想将其设置为5min. 服务仅等待响应~240800ms = ~4min

我正在调用 jboss esb 服务。这个持续最大5min。CXF 服务是.jar从我的 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.endpoint. .doInvoke(ClientImpl.java:516)

    引起:java.net.SocketTimeoutException: SocketTimeoutException invoking http://esb:8080/MyService/ebws/Category/MyService : Read timed out

  • 如果我将它设置为>4minor 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>
Run Code Online (Sandbox Code Playgroud)

但是,当我查看 Jboss ESB 的日志时,我没有异常,也没有错误,再MyService持续 1 分钟(大约 5 分钟)并返回正常响应 - 这由审计工具确认(将每个请求注册到我的 esb - 带有响应和时间)。

我认为这一点是@pedrofb 在评论中提到的。任何建议这可能是什么?

ped*_*ofb 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);
Run Code Online (Sandbox Code Playgroud)

完整的参数列表在这里。0 表示没有超时。