亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Java 中緩存 httpclient 對象?

如何在 Java 中緩存 httpclient 對象?

開心每一天1111 2022-05-25 16:57:47
在我的客戶端 webapp 中使用Apache HttpClient 4.5.x,它連接到(并登錄到)另一個(比如主)服務器 webapp。這兩個 webapps 之間的關系是多對多的——這意味著對于客戶端 webapp 中的某些用戶的請求,它必須以另一個用戶身份登錄 + 在服務器 webapp 中進行休息調用。因此需要對 cookiestore 進行一些分離,并且在創建 httpclient 實例后無法(是否存在?)獲取/設置cookie 存儲,因此客戶端 webapp 中收到的每個請求線程都會執行以下操作(并且需要優化):HttpClient client = HttpClientBuilder.create().setDefaultCookieStore(new BasicCookieStore()).build(); //Now POST to login end point and get back JSESSIONID cookie and then make one REST call, and then the client object goes out of scope when the request ends.我希望詢問將 httpclient 實例對象緩存為重的最佳實踐,并且應該至少為多個請求重用,如果不是將整個客戶端 webapp 作為靜態單例。具體來說,我希望就以下哪些(如果有)方法構成最佳實踐提供建議:使用靜態 ConcurrentHashMap為客戶端 webapp 中的每個“用戶”緩存 httpclient 及其關聯的 basiccookiestore,并且僅在包含的緩存 cookie 接近其到期時間時登錄。不確定內存使用情況,并且未/很少使用的 httpclient 會留在內存中而不會被驅逐。僅緩存 Cookie(以某種方式),但在需要使用該 cookie 進行休息調用時重新創建一個新的 httpclient 對象。這會保存之前的 login 調用,直到 cookie 過期,但不會重用 htptclient。PooledConnectionManager - 但無法輕松找到示例,盡管可能需要設計驅逐策略、最大線程數等(因此可能很復雜)。有沒有更好的方法來做到這一點?謝謝。
查看完整描述

2 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

使用并發哈希映射將是實現您想要做的最簡單的方法。

此外,如果您使用 Spring,您可能需要創建一個 bean 來保存 HTTP 客戶端。


查看完整回答
反對 回復 2022-05-25
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

你為什么要做這一切?CookieStore可以使用 local 為每個請求分配不同的HttpContext.


如果需要,可以維護CookieStore每個唯一用戶的實例映射。


CloseableHttpClient httpclient = HttpClients.createDefault();

CookieStore cookieStore = new BasicCookieStore();


// Create local HTTP context

HttpClientContext localContext = HttpClientContext.create();

// Bind custom cookie store to the local context

localContext.setCookieStore(cookieStore);


HttpGet httpget = new HttpGet("http://httpbin.org/cookies");

System.out.println("Executing request " + httpget.getRequestLine());


// Pass local context as a parameter

CloseableHttpResponse response = httpclient.execute(httpget, localContext);

try {

    System.out.println("----------------------------------------");

    System.out.println(response.getStatusLine());

    List<Cookie> cookies = cookieStore.getCookies();

    for (int i = 0; i < cookies.size(); i++) {

        System.out.println("Local cookie: " + cookies.get(i));

    }

    EntityUtils.consume(response.getEntity());

} finally {

    response.close();

}


查看完整回答
反對 回復 2022-05-25
  • 2 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號