java - CloseableHttpClient (Apache HTTPComponents) 的意外行为
问题描述
我将 CloseableHttpClient 与 PoolingHttpClientConnectionManager 一起使用。我正在使用此客户端向单个 URL 发出 POST 请求。PoolingHttpClientConnectionManager 设置为 3 个连接的“最大总数”,TTL 设置为 5 秒,连接/套接字超时 5 秒。这是我看到的(请注意,请求是按顺序而不是同时发出的):
POST 请求 #1:连接池中有 1 个连接 POST 请求 #2:连接池中有 2 个连接 POST 请求 #3:连接池中有 3 个连接 POST 请求 #4:关闭最后使用的连接,创建新连接
我不确定为什么最后使用的连接被关闭,并使用第四个请求建立新连接。为什么连接管理器不重用现有的连接?
这是我在日志中看到的内容:2020-05-20 22:34:12 DEBUG oahicPoolingHttpClientConnectionManager - 连接请求:[route: {s}-> https://xxxxx.com:443][total keep alive: 2; 总分配:2 of 3] 2020-05-20 22:34:12 调试 oahicLoggingManagedHttpClientConnection - http-outgoing-3:关闭连接
我将其追溯到 HttpComponent 的 AbstractConnPool.java (httpcore-4.4.4.jar) 文件(函数 getPoolEntryBlocking)中的以下代码:
int maxPerRoute = this.getMax(route);
int excess = Math.max(0, pool.getAllocatedCount() + 1 - maxPerRoute);
int totalUsed;
if (excess > 0) {
for(totalUsed = 0; totalUsed < excess; ++totalUsed) {
E lastUsed = pool.getLastUsed();
if (lastUsed == null) {
break;
}
lastUsed.close();
this.available.remove(lastUsed);
pool.remove(lastUsed);
}
}
有人可以解释为什么它需要关闭连接(lastUsed.close())吗?
解决方案
推荐阅读
- sql-server - SQL Server 2016 始终加密。我可以将始终加密用于数据仓库吗?如果没有,那么我有什么选择?
- excel - 电子表格公式导致工作簿变慢
- ruby - bash 中的正则表达式返回与 ruby 不同的结果
- javascript - xterm.js - 获取当前行文本
- php - 在 PHP 中使用 sqlsrv 防止 SQL 注入
- node.js - 如何将 fetch 转换为 axios
- javascript - 如何禁用特定元素的上下文菜单?
- windows - 将文件从一个目录分组到另一个目录,文件名中具有特定模式
- java - JavaFX ScrollPane 不符合其约束
- javascript - Chrome 和 Firefox 中奇怪的控制台输出