2010-02-18 13 views
19

Sto usando Apache Httpclient per le chiamate Ajax su un sito web. In alcuni casi, le richieste al servizio web esterno non riescono, spesso con:java: apache HttpClient> come disabilitare i tentativi

Eccezione I/O (java.net.ConnectException) rilevata durante l'elaborazione della richiesta: Connessione scaduta: connessione.

In tal caso, il più delle volte, voglio saltare riprovare la richiesta (qualcosa che Httpclient sembra fare automaticamente).

Tuttavia, non riesco a trovare alcun metodo, param, ecc. Per saltare il nuovo tentativo.

qualcuno?

Grazie Geert-Jan

risposta

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

che lo farebbe.

+4

oggi questo non compila e si ha la necessità di utilizzare i documenti menzionano per jdigital => client.getParams(). SetParameter (HttpMethodParams.RETRY_HANDLER, nuova DefaultHttpMethodRetryHandler (0, false)); hmmh ma ancora non funziona – Karussell

+1

Non funziona per me. Ho provato ((AbstractHttpClient) httpclient) .setHttpRequestRetryHandler (myRetryHandler); e sembra funzionare! –

+0

non funziona, forse a causa dell'uso in PoolingClientConnectionManager? – Nativ

6

C'è una descrizione nello HttpClient tutorial.

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

Vedere la tutorial per ulteriori informazioni, per esempio puo 'essere dannoso se la richiesta ha effetti collaterali (cioè non è idempotente).

6

OK. C'è un problema nella documentazione. Inoltre ci sono stati cambiamenti in API e metodi. Quindi, se si desidera utilizzare DefaultHttpRequestRetryHandler, qui ci sono i modi per farlo,

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

o

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

In prima, usiamo DefaultHttpClient concreta (che è una sottoclasse di AbstractHttpClient e così ha il metodo setHttpRequestRetryHandler())

In secondo luogo, stiamo programmando l'interfaccia HttpClient (che purtroppo non espone questo metodo, e questo è strano !! ehh), quindi dobbiamo fare quel cast sgradevole.

0

Il cast per AbstractHttpClient non è necessario. Un altro modo è utilizzare una strategia con AutoRetryHttpClient con DefaultServiceUnavailableRetryStrategy impostato su 0 per il parametro retry. Un modo migliore sarebbe estendere AbstractHttpClient o implementare HttpClient per esporre il metodo desiderato.

22

Da httpclient 4.3 uso HttpClientBuilder

HttpClientBuilder.create().disableAutomaticRetries().build(); 
Problemi correlati