2010-07-02 29 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優雅 - 通過重試例如連接第二次和第三次。