【发布时间】:2014-09-22 21:03:00
【问题描述】:
我有一个 Apache CXF 2.7.8 使用者调用另一个 SOAP Web 服务。
在我的开发环境(Tomcat 6.0、jdk1.7.0_51、Windows 7)中,一切正常。
但是;当我将代码部署到测试环境(WebLogic 12.1、jdk1.7.0_51、RHEL 6)时,我得到一个 javax.xml.ws.WebServiceException: Could not send Message 异常,这是由 java.net.SocketTimeoutException: Read time out after x millis 引起的。
开发和测试实例调用完全相同的服务器。
当我执行网络跟踪时,我看到 CXF 使用同一个套接字连接发送许多请求(感谢 HTTP Keep-Alive)。最终,服务器发送FIN 指示客户端应停止使用此连接(并在需要时建立一个新连接)。客户端确认FIN,然后继续在同一个套接字上发送下一个请求,尽管已被告知断开连接(并确认该指令)。然后服务器发送一个RST(如预期的那样),告诉客户端离开。然后客户端再次尝试。最终,经过足够的时间,我们达到了读取超时,并抛出了上面的 SocketTimeoutException。
(顺便说一句:在windows开发平台上,客户端尊重FIN并为下一个请求建立一个新的套接字连接)。
当我禁用 HTTP Keep-Alive 时(使用指令here),服务器在客户端仅发送一个请求后发送FIN(正如它应该发送的那样)。客户端仍然使用该帧的ACK 来确认FIN,然后大胆地继续尝试使用该套接字。
我希望 HTTP Keep-Alive 能够正常工作,但我会接受没有它的情况。
是否有任何推荐的解决方案或故障排除的后续步骤?
【问题讨论】:
-
软件不能忽略 FIN 并继续通过同一个套接字进行传输。这一定是平台错误,否则您的观察结果有误。
-
原来它(在我看来)是一个平台错误(WebLogic 在使用它们之前未能检查以确保池套接字连接仍然有效)。在下面的答案中修复(让 WebLogic 进行检查)。
标签: java web-services http weblogic cxf