当前位置: 首页 > 知识库问答 >
问题:

了解ApacheHTTP客户端中PoolghtTPClientConnectionManager管理的连接的生命周期

易烨磊
2023-03-14

阅读了ApacheHTTP组件模块的连接管理文档,以及关于连接保持活动策略和连接退出策略的其他一些资源后,我感到非常困惑。

其中有很多形容词用来描述连接的状态,比如staleidleavailableexpiredclosed等。没有一个生命周期图来描述连接在这些状态之间的变化。

我的困惑主要来自以下情况。

我通过下面的代码片段设置了一个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秒后(到那时,保持活动超时时间早已超过),我开始了新一批相同的HTTP调用。检查连接管理器池统计数据后,可用连接数仍然是139。

既然达到了保持活动超时,它不应该是零吗?PoolStats Java文档声明,Available是“空闲持久连接的数量”。空闲的持久连接被认为是活动的吗?

我认为Apache HttpClient:如何根据服务器的保持活动时间自动关闭连接是一个非常成功的方法,但希望一些专家能够对PoolighttpClientConnectionManager管理的连接的生命周期给出深刻的解释。

其他一些一般性问题:

  1. HttpAsyncClients.createdDefault()中使用的默认连接管理器是否自行处理连接保持活动策略和连接驱逐?
  2. 在定制的基础上实现它们可能需要哪些要求/限制?它们会相互矛盾吗?

共有1个答案

赵禄
2023-03-14

记录我的一些进一步发现,这些发现可能部分满足作为答案。

>

  • 无论是否使用ConnectionKeepAliveStrategy在保持活动会话上设置超时,连接都将最终处于TCP状态已建立,如通过netstat-apt检查。我观察到它们在我的Linux测试环境中大约5分钟后会自动回收。

    当不使用连接keepalivesttrategy时,在第二批请求时,将重用已建立的连接。

    当使用连接KeepAlivestStrategy且其超时尚未达到时,在第二批请求时,将重用已建立的连接。

    当使用ConnectionKeepAliveStrategy并且其超时已超过时,在第二个请求批次时,已建立的连接将被循环到TIME_WAIT状态,表明客户端已决定关闭连接。

    通过执行connectionManager,可以积极地执行这种循环。closeExpiredConnections() 在一个单独的连接退出线程中,这将导致连接进入TIME\u WAIT阶段。

    我认为一般的观察结果是,已建立的连接被连接池统计数据视为可用的,带有超时的连接保持活动策略确实会使连接过期,但它只在处理新请求时生效,或者当我们特别指示连接管理器关闭过期的连接时生效。

    来自维基百科的TCP状态图供参考。

  •  类似资料:
    • 大家好,我是EJB组件技术的新手,为了准备我的学术讨论会考试,我必须学习这一点。我不确定我能理解生命周期的所有细节。 -客户机对EJB容器的请求(但该请求如何完成?请求的位置我指的是远程“EJB容器外部”还是本地“EJB容器内部”重要与否?) -根据请求,在池中创建一个bean实例并返回给客户机,在从客户机使用后,它再次返回池中(取决于bean类型(?))。 我认为这个场景适合于无状态会话bean

    • 我们有一个Spring项目即将投入生产。目前,该项目正在使用ApacheHTTP客户端。有一种想法是将用作。 我正在四处挖掘,看看使用比使用有什么显著的优势。另外,了解HTTP传输在RestTemplate的实现中做了什么也很有趣。ApacheHTTP客户端已被多个团体使用多年,并享有良好的声誉。 我们是否会冒险转移到? 此外,本博客指出,RestTemplate需要针对生产进行配置,尽管配置是最

    • 本文向大家介绍Android  Activity生命周期和堆栈管理的详解,包括了Android  Activity生命周期和堆栈管理的详解的使用技巧和注意事项,需要的朋友参考一下 Activity的生命周期 Activity是Android中的四大组件之一,也是最基本,最重要的组件,是android系统提供一个可视化的,能与用户交换的组件。 系统提供的组件,不需要用户实例化,用户也不能实例化,是系

    • 我对铁锈寿命的学习过程如下(基于铁锈书): 我想注释,当引用后面的值超出范围时 通常(并不总是!请参阅. data部分,即'静态')值位于块中 我们注释像这样的块,例如结构字段像 。 在哪一点上我的理解是错误的?提前感谢你对我的宽容。 免责声明:

    • 问题内容: 假设我有一个对象,并希望在发出PyQt信号时执行其方法之一。并假设我希望它使用信号未传递的参数来执行此操作。因此,我创建了一个lambda作为信号的插槽: 现在,通常使用PyQt信号和插槽,信号连接不会阻止垃圾收集。当连接的插槽的对象被垃圾回收时,发出相应信号时将不再调用该插槽。 但是,使用lambdas时如何工作?我没有存储对lambda的引用,但是信号插槽连接确实可以正常工作。因此

    • 我读了很多文章来寻找java应用程序的最佳Rest客户机,最后我发现将Jersey与ApacheHTTP客户机4.5结合使用非常好,但在很多文章中,我发现现在改型是最好的(我没有提到Volley,因为在我的例子中,我不需要API支持缓存)。 对于java客户机应用程序,改型是否更好。还是对Android来说更好?为什么我以前没有找到这个比较。。它们无法比较? 我可以比较一下它们的性能、连接池、它们