1

我有一个使用 PHP Web 服务(在 Apache 上运行)的 Axis 1.4(带有 Spring)Web 服务客户端。这在开发环境中完美运行,但在生产环境中,代码执行在客户端收到 SOAP 响应后直接挂在 Axis 库中的某个位置。我已经用 Wireshark 确定,从客户端的角度来看,唯一的区别是在开发环境中,SOAP 响应的 HTTP 标头包含条目


Connection: close

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

我可以通过配置客户端来解决这个问题吗?如果没有,任何有关配置 Apache + PHP 以正确关闭连接的提示都值得赞赏。

4

2 回答 2

4

尝试在应用程序中设置 -Dhttp.keepAlive=false 系统属性,如果可以在应用程序的其他部分禁用保持活动。这将防止 java-internal HttpClient 类试图从打开的连接中急切地填充 BufferedInputStream 的某些挂起。

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

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

java.lang.Thread.State:在 java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 的 java.net.SocketInputStream.read(SocketInputStream.java:129) 的 java.net.SocketInputStream.socketRead0(Native Method) 可运行) 在 java.io.BufferedInputStream.read1(BufferedInputStream.java:258) 在 java.io.BufferedInputStream.read(BufferedInputStream.java:317) - 在 sun.net.www 锁定 <0xab82fa30> (a java.io.BufferedInputStream) .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)

http.keepAlive 设置本质上确保 HttpClient 将始终按照 HeavyWave 的建议发送“连接:关闭”。

于 2009-10-26T18:47:19.437 回答
2

您可以尝试在您的请求中发送 Http Header "Connection: close"。

于 2009-10-26T11:18:49.577 回答