Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool [duplicate]

I use Multi-thread to scan the different URL in the same time in java. There was the bug,if the sum of request time exceed 100,000. I have already close which i should close. Here the code from my servlet

private String proyGetHttp(String url) throws ParseException, IOException,
            InterruptedException {

        String content = "";
        getMethod = new HttpGet(url);
        HttpResponse response = null;
        HttpEntity httpEntity = null;
        boolean success = false;
        while (!success) {
            System.out.println("url:" + url + ",connect...");
            try {
                response = client.execute(getMethod);
                httpEntity = response.getEntity();
                StringBuffer sb = new StringBuffer();
                if (httpEntity != null) {
                    BufferedReader in = null;
                    InputStream instream = httpEntity.getContent();
                    try {
                        in = new BufferedReader(new InputStreamReader(instream));
                        String lineContent = "";
                        while(lineContent != null){
                            sb.append(lineContent);
                            lineContent = in.readLine();
                        }

                    } catch (Exception ex)
                        getMethod.abort();
                        throw ex;
                    } finally {
                        // Closing the input stream will trigger connection release
                        try { instream.close(); in.close();} catch (Exception ignore) {}
                    }
                }
                content = sb.toString();
                success = true;
                System.out.println("connect successfully...");
            } catch (Exception e) {
                e.printStackTrace();
                getMethod.abort();
                System.out.println("connect fail, please waitting...");
                Thread.sleep(sleepTime);
            }finally{
                getMethod.releaseConnection();
            }
        }
        return content;
    }

Here code create the default client

        PoolingClientConnectionManager cm = new PoolingClientConnectionManager();
        cm.setMaxTotal(100);
        DefaultHttpClient client = null;
        client = new DefaultHttpClient(cm);
        client.getParams().setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY);
        client.getParams().setParameter(HttpConnectionParams.CONNECTION_TIMEOUT, 5000);
like image 589
jack smith Avatar asked Dec 21 '25 10:12

jack smith


1 Answers

I have the same problem and I found the fix. This timeout is because of a connection leak. In my case, I'm using httpDelete method and not consuming the response. Instead, I'm checking the status of the response.

The fix is, the response entity need to be consumed. In order to ensure the proper release of system resources, one must close the content stream associated with the entity.

So I used EntityUtils.consumeQuietly(response.getEntity()); which ensures that the entity content is fully consumed and the content stream, if exists, is closed.

like image 108
Krishna Gollapudi Avatar answered Dec 24 '25 07:12

Krishna Gollapudi



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!