我正在使用Apache PoolingHttpClientConnectionManager创建一个连接池。但是,我在日志中看到没有使用现有的空闲连接,而是创建了一个新连接。下面是代码
PoolingHttpClientConnectionManager connManager = connManager = new PoolingHttpClientConnectionManager();
connManager.setMaxTotal(4);
connManager.setDefaultMaxPerRoute(4);
//Creating CloseableHttpClient with a default keep alive of 2 minutes
CloseableHttpClient client = HttpClients.custom()
.setConnectionManager(connManager)
.setKeepAliveStrategy(new KeepAliveStrategy(keepAlive))
.build();
//Sending 1st request
String xml="<xml data>";
HttpPost post = new HttpPost("<URL>");
HttpEntity entity = new ByteArrayEntity(xml.getBytes("UTF-8"));
post.setEntity(entity);
HttpResponse response =client.execute(post);
String result = EntityUtils.toString(response.getEntity());
EntityUtils.consume(response.getEntity());
收到响应后,PoolStats表示可用连接总数为1。
现在我在5秒后再次触发相同的请求,并且在获得响应后,PoolStats指出可用连接的总数为2
以下代码适用于PoolStats
PoolStats stats = connManager.getTotalStats();
System.out.println("Total Connections Available : "+stats.getAvailable());
我的问题是,既然在第一次请求-响应之后,池中已经有一个连接,那么它为什么还要创建一个连接。为什么它不使用现有的conenction?
问题是因为我在这里使用SSL,所以默认情况下不允许SSL上下文共享相同的连接。这就是为什么它为每个请求创建另一个连接。该解决方案创建自定义UserTokenHandler并将其分配给连接管理器。
UserTokenHandler userTokenHandler = new UserTokenHandler() {
@Override
public Object getUserToken(final HttpContext context) {
return context.getAttribute("my-token");
}
};
client = HttpClients.custom()
.setConnectionManager(connManager)
.setUserTokenHandler(userTokenHandler)
.setKeepAliveStrategy(new KeepAliveStrategy(keepAlive))
.build();