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

2022-09-03 04:26:36

在 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 设置,如下所示:

HttpClients.custom()
    .setDefaultRequestConfig(config);

答案 2

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

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


推荐