首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >HttpClient 4.0.1 -如何释放连接?

HttpClient 4.0.1 -如何释放连接?
EN

Stack Overflow用户
提问于 2011-01-24 02:35:58
回答 12查看 147.8K关注 0票数 74

我有一个遍历一堆URL的循环,对于每个URL,我执行以下操作:

代码语言:javascript
复制
private String doQuery(String url) {

  HttpGet httpGet = new HttpGet(url);
  setDefaultHeaders(httpGet); // static method
  HttpResponse response = httpClient.execute(httpGet);   // httpClient instantiated in constructor

  int rc = response.getStatusLine().getStatusCode();

  if (rc != 200) {
    // some stuff...
    return;
  }

  HttpEntity entity = response.getEntity();

  if (entity == null) {
    // some stuff...
    return;
  }

  // process the entity, get input stream etc

}

第一个查询没问题,第二个抛出了这个异常:

线程"main“java.lang.IllegalStateException中出现

异常:无效使用SingleClientConnManager:仍然分配了连接。确保在分配另一个连接之前释放该连接。在org.apache.http.impl.conn.SingleClientConnManager$1.getConnection(SingleClientConnManager.java:173)......的org.apache.http.impl.conn.SingleClientConnManager.getConnection(SingleClientConnManager.java:199)

这只是一个简单的单线程应用程序。如何释放此连接?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-01-24 03:06:39

回答我自己的问题:要释放连接(以及与请求相关的任何其他资源),必须关闭HttpEntity返回的InputStream:

代码语言:javascript
复制
InputStream is = entity.getContent();

.... process the input stream ....

is.close();       // releases all resources

docs

票数 23
EN

Stack Overflow用户

发布于 2011-08-23 03:22:36

Httpcomponents 4.1推荐的方式是关闭连接并释放任何底层资源:

代码语言:javascript
复制
EntityUtils.consume(HttpEntity)

其中传递的HttpEntity是一个响应实体。

票数 98
EN

Stack Overflow用户

发布于 2012-02-29 19:57:25

这似乎很有效:

代码语言:javascript
复制
      if( response.getEntity() != null ) {
         response.getEntity().consumeContent();
      }//if

即使你没有打开实体的内容,也不要忘记消费它。例如,您希望从响应中获得HTTP_OK状态,但没有得到它,您仍然必须使用该实体!

票数 34
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4775618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档