2016-06-16 24 views
6

我正在使用Apache RequestConfig在我的HttpClient上配置一些超時。如果我不使用自定義連接管理器,我還應該在Apache HttpClient上設置ConnectionRequestTimeout嗎?

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上設置連接管理器(請參見注釋行)。

回答

4

connectionRequestTimeout發生在你有一個連接池並且它們都很忙時,不允許連接管理器給你一個連接來發出請求。

所以,回答你的問題:

這有什麼意義調用setConnectionRequestTimeout(超時) 即使我沒有自定義連接管理器/池設置?

是YES。

這是因爲default implementation有一個內部連接池。 所以,是的,指定連接請求超時是有意義的。其實這是一個很好的安全做法。

5

Isuru的回答基本正確。默認連接管理器是PoolingHttpClientConnectionManager
但是,默認情況下,它的池中只有一個連接。 如果您在同一線程中同步使用HttpClient,則永遠不會遇到ConnectionRequestTimeout生效的情況。
如果您使用多個線程中的HttpClient,那麼您可能需要設置它,但除此之外,您可能還想增加池大小。
對於單線程httpclient使用它是安全的離開它。

+0

感謝您對Isuru答案的闡述。自從他先回答以後,我會給他賞金。 – Diyarbakir

相關問題