尝试在应用程序中设置 -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 的建议发送“连接:关闭”。