HttpClient在成功执行的方法上挂起socketRead0

Kaf*_*que 7 java sockets timeout httpclient

在我们的网络应用程序中,用户可以提交网址.我们将获取数据并解析服务器端.对于每个请求,我们使用具有以下(相关)设置的HttpClient

connectionManager.getParams().setConnectionTimeout(10000);
connectionManager.getParams().setSoTimeout(10000);
Run Code Online (Sandbox Code Playgroud)

当我调用HttpMethod.getResponseBody时,状态代码已被检查为可接受.此时线程与此堆栈跟踪挂起:

java.net.SocketInputStream.socketRead0 ( native code )
java.net.SocketInputStream.read ( SocketInputStream.java:150 )
java.net.SocketInputStream.read ( SocketInputStream.java:121 )
java.io.BufferedInputStream.read1 ( BufferedInputStream.java:273 )
java.io.BufferedInputStream.read ( BufferedInputStream.java:334 )
java.io.FilterInputStream.read ( FilterInputStream.java:133 )
org.apache.commons.httpclient.AutoCloseInputStream.read ( AutoCloseInputStream.java:108 )
java.io.FilterInputStream.read ( FilterInputStream.java:107 )
org.apache.commons.httpclient.AutoCloseInputStream.read ( AutoCloseInputStream.java:127 )
org.apache.commons.httpclient.HttpMethodBase.getResponseBody ( HttpMethodBase.java:690 )
Run Code Online (Sandbox Code Playgroud)

我无法找到发生这种情况的确切网址(这是一个在实时环境中发生的事件)而且我无法重现它.我想这只是我们所连接的服务器的一个问题,表现得很奇怪,但也许我错过了一些东西.在任何一种情况下,有没有办法让我阻止阻塞方法调用永远等待?SoTimeout也是套接字读取超时?我还缺少另一种设置吗?

Ste*_*han 0

当我调用 HttpMethod.getResponseBody 时,状态代码已被检查为可接受。此时线程挂起

看起来您在同步调用时遇到问题...您应该确保该方法

HttpMethod.getResponseBody

顺序调用或者应该使用互斥体(信号量)来更改状态代码的部分

此外,您还应该减少超时限制以防止挂起。