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

Diy*_*kir 8 java timeout apache-httpclient-4.x

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

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

据我所知,setConnectionRequestTimeout(timeout)用于设置等待连接管理器/池连接的时间.

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

Sam*_*ath 10

connectionRequestTimeout 当你有一个连接池并且它们都忙时,不允许连接管理器给你一个连接来发出请求.

那么,你的问题的答案:

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

是是的.

这是因为默认实现具有内部连接池.所以,是的,指定连接请求超时是有意义的.实际上这是一个很好的,安全的做法.


Mag*_*nus 7

Isuru的回答大多是正确的.默认连接管理器是PoolingHttpClientConnectionManager.
但是,默认情况下,它的池中只有一个连接.如果您HttpClient从同一个线程同步使用您的同步,则永远不会遇到ConnectionRequestTimeout生效的情况.
如果您使用的HttpClient是多个线程,则可能需要设置它,但您可能还希望增加池大小等.
对于单线程httpclient使用,可以安全地将其删除.