2014-10-20 152 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

相关问题