2010-07-02 31 views
3

时为什么HttpClient的抛出SocketTimeOutException我有类似下面的代码:执行POST

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); 
} 

它发出的request到服务器通过POST使用HttpClient的实例内容可能已被使用过(它已经打开了持续连接,因为我们向相同的服务器发送了一些请求......)。

这个有时失败,SocketTimeoutException与“读取超时”作为消息。 我们不清楚,为什么它只是在某些时候失败,而大部分时候没有。是什么赋予了?

+0

当发送多个请求到solr w/tomcat 7时,我有一个类似的问题。你是什么发送请求?什么是你的服务器的细节,因为那里的错误来自 – 2011-05-23 05:01:26

+0

我认为这是Jetty 6.但那是一段时间后... – kungfoo 2011-05-23 10:55:41

回答

1

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

也许你会抛出一个SocketTimeoutException,因为偶尔你的HttpClient实例正在与之通信的主机花费很长时间来响应,触发HttpClient的取消例程。 您可以增加连接超时,并具有以下

HttpConnectionParams params = httpclient.getHttpConnectionManager().getParams(); 
params.setConnectionTimeout(20000); 
params.setSoTimeout(15000); 

的方法,另外的套接字超时,如果你仍然面临超时,尽管增加了超时限制,这是一个很好的做法来处理SocketTimeoutException优雅 - 通过重试例如连接第二次和第三次。