我有一个Axis 1.4(带有Spring)Web服务客户端,它使用PHP Web服务(在Apache上运行)。这在开发环境中完美地工作,但在生产环境中,代码执行在客户端收到SOAP响应后直接挂在Axis库中的某个位置。我已经与Wireshark确认,与客户端角度的唯一区别是,在开发环境中,SOAP响应的HTTP头包含条目
Connection: close
生产环境中缺少。我的假设是这就是代码执行挂起的原因,因为Axis期望连接关闭头字段。
我可以通过配置客户端来解决这个问题吗?如果没有,那么任何关于配置Apache + PHP以正确关闭连接的提示都会受到赞赏。
答案 0 :(得分:4)
尝试在应用程序中设置-Dhttp.keepAlive = false系统属性,如果可以在应用程序的其他部分禁用保持活动。这将阻止java-internal HttpClient类尝试从打开的连接急切填充BufferedInputStream的某些挂起。
有关详情,请参阅http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4479751。
如果这有可能帮助您查看挂起客户端的堆栈跟踪,它应该如下所示:
java.lang.Thread.State:RUNNABLE 在java.net.SocketInputStream.socketRead0(本机方法) 在java.net.SocketInputStream.read(SocketInputStream.java:129) 在java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 在java.io.BufferedInputStream.read1(BufferedInputStream.java:258) 在java.io.BufferedInputStream.read(BufferedInputStream.java:317) - 已锁定< 0xab82fa30> (一个java.io.BufferedInputStream) 在sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687) 在sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1072) - 已锁定< 0xab82c838> (a sun.net.www.protocol.http.HttpURLConnection)
http.keepAlive设置基本上确保HttpClient始终按照HeavyWave的建议发送'connection:close'。
答案 1 :(得分:2)
您可以尝试使用您的请求发送Http Header“Connection:close”。