2016-06-16 11 views
6

Ich verwende Apache RequestConfig, um einige Timeouts auf meinem HttpClient zu konfigurieren.Sollte ich ConnectionRequestTimeout immer noch auf Apache HttpClient setzen, wenn ich keinen benutzerdefinierten Verbindungsmanager verwende?

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(); 

Macht es einen Sinn zu nennen setConnectionRequestTimeout(timeout) auch ich habe keine benutzerdefinierte Connection Manager/set Pool auf?

Soweit ich es verstehe, setConnectionRequestTimeout(timeout) wird verwendet, um die Zeit einzustellen, die auf eine Verbindung vom Verbindungsmanager/Pool wartet.

Beachten Sie, dass ich keinen Verbindungsmanager auf httpClient einstelle (siehe kommentierte Zeile).

Antwort

4

connectionRequestTimeout passiert, wenn Sie einen Pool von Verbindungen haben und diese alle besetzt sind und es dem Verbindungsmanager nicht erlaubt, Ihnen eine Verbindung zu geben, um die Anfrage zu stellen.

Also, die Antwort auf Ihre Frage:

Macht es Sinn machen setConnectionRequestTimeout (Timeout) zu nennen auch ich habe keine benutzerdefinierte Connection Manager/set Pool auf?

ist JA.

Dies ist, weil die default implementation einen internen Verbindungspool hat. Also, ja, es ist sinnvoll, eine Verbindungsanforderung Timeout anzugeben. Eigentlich ist es eine gute, sichere Übung.

5

Isurus Antwort ist größtenteils korrekt. Der Standardverbindungs-Manager ist ein PoolingHttpClientConnectionManager.
Standardmäßig hat es jedoch nur eine Verbindung im Pool. Wenn Sie Ihre HttpClient synchron aus dem gleichen Thread verwenden, sollten Sie niemals eine Situation finden, in der die ConnectionRequestTimeout wirksam wird.
Wenn Sie die HttpClient aus mehreren Threads verwenden, dann möchten Sie es möglicherweise festlegen, aber Sie möchten wahrscheinlich auch die Poolgröße unter anderem erhöhen.
Für single-threaded httpclient Verwendung ist es sicher, es wegzulassen.

+0

Danke für die Ausarbeitung von Isurus Antwort. Ich werde das Kopfgeld ihm geben, da er zuerst antwortete. – Diyarbakir