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

时间:2016-06-16 11:03:38

标签: java timeout apache-httpclient-4.x

我正在使用Apache RequestConfigHttpClient上配置一些超时。

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)用于设置等待连接管理器/池连接的时间。

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

2 个答案:

答案 0 :(得分:8)

当你有一个连接池并且它们都忙时,

connectionRequestTimeout会发生,不允许连接管理器为你提供连接来发出请求。

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

  

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

是。

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

答案 1 :(得分:6)

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