2016-06-16 5 views
6

HttpClientにタイムアウトを設定するのにApache RequestConfigを使用しています。カスタム接続マネージャを使用しないと、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

いすゞの答えはほぼ正しいです。デフォルトの接続マネージャーはPoolingHttpClientConnectionManagerです。
しかし、デフォルトではプールには1つの接続しかありません。 HttpClientを同じスレッドから同期して使用している場合、ConnectionRequestTimeoutが有効になる状況は決してありません。
複数のスレッドからHttpClientを使用している場合は、それを設定したいかもしれませんが、とりわけプールのサイズを増やすことをお勧めします。
シングルスレッドのhttpclientを使用する場合は、そのまま使用してください。

+0

いすゞの答えに精緻化してくれてありがとう。彼が最初に答えたので、私は彼に恩恵を与えるでしょう。 – Diyarbakir

関連する問題