更新:releaseConnection()这个方法已经再也不推荐了,我用的httpclient4.5的jar包,不须要对request进行这个操做了,看官方文档解释是更换了链接池管理类,最新的是:PoolingHttpClientConnectionManager。java
在请求失败的时候response为空,故关闭以前作非空校验。下面是我新的方法:编程
/** * 根据响应获取响应实体 * * @param response * @return */ private static String getContent(CloseableHttpResponse response) { HttpEntity entity = response.getEntity();// 获取响应实体 String content = EMPTY; try { content = EntityUtils.toString(entity, UTF_8);// 用string接收响应实体 EntityUtils.consume(entity);// 消耗响应实体,并关闭相关资源占用 if (response != null) response.close(); } catch (ParseException e1) { output("解析响应实体异常!", e1); } catch (IOException e1) { output("解析响应实体时java IO 异常!", e1); } return content; }
--------------------------------分割线--------------------------------------框架
本人在学习使用httpclient的过程当中,对于资源释放的一直很不理解,最近特地研究了一下这块,网上不少教程和文章形成了一些误导,多是由于时间比较久了,版本更新致使的,个人版本是httpclient4.5,关于资源释放的分享一下本身的理解,若有不正确的地方,还请指出。性能
如下内容是我关于资源释放的理解,创建在自己项目的基础上的,有些地方并非官方给的方法,主要是在消耗相应实体方面,我并无使用abort()方法,由于没有这个需求。本文因此代码只是创建在普通请求的基础上,不涉及链接池和链接管理器相关内容。学习
关于response如何关闭:测试
CloseableHttpResponse response = null;// 建立响应对象 //中间作一些事情 try { response.close(); } catch (IOException e2) { output("响应关闭失败!", e2); }
这里插一句,只有你肯定响应长度以后才能用这个方法,否则你得关闭各类流,而后调用一个consume()方法。或者直接用abort()方法,或者使用官方推荐关闭方法。命令行
推荐消耗实体内容的方式是使用它的HttpEntity#getContent()或HttpEntity#writeTo(OutputStream)方法。3d
关于释放链接,这个就比较简单了,请求完成以后,执行释放链接的方法就能够了:code
request.releaseConnection();
对象
在释放后能够复用的,以前看到一些方法有些在释放后是不能够复用的,这个具体得在链接池和链接管理器中再具体介绍了。
最后的最后的,必定要关闭客户端:
protected static CloseableHttpClient httpClient = getCloseableHttpClients(); //中间作一些事情,最后必定要关闭 httpClient.close();