当你想在你的代码中找到一个错误时,这很难;当你认为你的代码是不会有错误时,这就更难了。

Java-轴Web服务挂起,因为没有连接关闭返回

admin 5℃
我有一个轴1.4(带有Spring)Web服务客户机,它消耗一个PHP Web服务(在Apache上运行)。这在开发环境中是完美的,但是在生产环境中,在客户端接收到SOAP响应之后,代码执行直接在轴库中的某个地方挂起。我已经与wireshark确认,从客户机角度来看,唯一的区别是在开发环境中,soap响应的http头包含条目


Connection: close

在生产环境中缺少。我假设这是代码执行挂起的原因,因为AxIS正在期待连接关闭头字段。

我可以通过配置客户端来解决这个问题吗?如果没有,请提供有关配置apache+php以正确关闭连接的任何提示。

尝试在应用程序中设置-dhttp.keepalive=false系统属性,如果可以在应用程序的其他部分禁用keep alives。这将防止java内部httpclient类试图从打开的连接中急切地填充bufferedinputstream的某些挂起。

有关详细信息,请参见http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4479751

如果这有机会帮助您查看挂起的客户机的堆栈跟踪,应该如下所示:

java.lang.thread.state:可运行 在java.net.socketputstream.socketread0(本机方法) 在java.net.socketputstream.read上(socketputstream.java:129) 在java.io.bufferedinputstream.fill处(bufferedinputstream.java:218) 在java.io.bufferedinputstream.read1上(bufferedinputstream.java:258) 在java.io.bufferedinputstream.read上(bufferedinputstream.java:317) -locked<0xAB82FA30>(java.io.bufferedinputstream) 在sun.net.www.http.httpclient.parsehttpheader上(httpclient.java:687) 在sun.net.www.http.httpclient.parsehttp上(httpclient.java:632) 在sun.net.www.protocol.http.httpurlconnection.getinputstream(httpurlconnection.java:1072) -锁定<0xAB82C838>(sun.net.www.protocol.http.httpurlconnection)

keepalive设置本质上确保httpclient将始终按照heave的建议发送'connection:close'。

您可以尝试在请求中发送http头'connection:close'。

转载请注明:我的代码 » Java-轴Web服务挂起,因为没有连接关闭返回