如果我不使用自定义连接管理器,是否仍应在 Apache HttpClient 上设置 ConnectionRequestTimeout?

Should I still set ConnectionRequestTimeout on Apache HttpClient if I don't use a custom connection manager?

我正在使用 Apache RequestConfig 在我的 HttpClient 上配置一些超时。

RequestConfig config = RequestConfig.custom()
        .setConnectTimeout(timeout)
        .setSocketTimeout(timeout)
        .setConnectionRequestTimeout(timeout) // Can I leave this out..
        .build();

CloseableHttpClient httpClient = HttpClients.custom()
        //.setConnectionManager(connectionManager) // ..if I don't use this
        .setDefaultRequestConfig(config)
        .build();

即使我没有设置自定义连接管理器/连接池,调用 setConnectionRequestTimeout(timeout) 是否有意义?

据我了解,setConnectionRequestTimeout(timeout)用于设置从连接manager/pool.

等待连接的时间

请注意,我没有在 httpClient 上设置连接管理器(请参阅注释行)。

connectionRequestTimeout 当您有一个连接池并且它们都很忙,不允许连接管理器给您一个连接来发出请求时,就会发生这种情况。

那么,您的问题的答案是:

Does it make any sense to call setConnectionRequestTimeout(timeout) even I don't have a custom Connection Manager / Pool set up?

是。

这是因为 default implementation 有一个内部连接池。 所以,是的,指定连接请求超时是有意义的。实际上这是一个很好的、安全的做法。

Isuru 的回答基本正确。默认连接管理器是 PoolingHttpClientConnectionManager.
但是,默认情况下它的池中只有一个连接。 如果您在同一个线程中同步使用 HttpClient,您永远不会遇到 ConnectionRequestTimeout 生效的情况。
如果您在多个线程中使用 HttpClient,那么您可能想要设置它,但您可能还想增加池大小等。
对于单线程 httpclient 使用,将其保留是安全的。