将 CXF 服务的客户端 receiveTimeout 设置为 4 分钟以上
Setting a client receiveTimeout for CXF service above 4 minutes
我已经生成了一个 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 服务是从我的 PC 的简单 .jar
应用程序内部调用的,因此之间没有其他 servers/containers(如 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:读取超时
如果我将其设置为 >4min
或 0
,我得到:
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 分钟)和 return 正常响应 -这由审计工具确认(它将每个请求注册到我的 esb - 响应和时间)。
我认为这一点与@pedrofb 在评论中提到的相同。有什么建议吗?
也许您的问题与此类似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 表示没有超时。
我已经生成了一个 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 服务是从我的 PC 的简单 .jar
应用程序内部调用的,因此之间没有其他 servers/containers(如 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:读取超时
如果我将其设置为
>4min
或0
,我得到: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 分钟)和 return 正常响应 -这由审计工具确认(它将每个请求注册到我的 esb - 响应和时间)。
我认为这一点与@pedrofb 在评论中提到的相同。有什么建议吗?
也许您的问题与此类似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 表示没有超时。