在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

httpClient可以復用嗎?

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

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

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

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

    
public class HttpClientUtil { 

    private static CloseableHttpClient httpClient = HttpClients.createDefault();

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

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

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

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

EDITED:

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

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

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

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


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

這里寫錯了,寫成異步操作的情況了。

因為網(wǎng)絡請求是個很多狀態(tài)摻雜的一件事,即便是在單線程的情況下:

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

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


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

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

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

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

是的可以復用

2017年8月14日 13:55