【发布时间】:2021-02-16 22:03:48
【问题描述】:
在阅读了 Apache HTTP 组件模块的Connection Management 文档,以及一些关于连接保持活动策略和连接驱逐策略的其他资源后,我感到非常困惑。
其中使用了一堆形容词来描述连接的状态,例如 stale、idle、available、expired 和 closed 等。没有描述如何使用的生命周期图这些状态之间的联系会发生变化。
我的困惑主要来自以下情况。
我通过下面的代码 sn-p 设置了一个 ConnectionKeepAliveStrategy,它提供了 5 秒的 KeepAliveDuration。
ConnectionKeepAliveStrategy keepAliveStrategy = ( httpResponse, httpContext ) -> {
HeaderElementIterator iterator =
new BasicHeaderElementIterator( httpResponse.headerIterator( HTTP.CONN_KEEP_ALIVE ) );
while ( iterator.hasNext() )
{
HeaderElement header = iterator.nextElement();
if ( header.getValue() != null && header.getName().equalsIgnoreCase( "timeout" ) )
{
return Long.parseLong( header.getValue(), 10) * 1000;
}
}
return 5 * 1000;
};
this.client = HttpAsyncClients.custom()
.setDefaultRequestConfig( requestConfig )
.setMaxConnTotal( 500 )
.setMaxConnPerRoute( 500 )
.setConnectionManager( this.cm )
.setKeepAliveStrategy( keepAliveStrategy )
.build();
我正在与之交谈的服务器确实支持保持连接。当我在一个批处理中异步执行大约 200 个请求后打印出连接管理器的池统计信息时,观察到以下信息。
Total Stats:
-----------------
Available: 139
Leased: 0
Max: 500
Pending: 0
在等待 30 秒后(到那时,keep-alive 超时早已超过),我开始了新一批相同的 HTTP 调用。检查连接管理器池统计信息后,可用连接数仍为 139。
不应该是零,因为已经达到 keep-alive 超时? PoolStats Java doc 声明 Available 是“空闲持久连接的数量”。空闲的持久连接是否被认为是活跃的?
我认为Apache HttpClient: How to auto close connections by server's keep-alive time 很受欢迎,但希望一些专家可以对PoolingHttpClientConnectionManager 管理的连接的生命周期给出有见地的解释。
其他一些一般性问题:
-
HttpAsyncClients.createdDefault()中使用的默认连接管理器是否自行处理连接保持活动策略和连接驱逐? - 在自定义基础上实施它们可能需要哪些要求/限制?他们会互相矛盾吗?
【问题讨论】:
标签: java apache-httpclient-4.x keep-alive httpconnection