Java 为什么HttpClient在执行POST时抛出SocketTimeOutException
我有类似以下代码:Java 为什么HttpClient在执行POST时抛出SocketTimeOutException,java,post,httpclient,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 = Ent
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);
}
它使用以前可能已经使用过的httpclient实例,通过POST将请求的内容发送到服务器(它打开了持久连接,因为我们正在向同一服务器发送相当多的请求…)
此操作有时会失败,消息为“Read timed out”(读取超时)。
我们不清楚为什么它只在某些时候失败,而大多数时候没有。给出了什么?在下面,我假设您使用的是Apache Commons HttpClient(org.Apache.Commons.HttpClient.HttpClient
)
可能您会被抛出一个SocketTimeoutException
,这仅仅是因为有时候,您的HttpClient实例与之通信的主机需要花费太长时间才能响应,从而触发HttpClient的取消例程。
您可以通过以下方法增加连接超时和套接字超时
HttpConnectionParams params = httpclient.getHttpConnectionManager().getParams();
params.setConnectionTimeout(20000);
params.setSoTimeout(15000);
另外,如果您在增加超时限制的情况下仍然面临超时问题,那么最好优雅地处理SocketTimeoutException
——例如,第二次和第三次重试连接。我在向solr w/tomcat 7发送多个请求时也遇到类似的问题。您将请求发送到什么?您的服务器的详细信息是什么?因为这是错误的根源。我想是Jetty 6。但那是很久以前的事了……HttpClient不是作为默认行为重试了3次吗?