我正在使用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)
用于设置等待连接管理器/池连接的时间。
请注意,我没有在httpClient
上设置连接管理器(请参阅注释行)。
答案 0 :(得分:8)
connectionRequestTimeout
会发生,不允许连接管理器为你提供连接来发出请求。
那么,你的问题的答案是:
调用setConnectionRequestTimeout(timeout)是否有意义? 即使我没有设置自定义连接管理器/池?
是。
这是因为default implementation有一个内部连接池。 所以,是的,指定连接请求超时是有意义的。实际上这是一种安全的好方法。
答案 1 :(得分:6)
Isuru的回答大多是正确的。默认连接管理器为PoolingHttpClientConnectionManager
但是,默认情况下,它的池中只有一个连接。
如果您在同一个帖子中同步使用HttpClient
,则永远不会遇到ConnectionRequestTimeout
生效的情况。
如果您使用来自多个线程的HttpClient
,那么您可能想要设置它,但您可能还想增加池大小等。
对于单线程httpclient使用,可以安全地将其删除。