更新: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();