如何修复 Apache Http 客户端中的 ConnectionPoolTimeoutException

How to fix ConnectionPoolTimeoutException in Apache Http Client

在我们的代码中,我们使用 4.5.3 版的 apache http 客户端。 PoolingHttpClientConnectionManager使用如下。

final PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(
                600_000, TimeUnit.MILLISECONDS);

我知道为了修复 ConnectionPoolTimeoutException,我们要么需要调用 EntityUtils.consume(httpEntity),要么在使用 HttpClient 的地方使用 ResponseHandler。然而,在我们的代码库中,同一个 HttpClient 被多处使用。在修复了很多代码使用上面两个中的任何一个后,频率降低了,但我们仍然有时会得到 ConnectionPoolTimeoutException。

是否可以在创建 HttpClientBuilder 时使用 evictExpiredConnections() 或 evictIdleConnections(maxIdleTime) 方法修复此异常?我们可以使用的 maxIdleTime 的理想值是多少 - 超过 connectionTimeToLive?

其中一个代码示例如下。

final HttpResponse resp ;
        try
        {
            resp = client.execute(request);
        }
        catch (IOException e)
        {
            logException(e);
            return;
        }

        processResponse(resp);
        return;

我们注意到日志中的 logException 调用和 ConnectionPoolTimeoutException 之间存在关联。换句话说,ConnectionPoolTimeoutException 开始在节点上发生,在该节点上有许多 logException 调用后不久。这段代码有问题吗?

最后,解决方案是在我们遗漏的地方使用 ResponseHandler。这是唯一有效并解决了 ConnectionPoolTimeoutExceptions 的方法。

在企​​业应用程序中,您不能在每次使用后关闭 HttpClient。使用 ResponseHandler 是最佳编码实践。