在 Apache HttpClient 5 上配置超时的最佳方法

问题描述 投票:0回答:1

我试图了解 HttpClient 中各种超时配置之间的区别以及最简单的配置方法。

此代码中显示了各种选项:

RequestConfig requestConfig = RequestConfig.custom()
    .setConnectionRequestTimeout(connectionRequestTimeout, TimeUnit.MILLISECONDS)
    .setResponseTimeout(responseTimeout, TimeUnit.MILLISECONDS)
    .setConnectTimeout(connectTimeout, TimeUnit.MILLISECONDS) // Deprecated - Use {@link ConnectionConfig.Builder#setConnectTimeout(Timeout)}.
    .build();
       
ConnectionConfig connectionConfig = ConnectionConfig.custom()
    .setConnectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
    .setSocketTimeout(socketTimeout, TimeUnit.MILLISECONDS)
    .build();
       
SocketConfig socketConfig = SocketConfig.custom()
    .setSoTimeout(socketTimeout, TimeUnit.MILLISECONDS)
    .build();
       
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = PoolingHttpClientConnectionManagerBuilder.create()
    .setDefaultConnectionConfig(connectionConfig)
    .setDefaultSocketConfig(socketConfig)
    .build();

HttpClient httpClient = HttpClientBuilder.create()
    .setConnectionManager(poolingHttpClientConnectionManager)
    .setDefaultRequestConfig(requestConfig)
    .build();

我目前的理解是这样的:

ConnectionRequestTimeout
是从池中获取连接所需的时间 - 如果在负载下则相关。

ConnectTimeout
是建立连接所需的时间。

但是有什么区别:

RequestConfig.setResponseTimeout()
ConnectionConfig.setSocketTimeout()
SocketConfig.setSoTimeout()

它们似乎都是请求的读取/响应超时。我只需要设置其中一项吗? 从一些有限的测试来看,似乎

ResponseTimeout
覆盖了其他可能暗示这就是我所需要的。

在这种情况下,最好使用

RequestConfig
来设置所有三个,但
ConnectTimeout
已被弃用并移至
ConnectionConfig
,其中也包含
SocketTimeout

我将其与 SpringBoot 3 / Spring 6 一起使用,最近删除了

readTimeout
上的
HttpComponentsClientHttpRequestFactory
配置选项似乎意味着最好直接在 HttpClient 上进行设置。

java spring apache-httpcomponents apache-httpclient-5.x
1个回答
0
投票

在您的情况下,在 RequestConfig 中设置 ResponseTimeout 通常可以满足您管理请求等待响应时间的需求,从而更容易配置和理解。这是简化事情的建议方法:

  1. 在中设置 ConnectTimeout 和 SocketTimeout(如果需要) ConnectionConfig,因为 ConnectTimeout 在 请求配置。
  2. 在RequestConfig中设置ResponseTimeout来控制整体 请求响应超时。
  3. 如果您发现仅 ResponseTimeout 就足够了,您可能不会 需要 SocketTimeout 或 SoTimeout。

这是一个简化的配置:

 RequestConfig requestConfig = RequestConfig.custom()
    .setConnectionRequestTimeout(connectionRequestTimeout, TimeUnit.MILLISECONDS)
    .setResponseTimeout(responseTimeout, TimeUnit.MILLISECONDS)
    .build();

ConnectionConfig connectionConfig = ConnectionConfig.custom()
    .setConnectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
    .build();

PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = PoolingHttpClientConnectionManagerBuilder.create()
    .setDefaultConnectionConfig(connectionConfig)
    .build();

HttpClient httpClient = HttpClientBuilder.create()
    .setConnectionManager(poolingHttpClientConnectionManager)
    .setDefaultRequestConfig(requestConfig)
    .build();

此方法使配置保持集中和可管理,利用 ResponseTimeout 作为主要超时,同时确保在 ConnectionConfig 中正确配置 ConnectTimeout。此设置应该与 Spring Boot 3 / Spring 6 配合良好,与超时处理方面的最新更新保持一致。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.