1. 程式人生 > >httpclient4.5如何確保資源釋放

httpclient4.5如何確保資源釋放

2018年07月18日更新:releaseConnection()這個方法已經不再推薦了,我用的httpclient4.5的jar包,不需要對request進行這個操作了,看官方文件解釋是更換了連線池管理類,最新的是:PoolingHttpClientConnectionManager。

在請求失敗的時候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);
		}


確保response不會在用到之後才能關閉。

如何消耗相應實體:

String content = null;
		try {
			content = EntityUtils.toString(entity);// 用string接收響應實體
			EntityUtils.consume(entity);// 消耗響應實體
		} catch (ParseException e1) {
			output("解析響應實體異常!", e1);
		} catch (IOException e1) {
			output("java IO 異常!", e1);
		} // 解析響應


這裡插一句,只有你確定響應長度之後才能用這個方法,不然你得關閉各種流,然後呼叫一個consume()方法。或者直接用abort()方法,或者使用官方推薦關閉方法。

推薦消耗實體內容的方式是使用它的HttpEntity#getContent()或HttpEntity#writeTo(OutputStream)方法。

關於釋放連線,這個就比較簡單了,請求完成之後,執行釋放連線的方法就可以了:

request.releaseConnection();

在釋放後可以複用的,之前看到一些方法有些在釋放後是不可以複用的,這個具體得在連線池和連線管理器中再具體介紹了。

最後的最後的,一定要關閉客戶端:

protected static CloseableHttpClient httpClient = getCloseableHttpClients();
//中間做一些事情,最後一定要關閉
	httpClient.close();


宣傳一下QQ群,起於UiAutomator,不止於UiAutomator。