当前位置: 首页 > 知识库问答 >
问题:

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

融唯
2023-03-14

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

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

例如,在Jetty客户端8. x中,您可以设置httpClient.setIdleTimeout:http://download.eclipse.org/jetty/stable-8/apidocs/org/eclipse/jetty/client/HttpClient.html#setIdleTimeout(长)

共有2个答案

洪河
2023-03-14

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

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

http://HC . Apache . org/http components-client-ga/tutorial/html/connmgmt . html

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

尉迟高澹
2023-03-14

超时是在请求配置中设置的,因此您可以在调用HttpClientBuilder时设置默认值。

例如,假设您的超时变量以秒为单位来创建您的自定义RequestConfig,您可以这样做:

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

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

HttpClients.custom()
    .setDefaultRequestConfig(config);
 类似资料:
  • 检测空闲连接和超时是为了及时释放资源。常见的方法发送消息用于测试一个不活跃的连接来,通常称为“心跳”,到远端来确定它是否还活着。(一个更激进的方法是简单地断开那些指定的时间间隔的不活跃的连接)。 处理空闲连接是一项常见的任务,Netty 提供了几个 ChannelHandler 实现此目的。表8.4概述。 Table 8.4 ChannelHandlers for idle connections

  • 我正在使用带有连接池的reactor-netty http客户端(0.7.X系列),我想配置池连接的空闲超时,但不知道在哪里。 更准确地说,我需要配置reactor-netty http客户端连接池,使其能够自动关闭在可配置超时内未看到任何活动的连接。这些连接是开放的,但在一段(可配置的)时间内没有传输字节。 如何配置reactory-netty超文本传输协议客户端抢先关闭空闲连接?

  • null 如果我理解正确的话,我们应该在启动时有1个空闲连接,根据负载从0到3,对吗? 正在发生的情况是:启动时1个连接,如果负载较低,最多3个空闲连接,高负载后超过3个空闲连接。然后这些连接不会立即关闭,我们不知道它们何时/是否会关闭(有时它们中的一些会关闭)。 所以问题是:这种行为正常吗? DAO子类的使用示例:

  • 我有两个oracle DB,但我在主数据库中得到“空闲实例,如下所示。

  • 我对HikariCP很陌生,我遇到了一个问题。我有一个使用hikaridaTasource从数据库获取连接的方法: 但是,当我检查pgAdmin(这是一个PostgreSQL db btw)时,我看到它没有使用空闲连接,而是创建了一堆新连接。我怎么才能修好这个? 您可以看到,在第一个图像中有19个连接,其中18个是空闲的。但是,在查询之后,会有一堆新的连接,其中大多数是空闲的。我配置Hikari错

  • 在OkHttp中,我找不到设置硬最大连接池大小的方法。从留档https://square.github.io/okhttp/3.x/okhttp/okhttp3/ConnectionPool.html很明显,您可以设置最大空闲连接,但不能设置整体最大值。这意味着在高负载下,它可以增长超过任何限制。 有没有办法最大化池?如果没有,为什么没有?