首页 > 解决方案 > 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())吗?

标签: javaapache-httpcomponents

解决方案


推荐阅读