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

针对活动连接的Apache HttpClient保持活动策略

施飞鸿
2023-03-14

在带有PoolingHttpClientConnectionManager的Apache HttpClient中,Keep-Alive策略是否会更改活动连接在从连接池中删除之前保持活动状态的时间量?还是只会关闭空闲连接?

例如,如果我将Keep Alive策略设置为每个请求返回5秒,并且我使用相同的连接每2秒点击一次URL/路由,那么Keep Alive策略是否会导致该连接离开池?或者它会留在池中,因为连接不是空闲的?

共有1个答案

咸晨
2023-03-14

我刚刚对此进行了测试,并确认Keep-Alive策略只会在Keep-Alive持续时间过后空闲HttpClient连接池中的连接。保持活动的持续时间决定了连接是否空闲,事实上——如果保持活动策略说保持连接活动10秒,并且我们每2秒收到服务器的响应,那么在最后一次成功响应之后,连接将保持活动10秒。

我进行的测试如下:

>

    return (httpResponse, httpContext) -> {
        // Honor 'keep-alive' header
        HeaderElementIterator it = new BasicHeaderElementIterator(
                httpResponse.headerIterator(HTTP.CONN_KEEP_ALIVE));
        while (it.hasNext()) {
            HeaderElement he = it.nextElement();
            String param = he.getName();
            String value = he.getValue();
            if (value != null && param.equalsIgnoreCase("timeout")) {
                try {
                    return Long.parseLong(value) * 1000;
                } catch(NumberFormatException ignore) {
                }
            }
        }
        if (keepAliveDuration <= 0) {
            return -1; // the connection will stay alive indefinitely.
        }
        return keepAliveDuration * 1000;
    };
}

我在我的应用程序上创建了一个endpoint,它使用HttpClient向DNS后面的URL发出GET请求。

我写了一个程序,每1秒点击一次endpoint。

我将HttpClient向其发送GET请求的地址的本地DNS更改为指向一个不会响应请求的虚拟URL。(这是通过更改我的/etc/hosts文件完成的)。

当我将keepAliveDuration设置为-1秒时,即使在将DNS更改为指向虚拟URL之后,HttpClient也会继续向旧IP地址发送请求,尽管DNS发生了更改。我让这个测试运行了1个小时,它继续向与过时的DNS相关联的旧IP地址发送请求。这将无限期地发生,因为我的ConnectionKeepAlivestStrategy已配置为无限期地保持与旧URL的连接。

在我更改DNS后,当我将保持AliveDuration设置为10时,我连续发送成功的请求,持续了大约一个小时。直到我关闭负载测试并等待10秒直到我们收到一个新连接。这意味着ConnectionKeepAliveStrategy在服务器最后一次成功响应后10秒从HttpClient的连接池中删除了连接。

默认情况下,如果HttpClient没有从它从服务器收到的响应中收到Keep Alive头,它会假定它与该服务器的连接可以无限期保持活动,并且会无限期地将该连接保持在它的PoolighttpClientConnectionManager中。

如果您像我一样设置了ConnectionKeepAliveStrategy,那么它会在服务器的响应中添加一个Keep Alive头。在HttpClient响应上有一个Keep-Alive头将导致连接在Keep-Alive持续时间结束后,即服务器最后一次成功响应后离开连接池。这意味着只有空闲连接受保持活动持续时间的影响,“空闲连接”是自保持活动持续时间过去后未使用的连接。

 类似资料:
  • 我正在创建一个客户端服务器应用程序。服务器已经设计好,等待从客户端连接。现在在客户机部分中,我希望在应用程序的整个生命周期中保持连接活动,并且只有当主客户机应用程序关闭或关闭或者服务器关闭它时,连接才会关闭。 在处理程序中我有:

  • 我使用okhttp3和retrofit2来获取json文件。我尝试了所有方法来使用keep-Alive连接来使数据下载更快,但似乎没有任何效果。 我已经实现了拦截器,并添加了keep-alive头。但它似乎就是不想工作。有人能看看我的代码,告诉我我在这里做错了什么吗?这是我的代码: 我想在这里补充的一点是,我使用Glide从服务器加载图像,Glide似乎使用Keep-Alive设置安静很好,因为G

  • 问题内容: 我正在使用POST方法。我需要创建一次,并且应该使用Keep Alive Connection。但是我认为,它每次都会建立一个新的连接。 因此,我需要使用 保持活动 连接。 这是我的代码段,很多帮助将不胜感激。 而且logcat日志是: 问题答案: 10:07:29.746:D / org.apache.http.headers(1529):>>连接:保持活动 您正在要求保持活动状态。

  • 所以HTTP。1版本及以上版本支持持久性连接。 现在,我们正在创建一个Rest应用程序,它应该是无状态的。我们一次限制连接的数量。 但如果我仔细阅读HTTP1.0文档,这种方法似乎有问题。 它说服务器将保持连接打开,除非客户端说关闭。 所以,我的问题是如果客户端没有关闭怎么办?如果连接始终处于活动状态,它可能会给我拒绝服务错误。 什么是jetty的默认超时,我如何配置它?我无法找到合适的留档。

  • 我有一个Android应用程序,即时通讯是其中一个关键功能。为了实现IM特性,我们使用基于的推送服务器。 编辑:我曾建议使用前台服务,但下午不喜欢通知托盘总是显示在状态栏,他希望保持干净。 任何建议都将不胜感激!

  • Flask-SocketIO同样支持连接和断开的活动。接下来的例子将会展示怎样为他们注册一个处理函数: @socketio.on('connect', namespace='/chat') def test_connect(): emit('my response', {'data': 'Connected'}) @socketio.on('disconnected', namespace