Apache HttpClient 4.3 - 设置连接闲置超时时间

17
2个回答

25

超时时间是在RequestConfig中设置的,因此您可以在调用HttpClientBuilder时设置默认值。

例如,假设您的超时变量以秒为单位,要创建自定义的RequestConfig,您可以像这样操作:

RequestConfig config = RequestConfig.custom()
    .setSocketTimeout(timeout * 1000)
    .setConnectTimeout(timeout * 1000)
    .build();

你可以通过以下方式设置默认的RequestConfig来构建HttpClient:

HttpClients.custom()
    .setDefaultRequestConfig(config);

4
这不是我正在寻找的内容。以上是读取超时和连接超时。我正在尝试找出如何在打开的连接上设置“逐出”策略。考虑到峰值,当您达到每个地址1000个连接时,如何指示Apache客户端在X秒后关闭空闲连接? - YaOg
当您构建HttpClient并实现ConnectionKeepAliveStrategy接口时,可以考虑使用setKeepAliveStrategy()。这将告诉客户端在重新使用连接之前连接可以空闲多长时间。 - Brett
7
这个答案是错误的。 setConnectTimeout 设置连接服务器时的超时时间,setSocketTimeout 则设置读取操作的超时时间。原问题询问的是空闲超时时间。 - Dave B

13

在Apache HTTP Client的配置中,无法设置闲置连接超时时间。原因是这样做会有性能开销。

文档清楚地说明了原因,并提供了一个闲置连接监视器的实现示例,您可以复制它。实质上,这是另一个线程,您运行此线程以周期性地调用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()方法来关闭所有已在一定时间内处于闲置状态的连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接