2010-02-18 24 views
19

Estoy usando Apache Httpclient para llamadas Ajax en un sitio web. En algunos casos, las solicitudes al servicio web externo fallan, a menudo con:java: apache HttpClient> cómo deshabilitar el reintento

Excepción de E/S (java.net.ConnectException) capturada al procesar la solicitud: Tiempo de espera de conexión agotado: conectar.

En ese caso, la mayoría de las veces, quiero omitir el reintentar la solicitud (algo que Httpclient parece hacer automáticamente).

Sin embargo, no puedo encontrar ningún método, param, etc. para omitir el reintentar.

anyone?

Gracias Geert-Jan

Respuesta

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

Eso lo haría.

+4

hoy en día esto no se compila y uno tiene que usar los documentos mencionan por jdigital => client.getParams(). SetParameter (HttpMethodParams.RETRY_HANDLER, nueva DefaultHttpMethodRetryHandler (0, falso)); hmmh, pero todavía no funciona – Karussell

+1

No funciona para mí. Intenté ((AbstractHttpClient) httpclient) .setHttpRequestRetryHandler (myRetryHandler); ¡Y parece funcionar! –

+0

no funciona, tal vez debido al uso en PoolingClientConnectionManager? – Nativ

6

Hay una descripción en HttpClient tutorial.

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

Véase el tutorial para más información, por ejemplo esto puede ser perjudicial si la solicitud tiene efectos secundarios (es decir, no es idempotente).

6

OK. Hay un problema en la Documentación. También ha habido cambios en API y métodos. Así que si desea utilizar DefaultHttpRequestRetryHandler, aquí están las maneras de hacer eso,

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

En primero, se utiliza DefaultHttpClient hormigón (que es una subclase de AbstractHttpClient y también lo ha hecho el método setHttpRequestRetryHandler())

En el segundo, estamos programando para la interfaz HttpClient (que lamentablemente no expone ese método, y esto es raro !! ehh), así que tenemos que hacer ese reparto desagradable.

0

El elenco de AbstractHttpClient no es necesario. Otra forma es usar una estrategia con AutoRetryHttpClient con DefaultServiceUnavailableRetryStrategy establecido en 0 para el parámetro de reintento. Una mejor manera sería extender el AbstractHttpClient o implementar HttpClient para exponer el método deseado.

22

De httpclient 4.3 Uso HttpClientBuilder

HttpClientBuilder.create().disableAutomaticRetries().build(); 
Cuestiones relacionadas