2010-02-18 6 views
19

Ich benutze Apache Httpclient für Ajax-Anrufe auf einer Website. In einigen Fällen schlagen Anforderungen an einen externen Webservice fehl, oft mit:java: apache HttpClient> Wie zu wiederholen versuchen

E/A-Ausnahme (java.net.ConnectException) wird bei der Verarbeitung der Anforderung abgefangen: Verbindung ist abgelaufen: connect.

In diesem Fall möchte ich häufig die Anfrage erneut versuchen (etwas, das Httpclient automatisch zu tun scheint).

Ich kann jedoch keine Methode, Parameter, usw. finden, um das Wiederholen zu überspringen.

jemand?

Dank Geert-Jan

Antwort

29
client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false)); 

Das würde es tun.

+4

heute dies nicht kompilieren und man muss die Dokumentation von jdigital => client.getParams erwähnen() verwenden. SetParameter (HttpMethodParams.RETRY_HANDLER, neue DefaultHttpMethodRetryHandler (0, falsch)); hmmh aber es funktioniert immer noch nicht – Karussell

+1

Es funktioniert nicht für mich. Ich versuchte ((AbstractHttpClient) httpclient) .setHttpRequestRetryHandler (myRetryHandler); und es scheint zu funktionieren! –

+0

funktioniert nicht, vielleicht wegen der Verwendung in PoolingClientConnectionManager? – Nativ

6

Es gibt eine Beschreibung in der HttpClient tutorial.

client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
      new DefaultHttpMethodRetryHandler()); 

Siehe tutorial für weitere Informationen, zum Beispiel das schädlich sein kann, wenn die Anfrage Nebenwirkungen hat (das heißt nicht idempotent).

6

OK. Es gibt ein Problem in der Dokumentation. Auch gab es Änderungen in API und Methoden. Also, wenn Sie DefaultHttpRequestRetryHandler verwenden möchten, hier sind die Möglichkeiten, das zu tun,

DefaultHttpClient httpClient = new DefaultHttpClient(); 
DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(0, false); 
httpClient.setHttpRequestRetryHandler(retryHandler); 

oder

HttpClient httpClient = new DefaultHttpClient(); 
DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(0, false); 
((AbstractHttpClient)httpClient).setHttpRequestRetryHandler(retryHandler); 

In ersten, wir konkrete DefaultHttpClient verwenden (die eine Unterklasse von AbstractHttpClient ist und so hat die setHttpRequestRetryHandler() Methode.)

Im zweiten, wir programmieren auf die HttpClient Schnittstelle (die leider diese Methode nicht aussetzt, und das ist seltsam !! ehh), so müssen wir diese böse Besetzung zu tun.

0

Die Umwandlung in AbstractHttpClient ist nicht erforderlich. Eine andere Möglichkeit besteht darin, eine Strategie mit AutoRetryHttpClient mit DefaultServiceUnavailableRetryStrategy auf 0 für Wiederholungsparameter zu verwenden. Ein besserer Weg wäre, den AbstractHttpClient zu erweitern oder HttpClient zu implementieren, um die gewünschte Methode verfügbar zu machen.

22

Von Httpclient 4.3 Verwendung HttpClientBuilder

HttpClientBuilder.create().disableAutomaticRetries().build(); 
Verwandte Themen