鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ httpClient可以復(fù)用嗎?

httpClient可以復(fù)用嗎?

比如這個(gè)util
每次調(diào)用doGet時(shí)生成一個(gè)httpClient 實(shí)例

public static String doGet(String url, Map<String, String> param) {  

    // 創(chuàng)建Httpclient對象  
    CloseableHttpClient httpClient = HttpClients.createDefault();
    

難道不可以在這個(gè)util類中加httpClient的靜態(tài)實(shí)例成員嗎,所有doGET, doPost調(diào)用都用同一個(gè)httpClient的靜態(tài)實(shí)例成員, 如下

    
public class HttpClientUtil { 

    private static CloseableHttpClient httpClient = HttpClients.createDefault();

    public static String doGet(String url, Map<String, String> param) {  
        ....
        response = httpClient.execute(httpGet);   
    
回答
編輯回答
忠妾

HttpClient對象是可以復(fù)用的,而且也推薦復(fù)用,因?yàn)镠ttpClient的連接池是與HttpClient對象綁定的,復(fù)用可以節(jié)約資源。那么請求完成后如何關(guān)閉socket的呢?那就是調(diào)用EntityUtils.consumeQuietly(response.getEntity())來關(guān)閉. 其內(nèi)部原理請參考我的這篇文章:https://segmentfault.com/a/11...

2017年11月21日 05:29
編輯回答
舊螢火

可以共用同一個(gè)客戶端,需要管理好鏈接關(guān)閉網(wǎng)絡(luò)資源回收即可,防止長期使用造成內(nèi)存泄漏

EDITED:

是的,要關(guān)閉response entity和相關(guān)的stream, 同時(shí)在應(yīng)用重新加載時(shí)要關(guān)掉HttpClient, HttpClient關(guān)掉還能不能用取決于ClientConnectionManager的實(shí)現(xiàn), 不關(guān)似乎也沒啥問題, 如果你的應(yīng)用加載都是重戶jvm的話.
其實(shí)你不關(guān), connection也會(huì)超時(shí), 超時(shí)后也要重新建立鏈接. 只是相應(yīng)資源會(huì)長時(shí)間占用而已. 占用多少? 要不要管理,一定是需求+測量再?zèng)Q定.

至于并發(fā)的問題,如果MultiThreadedHttpConnectionManager可以支持多線程并發(fā)的.PoolingHttpClientConnectionManager也是可以的. 看一下類名是否則有@ThreadSafe注解就知道了.

2018年3月18日 15:43
編輯回答
柚稚

如果有 可能有一個(gè)或多個(gè)地方同時(shí)調(diào)用 HttpClientUtil.doGet 這種情況,你就必須用一開始的寫法。


如果你確信你的系統(tǒng)中不會(huì)有任何多線程的情況,那么這樣也有相當(dāng)大的風(fēng)險(xiǎn)。

這里寫錯(cuò)了,寫成異步操作的情況了。

因?yàn)榫W(wǎng)絡(luò)請求是個(gè)很多狀態(tài)摻雜的一件事,即便是在單線程的情況下:

for (int i = 0; i < 10; i++) {
    HttpClientUtil.doGet(String.format("http://www.example.com/list?page=%d", i));
}

這樣的話,兩次循環(huán)之間的時(shí)間間隔可能還不夠第一次調(diào)用 doGet 時(shí)去打開 socket,最顯而易見的問題就是:數(shù)據(jù)會(huì)串甚至是 socket 被不恰當(dāng)?shù)年P(guān)閉乃至某些資源被泄露。


能不能共用客戶端實(shí)例取決于你需不需要多線程。

2017年11月1日 05:40
編輯回答
青黛色

我會(huì)推薦你使用httpclient的包裝類: fluent-api

2017年8月5日 02:09
編輯回答
冷咖啡

是的可以復(fù)用

2017年8月14日 13:55