如何在Java中缓存httpclient对象



在我的客户端Web应用程序中使用Apache HttpClient 4.5.x,该应用程序连接到(并登录到)另一个(比如主)服务器Web应用程序。

这两个网络应用程序之间的关系是多对多的,这意味着对于客户端网络应用程序中的某个用户的请求,它必须以另一个取/设置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实例对象缓存为重对象的最佳实践,如果不是将整个客户端Web应用程序作为静态单例,则应至少对多个请求重用该对象。

具体来说,我希望能就以下哪种方法(如果有的话)构成最佳实践提供建议:

  1. 使用静态ConcurrentHashMap为客户端webapp中的每个"用户"缓存httpclient及其相关的basiccokiestore,并且仅在所包含的缓存cookie接近到期时间时登录。不确定内存使用情况,未使用/很少使用的httpclient会留在内存中而不会被逐出。

  2. 仅缓存Cookie(以某种方式),但只要需要使用该Cookie进行rest调用,就重新创建一个新的httpclient对象。这将保存之前对登录的调用,直到cookie过期,但不会重用htptclient。

  3. PooledConnectionManager-但不容易找到示例,尽管可能需要设计驱逐策略、最大线程数等(因此可能很复杂)。

有更好的方法吗?谢谢

参考文献:

  • http://hc.apache.org/httpclient-3.x/performance.html

通常建议有一个HttpClient实例每个通信组件,甚至每个应用

  • 类似于javahttpclient 4.x的性能指南来解决问题

使用并发哈希映射将是实现您想要做的事情的最简单方法

此外,如果您使用的是Spring,您可能希望创建一个用于容纳HTTP客户端的bean。

为什么要这么做?可以通过使用本地CCD_ 2在每个请求的基础上分配不同的CCD_。

如果需要,可以为每个唯一用户维护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();
}

最新更新