2017-04-17 61 views
3

我在一個servlet中使用HttpClient來調用一個資源,我經過一些操作後返回servlet響應。正確使用Apache HttpClient以及何時關閉它。

我的HttpClient使用PoolingHttpClientConnectionManager。

創建客戶端,像這樣:

private CloseableHttpClient getConfiguredHttpClient(){ 
    return HttpClientBuilder 
     .create() 
     .setDefaultRequestConfig(config) 
     .setConnectionReuseStrategy(NoConnectionReuseStrategy.INSTANCE) 
     .setConnectionManagerShared(true) 
     .setConnectionManager(connManager) 
     .build(); 
} 

我用servlet的服務方法中的嘗試資源中此客戶端,所以它是自動關閉。要停止關閉連接管理器,我將setConnectionManagerShared設置爲true。

我看過其他不關閉HttpClient的代碼示例。我應該不是關閉這個資源嗎?

感謝

回答

1

你不定義明確地關閉HttpClient的,但是,(你可能已經在做,但是值得一提的),你應該保證連接方法執行後釋放。

編輯:HttpClient中的ClientConnectionManager將負責維護連接狀態。

GetMethod httpget = new GetMethod("http://www.url.com/"); 
    try { 
    httpclient.executeMethod(httpget); 
    Reader reader = new InputStreamReader(httpget.getResponseBodyAsStream(), httpget.getResponseCharSet()); 
    // consume the response entity and do something awesome 
    } finally { 
    httpget.releaseConnection(); 
    } 
1

我發現你真的需要關閉資源如文檔中:https://hc.apache.org/httpcomponents-client-ga/quickstart.html

CloseableHttpClient httpclient = HttpClients.createDefault(); 
HttpGet httpGet = new HttpGet("http://targethost/homepage"); 
CloseableHttpResponse response1 = httpclient.execute(httpGet); 

try { 
    System.out.println(response1.getStatusLine()); 
    HttpEntity entity1 = response1.getEntity(); 
    EntityUtils.consume(entity1); 
} finally { 
    response1.close(); 
} 
相關問題