为什么HttpClient在执行POST时会抛出SocketTimeOutException

kun*_*foo 5 java post httpclient

我有类似以下的代码:

try {
    HttpPost post = new HttpPost(httpsUrl);
    setHeaders(post);

    HttpEntity entity = new StringEntity(request, "UTF-8");

    post.setEntity(entity);

    HttpResponse response = httpclient.execute(post);
    String result = EntityReader.readContent(response.getEntity());
    checkAnswer(result);
    return result;

} catch (Exception e) {
    throw new ZapException("Error executing the http post request: "+e.getMessage(), e);
}
Run Code Online (Sandbox Code Playgroud)

它使用之前可能已经使用过的 httpclient 实例通过 POST 将内容发送request到服务器(它打开了持久连接,因为我们向同一服务器发送了相当多的请求......)。

有时失败,并SocketTimeoutException显示“读取超时”消息。我们不清楚为什么它只在某些时候失败,而大多数时候却不会。是什么赋予了?

Abd*_*ull 3

在下文中,我假设您使用的是 Apache Commons HttpClient ( org.apache.commons.httpclient.HttpClient)。

也许您被抛出的原因SocketTimeoutException仅仅是因为,有时,与您的 HttpClient 实例通信的主机需要很长时间才能响应,从而触发 HttpClient 的取消例程。您可以使用以下命令增加连接超时和套接字超时

HttpConnectionParams params = httpclient.getHttpConnectionManager().getParams();
params.setConnectionTimeout(20000);
params.setSoTimeout(15000);
Run Code Online (Sandbox Code Playgroud)

此外,如果尽管增加了超时限制,但您仍然面临超时,那么最好妥善处理SocketTimeoutException,例如第二次和第三次重试连接。

  • HttpClient 默认行为不是重试 3 次吗? (2认同)