栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

HttpClient 如何正确的释放资源

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

HttpClient 如何正确的释放资源

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); 。
完整的示例代码如下:

	@Test
	public 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() 释放资源
	@Test
	public 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() 关闭输入流
	@Test
	public 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 资源的方式使用和释放资源。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/694463.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号