HttpClient 需要关闭的资源

使用HttpClient 访问会涉及到三个层次的资源, 从上往下依次是:

  1. HttpClient 类型的对象。这是Http 呼叫的客户端。
  2. Http的请求的对象,一般是HttpGet 或者HttpPost, 这个代码了一个Http的链接请求。
  3. 从目标地址获取的响应流 HttpResponse,某些状况下响应的结果是以流的形式返回,使用完成最好是关闭流。

HttpClient 资源关闭的方式

资源的初始化的顺序是 HttpClient > Http请求 > 响应流, 在释放时以从下往上的顺序释放, 依次是: 关闭响应流 > 关闭Http请求 > 关闭HttpClient 。
这三种类型的资源释放的方式分别是:

  1. HttpClient 使用 close() 方法
  2. Http请求 使用 close() 方法
  3. 响应流可以使用Stream 的close() 方法关闭, HttpClient 也提供了EntityUtils.consume()方法用来关闭响应流。

Java 处理资源释放的语法

  1. 在早期的Java 语法中, 主要在 try finally 语法中释放资源
  2. 在Java 8 之后, 使用 try 资源之后就可以直接释放资源。

HttpClient 资源释放示例代码

综合以上, 在 HttpClient 中释放资源就可以多种方式。

1. [推荐] 使用 try 资源 + EntityUtils.consume()

