【发布时间】:2016-12-13 22:25:20
【问题描述】:
我已经生成了一个 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 应用程序内部调用的,因此之间没有其他服务器/容器(如 tomcat 等)。
有什么办法可以解决我的超时设置吗?
使用Apache CXF 3.0.1
编辑
我现在意识到收到 2 条不同的消息取决于我的超时设置:
-
如果我将其设置为
<=4min(通过 my 或 @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 分钟)并返回正常响应 - 这是由审计工具确认的(将每个请求注册到我的 esb - 有响应和时间)。
我认为这一点就是@pedrofb 在评论中提到的。有什么建议吗?
【问题讨论】:
-
服务器能否将响应限制为四分钟?
-
我已经检查过 - 服务在大约
4,5min之后响应正常,预期的消息,服务器超时设置为5 min,这证实了这一点 -
可能您的问题与此类似rayploski.blogspot.com.es/2010/08/… 客户端在 ESB 继续处理时收到超时。这种情况下需要在ESB中配置
org.jboss.soa.esb.ws.timeout -
@pedrofb 宾果游戏!参数设置为精确
240000。现在一切都运行良好。你能编辑你的答案让我接受吗?顺便说一句,哪种方法更好地设置超时?通过RequestContext或喜欢您通过HttpClientPolicy发布的内容 -
完美,我很高兴!我建议使用 CXF 特定参数,因为在 JIRA 票证中他们说
RequestContext参数没有标准化,可能会改变
标签: java web-services timeout esb jboss-esb