2014-01-20 64 views

回答

29

超时在RequestConfig设置,所以你可以设置默认时HttpClientBuilder被调用。

例如假设您的超时变量是在几秒钟内创建自定义RequestConfig你可以做这样的事情:

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

然后,您可以建立自己的HttpClient设置默认RequestConfig这样的:

HttpClients.custom() 
    .setDefaultRequestConfig(config); 
+1

这不是我要找的。以上是readTimeout和connectTimeout。我正试图找出如何在打开的连接上设置“驱逐”策略。考虑一个峰值,你可以在每个地址达到1000个连接。你如何指示Apache客户端在X秒后关闭空闲连接? – YaOg

+0

您应该在构建HttpClient并实现ConnectionKeepAliveStrategy接口时查看setKeepAliveStrategy()。这告诉客户在重新使用之前连接可以闲置多久。 – Brett

+1

这个答案是错误的。 setConnectTimeout设置连接到服务器的超时时间。 setSocketTimeout在读取操作期间设置超时。 OP在询问空闲超时。 –

8

不能在Apache HTTP Client的配置中设置空闲连接超时。原因是这样做会导致性能开销。

该文档清楚地说明了原因,并给出了可以复制的空闲连接监视器实现的示例。本质上,这是你运行定期调用closeIdleConnectionsHttpClientConnectionManager

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()方法关闭在给定时间段内闲置的所有连接。