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

时间:2014-01-20 15:08:42

标签: java apache httpclient

在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)

2 个答案:

答案 0 :(得分:29)

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

例如,假设您的超时变量以秒为单位来创建自定义RequestConfig,您可以执行以下操作:

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

然后您可以构建您的HttpClient设置默认的RequestConfig,如下所示:

HttpClients.custom()
    .setDefaultRequestConfig(config);

答案 1 :(得分:9)

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

文档清楚地说明了原因,并给出了可以复制的空闲连接监视器实现的示例。从本质上讲,这是您在closeIdleConnections

上定期调用HttpClientConnectionManager时运行的另一个主题

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

  

经典阻塞I / O模型的一个主要缺点是网络套接字只有在I / O操作中被阻止时才能对I / O事件作出反应。当连接释放回管理器时,它可以保持活动状态,但它无法监视套接字的状态并对任何I / O事件做出反应。如果连接在服务器端关闭,则客户端连接无法检测连接状态的变化(并通过关闭其端部的套接字来做出适当的反应)。   HttpClient尝试通过测试连接是否已失效来解决问题,因为在使用连接执行HTTP请求之前,它已在服务器端关闭,因此不再有效。过时的连接检查不是100%可靠,并且每次请求执行都会增加10到30 ms的开销。唯一可行的解​​决方案是,每个套接字模型不涉及空闲连接的一个线程是一个专用的监视器线程,用于驱逐由于长时间不活动而被视为过期的连接。监视器线程可以定期调用ClientConnectionManager#closeExpiredConnections()方法来关闭所有过期的连接并从池中驱逐关闭的连接。它还可以选择调用ClientConnectionManager#closeIdleConnections()方法来关闭在给定时间段内空闲的所有连接。