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

问题描述 投票:0回答:1

在具有 PoolingHttpClientConnectionManager 的 Apache HttpClient 中,保持活动策略是否会更改活动连接在从连接池中删除之前保持活动状态的时间?或者它只会关闭空闲连接?

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

java apache-httpclient-4.x
1个回答
14
投票

我刚刚对此进行了测试并确认 Keep-Alive 策略只会在 Keep-Alive 持续时间过去后从 HttpClient 的连接池中删除空闲连接。 Keep-Alive 持续时间决定了连接是否空闲,事实上 - 如果 Keep-alive 策略规定让连接保持活动状态 10 秒,而我们每 2 秒收到服务器的响应,则连接将保持活动状态最后一次成功响应后 10 秒

我运行的测试如下:

  1. 我使用以下 ConnectionKeepAliveStrategy 设置了 Apache HttpClient(使用 PoolingHttpClientConnectionManager):

    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; }; }
    
    
  2. 我在应用程序上创建了一个端点,它使用 HttpClient 向 DNS 后面的 URL 发出 GET 请求。

  3. 我编写了一个程序,每 1 秒到达该端点。

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

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

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

从 HttpClient 的连接池中删除了连接。 结论

默认情况下,如果 HttpClient 没有从服务器获得的响应中接收到 Keep-Alive 标头,则它假定其与该服务器的连接可以无限期地保持活动状态,并将将该连接无限期地保留在其 PoolingHttpClientConnectionManager 中。

如果您像我一样设置 ConnectionKeepAliveStrategy,那么

它将向服务器的响应添加一个 Keep-Alive 标头

。在 HttpClient 响应上包含 Keep-Alive 标头将导致连接在 Keep-Alive 持续时间过后(在服务器最后一次成功响应之后)离开连接池。这意味着只有空闲连接才会受到 Keep-Alive 持续时间的影响,“空闲连接”是指自 Keep-Alive 持续时间过去后尚未使用的连接。

© www.soinside.com 2019 - 2024. All rights reserved.