2014-10-20 204 views
2

我有一個Java程序創建多個線程,其中每個線程發出POST請求。它在大多數情況下都能正常工作,但是在負載較重的情況下,它會引發Connection reset異常。例如,當我發出40個同時請求時,幾次我得到Connection重置異常。HttpClient的executeMethod拋出java.net.SocketException:連接重置

Caught: java.net.SocketException: Connection reset 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:168) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:237) 
    at org.apache.commons.httpclient.HttpParser.readRawLine(HttpParser.java: 
    at org.apache.commons.httpclient.HttpParser.readLine(HttpParser.java:105 
    at org.apache.commons.httpclient.HttpConnection.readLine(HttpConnection. 
    at org.apache.commons.httpclient.HttpMethodBase.readStatusLine(HttpMetho 
    at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodB 
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.j 
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(Htt 
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMe 
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.jav 
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.jav 

在我的Java代碼,當我提出一個請求等待它完成,然後再拍要求我創建的HttpClient的

HttpClient client = new HttpClient(); 

實例中的問題不會發生。但是,當我將程序轉換爲多線程時,我遇到了這個問題。

任何人都可以請指出我怎樣才能防止這種異常,然後再次重試。從谷歌,我發現答案可能是沿着使用

org.apache.commons.httpclient.util.IdleConnectionTimeoutThread 

我想在此同時使用這一點,但其他任何建議,歡迎的線路。

+0

是否有任何日誌服務器端可能會給你一個線索,爲什麼會發生這種情況? – Nattrass 2014-10-20 20:45:25

回答

2

我建議,要麼使用MultiThreadedHttpConnectionManager如果你使用的HttpClient 3或PoolingHttpClientConnectionManager如果你使用的HttpClient 4

我相當有信心,無論對於HttpClient的3和4的HttpClient默認的連接管理器都期待只有單線程訪問。

+0

謝謝。我改變它使用MultiThreadedHttpConnectionManager,並解決了連接重置的問題。我想爲你的答案投票,但不幸的是我沒有15的聲望。 – Prabhjot 2014-10-21 19:45:58

+0

我認爲你應該能夠接受答案。很高興它解決了。 :) – hooknc 2014-10-21 21:07:33

相關問題