在具有 PoolingHttpClientConnectionManager 的 Apache HttpClient 中,保持活动策略是否会更改活动连接在从连接池中删除之前保持活动状态的时间?或者它只会关闭空闲连接?
例如,如果我将 Keep-Alive 策略设置为每个请求返回 5 秒,并且我使用相同的连接每 2 秒点击一次单个 URL/路由,我的 keep-alive 策略是否会导致该连接离开水池?或者它会留在池中,因为连接不空闲?
我刚刚对此进行了测试并确认 Keep-Alive 策略只会在 Keep-Alive 持续时间过去后从 HttpClient 的连接池中删除空闲连接。 Keep-Alive 持续时间决定了连接是否空闲,事实上 - 如果 Keep-alive 策略规定让连接保持活动状态 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;
};
}
当我将 keepAliveDuration 设置为 10 时,在更改 DNS 后,我连续发送成功的请求,持续了大约一个小时。直到我关闭负载测试并等待 10 秒后,我们才收到新的连接。这意味着 ConnectionKeepAliveStrategy 在服务器最后一次成功响应后 10 秒
从 HttpClient 的连接池中删除了连接。 结论
如果您像我一样设置 ConnectionKeepAliveStrategy,那么
它将向服务器的响应添加一个 Keep-Alive 标头。在 HttpClient 响应上包含 Keep-Alive 标头将导致连接在 Keep-Alive 持续时间过后(在服务器最后一次成功响应之后)离开连接池。这意味着只有空闲连接才会受到 Keep-Alive 持续时间的影响,“空闲连接”是指自 Keep-Alive 持续时间过去后尚未使用的连接。