2013-04-15 86 views
1

我使用多线程在java中同时扫描不同的URL。有错误,如果请求时间总和超过100,000。我已经关闭了,我应该关闭。在这里,从我的servlet代码org.apache.http.conn.ConnectionPoolTimeoutException:超时等待连接池

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

回答

5

我有同样的问题,我发现修复。此超时是由于连接泄漏。在我的情况下,我使用httpDelete方法,而不是消费响应。相反,检查响应的状态。

修复方法是,应答实体需要消耗。为了确保正确释放系统资源,必须关闭与实体关联的内容流。因此,我使用EntityUtils.consumeQuietly(response.getEntity());如果我使用EntityUtils.consumeQuietly(response.getEntity());这确保了实体内容被完全消费,并且内容流(如果存在)被关闭。

相关问题