我查阅了文档,但未找到相关内容。我的目标是在服务器高峰后将打开的连接数量减少到最低。
例如,在Jetty Client 8.x中,您可以设置httpClient.setIdleTimeout:http://download.eclipse.org/jetty/stable-8/apidocs/org/eclipse/jetty/client/HttpClient.html#setIdleTimeout(long)。
超时时间是在RequestConfig中设置的,因此您可以在调用HttpClientBuilder时设置默认值。
例如,假设您的超时变量以秒为单位,要创建自定义的RequestConfig,您可以像这样操作:
RequestConfig config = RequestConfig.custom()
.setSocketTimeout(timeout * 1000)
.setConnectTimeout(timeout * 1000)
.build();
你可以通过以下方式设置默认的RequestConfig来构建HttpClient:
HttpClients.custom()
.setDefaultRequestConfig(config);
在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()方法来关闭所有已在一定时间内处于闲置状态的连接。