HttpClient 如何正确的释放资源
HttpClient 需要关闭的资源
使用HttpClient 访问会涉及到三个层次的资源, 从上往下依次是:
- HttpClient 类型的对象。这是Http 呼叫的客户端。
- Http的请求的对象,一般是HttpGet 或者HttpPost, 这个代码了一个Http的链接请求。
- 从目标地址获取的响应流 HttpResponse,某些状况下响应的结果是以流的形式返回,使用完成最好是关闭流。
HttpClient 资源关闭的方式
资源的初始化的顺序是 HttpClient > Http请求 > 响应流, 在释放时以从下往上的顺序释放, 依次是: 关闭响应流 > 关闭Http请求 > 关闭HttpClient 。
这三种类型的资源释放的方式分别是:
- HttpClient 使用 close() 方法
- Http请求 使用 close() 方法
- 响应流可以使用Stream 的close() 方法关闭, HttpClient 也提供了EntityUtils.consume()方法用来关闭响应流。
Java 处理资源释放的语法
- 在早期的Java 语法中, 主要在 try finally 语法中释放资源
- 在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 如何正确的释放资源相关推荐
- HttpClient的释放资源到底在释放什么?如何正确的释放资源?
ApacheHttpClient github地址:https://github.com/apache/httpcomponents-client/tree/4.5.x ApacheHttpClien ...
- C#如何正确的释放资源
此标题可以为".NET 框架如何正确的释放资源".参考:https://www.cnblogs.com/fdyang/p/3456258.html 托管的内存资源,这是不需要我们操 ...
- 通过FD耗尽实验谈谈使用HttpClient的正确姿势
一段问题代码实验 在进行网络编程时,正确关闭资源是一件很重要的事.在高并发场景下,未正常关闭的资源数逐渐积累会导致系统资源耗尽,影响系统整体服务能力,但是这件重要的事情往往又容易被忽视.我们进行一个简 ...
- Lind.DDD.Utils.HttpHelper关于对HttpClient的正确使用
回到目录 官方的不一定是对的,机器最能证明一切 不知道从什么时候起,我们在写数据库连接,网络连接,文件操作时会习惯加上using,这种习惯被我们误称为一种模式,但事实上,一切事情都有因有果的,使用us ...
- java httpclient cdn_通过FD耗尽实验谈谈使用HttpClient的正确姿势
一段问题代码实验 在进行网络编程时,正确关闭资源是一件很重要的事.在高并发场景下,未正常关闭的资源数逐渐积累会导致系统资源耗尽,影响系统整体服务能力,但是这件重要的事情往往又容易被忽视.我们进行一个简 ...
- .net core HttpClient 使用之掉坑解析(一)
一.前言 在我们开发当中经常需要向特定URL地址发送Http请求操作,在.net core 中对httpClient使用不当会造成灾难性的问题,这篇文章主要来分享.net core中通过IHttpCl ...
- JAVA——保持cookie登录状态的HttpClient封装工具类
在日常开发中,我们经常需要通过http协议去调用网络内容,虽然java自身提供了net相关工具包,但是其灵活性和功能总是不如人意,于是有人专门搞出一个httpclient类库,来方便进行Http操作. ...
- .NET HttpClient的缺陷和文档错误让开发人员倍感沮丧
设计错误.缺陷及文档错误等导致正确使用.NET HttpClient变得出奇地困难.所以,即使是生产环境中看似运行正常的应用程序,在负荷不满的情况下,也遭受着性能问题和运行时故障. 来自ASP.NET ...
- .Net操作Excel后彻底释放资源
.Net操作Excel后彻底释放资源 和同事在工作中遇到的: 在.net中,有时候需要对Excel文档进行操作,但通常我们并不能真正的正确释放Excel占用的资源. 我们在代码中通常会这样操作Exce ...
最新文章
- unix系统编程小结(二)------文件和目录
- Allegro如何导入导出DXF
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数
- 前端打印第三方插件_vscode mock服务插件amock教程
- 【转】C#Socket编程详解(一)TCP与UDP简介
- SharePoint2007安装图文详解四:安装.NET Framework 3.0和SharePoint 2007
- oracle集群数据库事务配置,在 .NET中使用Oracle数据库事务-安装配置-Oracle频道-中国IT实验室...
- openlayers 初步认识(转)
- 记一次网络访问故障排查
- java毕设查重,已经毕业的给毕设查重的人一点建议
- cad工具箱详细讲解_cad学院派工具箱(cad绘图教程配解析)V20160804 最新版
- 计算机专业的梦想作文,我的梦想作文300字(通用15篇)
- 模拟飞机票订票系统设计心得
- 微软自带输入法输入时英文的间距突然变大
- InterSystems开发者关系主管Dean:集成FHIR,改变游戏规则
- nian shi ti是什么鬼????
- SMBIOS介绍(1):概述
- python安装好了怎么弄到桌面上_小白如何安装Python?分分钟搞定!
- 在运行时使用 UDDI,第一部分(UDDI 技术文章)
- nb-lot plc python_基于NB-LOT实现.....
热门文章
- django配置mysql
- pat 1074. 宇宙无敌加法器(20)
- ROS入门(八) make_plan的Server连接
- Pyspark访问Hbase
- 砂.随笔.九.12.14公司停电,冒雨修爪爪
- KEIL MDK access violation at 0x40021000 : no ‘read‘ permission的一种解决方法
- 【报告分享】2021年微信视频号半年度生态趋势调查报告.pdf(附下载链接)
- 一文梳理序列化推荐算法模型进展
- 【白皮书分享】工业互联网人才白皮书(2020).pdf(附下载链接)
- leetcode力扣64. 最小路径和