Apache HttpClient 4.3 - 设置连接空闲超时
Posted
技术标签:
【中文标题】Apache HttpClient 4.3 - 设置连接空闲超时【英文标题】:Apache HttpClient 4.3 - setting connection idle timeout 【发布时间】:2014-01-20 15:08:42 【问题描述】:在 Apache HttpClient 4.3 版本上配置连接空闲超时的最短方法是什么?
我查看了文档,但找不到任何东西。我的目标是将打开的连接减少到服务器高峰后的最低限度。
例如在 Jetty Client 8.x 中,您可以设置 httpClient.setIdleTimeout: http://download.eclipse.org/jetty/stable-8/apidocs/org/eclipse/jetty/client/HttpClient.html#setIdleTimeout(long)
【问题讨论】:
【参考方案1】:超时设置在 RequestConfig 中,因此您可以在调用 HttpClientBuilder 时设置默认值。
例如,假设您的超时变量以秒为单位来创建您的自定义 RequestConfig,您可以执行以下操作:
RequestConfig config = RequestConfig.custom()
.setSocketTimeout(timeout * 1000)
.setConnectTimeout(timeout * 1000)
.build();
然后您可以像这样构建您的 HttpClient 设置默认的 RequestConfig:
HttpClients.custom()
.setDefaultRequestConfig(config);
【讨论】:
这不是我要找的。上面是readTimeout和connectTimeout。我正在尝试找出如何在打开的连接上设置“驱逐”策略。考虑每个地址达到 1000 个连接的峰值。如何指示 Apache 客户端在 X 秒后关闭空闲连接? 在构建 HttpClient 并实现 ConnectionKeepAliveStrategy 接口时,您或许应该查看 setKeepAliveStrategy()。这告诉客户端连接在被重用之前可以空闲多长时间。 这个答案是错误的。 setConnectTimeout 设置连接服务器的超时时间。 setSocketTimeout 设置读取操作期间的超时。 OP 询问空闲超时。【参考方案2】:您不能在 Apache HTTP 客户端的配置中设置空闲连接超时。原因是这样做会产生性能开销。
文档清楚地说明了原因,并提供了一个可以复制的空闲连接监视器实现示例。本质上,这是您运行以定期在HttpClientConnectionManager
上调用closeIdleConnections
的另一个线程
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html
经典阻塞 I/O 模型的主要缺点之一是网络套接字只有在 I/O 操作中阻塞时才能对 I/O 事件做出反应。当连接释放回管理器时,它可以保持活动状态,但是它无法监视套接字的状态并对任何 I/O 事件做出反应。如果连接在服务器端关闭,则客户端连接无法检测到连接状态的变化(并通过关闭其末端的套接字来做出适当的反应)。 HttpClient 尝试通过测试连接是否“陈旧”来缓解问题,该连接不再有效,因为它在使用连接执行 HTTP 请求之前在服务器端关闭。陈旧的连接检查不是 100% 可靠的,并且会为每个请求执行增加 10 到 30 毫秒的开销。对于空闲连接,不涉及每个套接字一个线程模型的唯一可行解决方案是专用监视器线程,用于驱逐由于长时间不活动而被视为过期的连接。监控线程可以定期调用 ClientConnectionManager#closeExpiredConnections() 方法来关闭所有过期的连接,并从池中逐出关闭的连接。它还可以选择性地调用 ClientConnectionManager#closeIdleConnections() 方法来关闭所有在给定时间段内空闲的连接。
【讨论】:
以上是关于Apache HttpClient 4.3 - 设置连接空闲超时的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Apache HttpClient 4.3 处理 Cookie
忽略 Apache HttpClient 4.3 中的 SSL 证书