如何解决了解Apache HTTP客户端中由PoolingHttpClientConnectionManager管理的连接的生命周期
阅读了Apache HTTP组件模块的Connection Management文档后,我感到非常困惑,并且还有一些其他有关连接保持活动策略和连接逐出策略的资源。
其中使用了很多形容词来描述连接状态,例如stale
,idle
,available
,expired
和closed
等没有生命周期图来描述连接在这些状态之间如何变化。
我的困惑主要来自以下情况。
我设置了一个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。
自从达到保持活动超时后,它是否应该为零? PoolStats Java doc指出Available
是“空闲持久连接数”。空闲的持久连接是否被认为是活动的?
我认为Apache HttpClient: How to auto close connections by server's keep-alive time很受欢迎,但希望某些专家能对PoolingHttpClientConnectionManager
管理的连接的生命周期给出深刻的解释。
其他一些常见问题:
-
HttpAsyncClients.createdDefault()
中使用的默认连接管理器是否自行处理连接保持活动策略和连接逐出? - 哪些要求/限制可能要求自定义实现?他们会互相矛盾吗?
解决方法
记录我的一些进一步发现,这些发现可能部分可以作为答案。
-
无论是否使用
ConnectionKeepAliveStrategy
设置保持活动会话的超时,通过ESTABLISHED
检查到的连接都将以netstat -apt
的TCP状态结束。而且我观察到它们在我的Linux测试环境中大约5分钟后会自动回收。 -
如果不使用
ConnectionKeepAliveStrategy
,则在第二次请求批处理时,已建立的连接将被重用。 -
使用
ConnectionKeepAliveStrategy
并且尚未达到其超时时,在第二次请求批处理时,已建立的连接将被重用。 -
当使用
ConnectionKeepAliveStrategy
且超过其超时时,在第二批请求时,已建立的连接将被回收为TIME_WAIT
状态,表明客户端已决定关闭连接。 -
可以通过在单独的连接退出线程中执行
connectionManager.closeExpiredConnections();
来积极地执行此回收,这将导致连接进入TIME_WAIT
阶段。
我认为一般的观察是,连接池统计将ESTABLISHED
个连接视为Available
,并且连接超时策略保持超时的确会使连接失效,但是只需要花费在处理新请求时,或者在我们特别指示连接管理器关闭过期的连接时,就会生效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。