在Java 8 及以上的版本, 推荐使用try 资源 释放资源, 理由是简洁。
对响应流的释放使用EntityUtils.consume(entity);
完整的示例代码如下:

 @Testpublic void byTryRelease() throws Exception {try (CloseableHttpClient httpclient = HttpClients.createDefault()) { //3. 关闭客户端资源HttpGet httpGet = new HttpGet("http://www.baidu.com");try (CloseableHttpResponse response = httpclient.execute(httpGet)) { //2. 关闭响应资源     HttpEntity entity = response.getEntity();               EntityUtils.consume(entity); //1. 关闭响应流}     }}

2. 使用 try finally + EntityUtils.consume()

  • 使用try finally 释放资源
  • 使用 EntityUtils.consume() 释放资源
 @Testpublic void byManualRelease() throws Exception{CloseableHttpClient httpclient = HttpClients.createDefault();try {        HttpGet httpGet = new HttpGet("http://www.baidu.com");CloseableHttpResponse response = httpclient.execute(httpGet);try {HttpEntity entity = response.getEntity();      EntityUtils.consume(entity); //1. 关闭响应流}finally {response.close(); //2. 关闭响应资源      }}finally {httpclient.close();//3. 关闭客户端资源}                   }

3. 使用 try finally + 手动关闭输入流

  • 使用try finally 释放资源
  • 通过Stream 的close() 关闭输入流
 @Testpublic void byManualRelease2() throws Exception{CloseableHttpClient httpclient = HttpClients.createDefault();try {       HttpGet httpGet = new HttpGet("http://www.baidu.com");CloseableHttpResponse response = httpclient.execute(httpGet);try {HttpEntity entity = response.getEntity();      //EntityUtils.consume(entity); //1. 关闭响应流if (entity != null) {InputStream inStream = entity.getContent();try {inStream.read();}  finally {inStream.close();   //1. 关闭响应流}}}finally {response.close(); //2. 关闭响应资源     }}finally {httpclient.close();//3. 关闭客户端资源}                   }

总结

  • 以上三种方式的实现的效果是一样的, 差别是代码的简洁性和美观性
  • Java 8 推荐使用 try 资源的方式使用和释放资源。


HttpClient 如何正确的释放资源相关推荐

  1. HttpClient的释放资源到底在释放什么?如何正确的释放资源?

    ApacheHttpClient github地址:https://github.com/apache/httpcomponents-client/tree/4.5.x ApacheHttpClien ...

  2. C#如何正确的释放资源

    此标题可以为".NET 框架如何正确的释放资源".参考:https://www.cnblogs.com/fdyang/p/3456258.html 托管的内存资源,这是不需要我们操 ...

  3. 通过FD耗尽实验谈谈使用HttpClient的正确姿势

    一段问题代码实验 在进行网络编程时,正确关闭资源是一件很重要的事.在高并发场景下,未正常关闭的资源数逐渐积累会导致系统资源耗尽,影响系统整体服务能力,但是这件重要的事情往往又容易被忽视.我们进行一个简 ...

  4. Lind.DDD.Utils.HttpHelper关于对HttpClient的正确使用

    回到目录 官方的不一定是对的,机器最能证明一切 不知道从什么时候起,我们在写数据库连接,网络连接,文件操作时会习惯加上using,这种习惯被我们误称为一种模式,但事实上,一切事情都有因有果的,使用us ...

  5. java httpclient cdn_通过FD耗尽实验谈谈使用HttpClient的正确姿势

    一段问题代码实验 在进行网络编程时,正确关闭资源是一件很重要的事.在高并发场景下,未正常关闭的资源数逐渐积累会导致系统资源耗尽,影响系统整体服务能力,但是这件重要的事情往往又容易被忽视.我们进行一个简 ...

  6. .net core HttpClient 使用之掉坑解析(一)

    一.前言 在我们开发当中经常需要向特定URL地址发送Http请求操作,在.net core 中对httpClient使用不当会造成灾难性的问题,这篇文章主要来分享.net core中通过IHttpCl ...

  7. JAVA——保持cookie登录状态的HttpClient封装工具类

    在日常开发中,我们经常需要通过http协议去调用网络内容,虽然java自身提供了net相关工具包,但是其灵活性和功能总是不如人意,于是有人专门搞出一个httpclient类库,来方便进行Http操作. ...

  8. .NET HttpClient的缺陷和文档错误让开发人员倍感沮丧

    设计错误.缺陷及文档错误等导致正确使用.NET HttpClient变得出奇地困难.所以,即使是生产环境中看似运行正常的应用程序,在负荷不满的情况下,也遭受着性能问题和运行时故障. 来自ASP.NET ...

  9. .Net操作Excel后彻底释放资源

    .Net操作Excel后彻底释放资源 和同事在工作中遇到的: 在.net中,有时候需要对Excel文档进行操作,但通常我们并不能真正的正确释放Excel占用的资源. 我们在代码中通常会这样操作Exce ...

最新文章

  1. unix系统编程小结(二)------文件和目录
  2. Allegro如何导入导出DXF
  3. 玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数
  4. 前端打印第三方插件_vscode mock服务插件amock教程
  5. 【转】C#Socket编程详解(一)TCP与UDP简介
  6. SharePoint2007安装图文详解四:安装.NET Framework 3.0和SharePoint 2007
  7. oracle集群数据库事务配置,在 .NET中使用Oracle数据库事务-安装配置-Oracle频道-中国IT实验室...
  8. openlayers 初步认识(转)
  9. 记一次网络访问故障排查
  10. java毕设查重,已经毕业的给毕设查重的人一点建议
  11. cad工具箱详细讲解_cad学院派工具箱(cad绘图教程配解析)V20160804 最新版
  12. 计算机专业的梦想作文,我的梦想作文300字(通用15篇)
  13. 模拟飞机票订票系统设计心得
  14. 微软自带输入法输入时英文的间距突然变大
  15. InterSystems开发者关系主管Dean:集成FHIR,改变游戏规则
  16. nian shi ti是什么鬼????
  17. SMBIOS介绍(1):概述
  18. python安装好了怎么弄到桌面上_小白如何安装Python?分分钟搞定!
  19. 在运行时使用 UDDI,第一部分(UDDI 技术文章)
  20. nb-lot plc python_基于NB-LOT实现.....

热门文章

  1. django配置mysql
  2. pat 1074. 宇宙无敌加法器(20)
  3. ROS入门(八) make_plan的Server连接
  4. Pyspark访问Hbase
  5. 砂.随笔.九.12.14公司停电,冒雨修爪爪
  6. KEIL MDK access violation at 0x40021000 : no ‘read‘ permission的一种解决方法
  7. 【报告分享】2021年微信视频号半年度生态趋势调查报告.pdf(附下载链接)
  8. 一文梳理序列化推荐算法模型进展
  9. 【白皮书分享】工业互联网人才白皮书(2020).pdf(附下载链接)
  10. leetcode力扣64. 最小路径和