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

Java Apache HttpClient 4.3-设置连接空闲超时,java,apache,httpclient,Java,Apache,Httpclient,在Apache HttpClient 4.3版本上配置连接空闲超时的最短方法是什么 我查阅了文档,什么也找不到。我的目标是将开放连接减少到最小的服务器后峰值 例如,在Jetty Client 8.x中,您可以设置httpClient.setIdleTimeout:超时在RequestConfig中设置,以便在调用HttpClientBuilder时设置默认值 例如,假设超时变量以秒为单位创建自定义RequestConfig,可以执行以下操作: RequestConfig config = Req

在Apache HttpClient 4.3版本上配置连接空闲超时的最短方法是什么

我查阅了文档,什么也找不到。我的目标是将开放连接减少到最小的服务器后峰值


例如,在Jetty Client 8.x中,您可以设置httpClient.setIdleTimeout:

超时在RequestConfig中设置,以便在调用HttpClientBuilder时设置默认值

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

RequestConfig config = RequestConfig.custom()
    .setSocketTimeout(timeout * 1000)
    .setConnectTimeout(timeout * 1000)
    .build();
然后,您可以构建HttpClient,设置默认的RequestConfig,如下所示:

HttpClients.custom()
    .setDefaultRequestConfig(config);

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

文档清楚地说明了原因,并给出了可以复制的空闲连接监视器实现的示例。本质上,这是另一个线程,您可以运行它定期调用
HttpClientConnectionManager上的
closeIdleConnections

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


那不是我要找的。上面是readTimeout和connectTimeout。我正在尝试了解如何对打开的连接设置“驱逐”策略。考虑每个地址达到1000个连接的峰值。如何指示Apache客户端在X秒后关闭空闲连接?在构建HttpClient并实现ConnectionKeepAliveStrategy接口时,您可能应该查看setKeepAliveStrategy()。这会告诉客户端连接在被重用之前可以空闲多长时间。这个答案是错误的。setConnectTimeout设置连接到服务器的超时。setSocketTimeout设置读取操作期间的超时。OP询问空闲超时。