org.apache.http.conn.ConnectionPoolTimeoutException:等待来自池的连接超时

时间:2013-04-15 15:56:40

标签: connection timeout threadpool

我使用Multi-thread在java中同时扫描不同的URL。如果请求时间总和超过100,000,则存在错误。我已经关闭,我应该关闭。这是我的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;
    }

此处代码创建默认客户端

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

1 个答案:

答案 0 :(得分:5)

我有同样的问题,我找到了修复。此超时是因为连接泄漏。在我的情况下,我使用httpDelete方法,而不是消耗响应。相反,检查响应的状态。

修复方法是,需要使用响应实体。为了确保正确释放系统资源,必须关闭与实体关联的内容流。

所以我使用了EntityUtils.consumeQuietly(response.getEntity());这确保了实体内容被完全消耗,并且内容流(如果存在)被关闭。