我有一个遍历一堆URL的循环,对于每个URL,我执行以下操作:
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)
这只是一个简单的单线程应用程序。如何释放此连接?
发布于 2011-01-24 03:06:39
回答我自己的问题:要释放连接(以及与请求相关的任何其他资源),必须关闭HttpEntity返回的InputStream:
InputStream is = entity.getContent();
.... process the input stream ....
is.close(); // releases all resources
从docs
发布于 2011-08-23 03:22:36
Httpcomponents 4.1推荐的方式是关闭连接并释放任何底层资源:
EntityUtils.consume(HttpEntity)
其中传递的HttpEntity
是一个响应实体。
发布于 2012-02-29 19:57:25
这似乎很有效:
if( response.getEntity() != null ) {
response.getEntity().consumeContent();
}//if
即使你没有打开实体的内容,也不要忘记消费它。例如,您希望从响应中获得HTTP_OK状态,但没有得到它,您仍然必须使用该实体!
https://stackoverflow.com/questions/4775618
复制相似问题