如何修复 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 是最佳编码实践。
在我们的代码中,我们使用 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 是最佳编码实践。