2012-07-18 20 views
19

¿Cuál es el valor de tiempo de espera predeterminado cuando se usa Spring's RestTemplate?RestTemplate: valor de tiempo de espera predeterminado

Por ejemplo, yo estoy invocando un servicio web como esta:

RestTemplate restTemplate = new RestTemplate(); 
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class); 

¿Hay algún valor de tiempo incorporado para RestTemplate? No estoy planeando cambiar el valor del tiempo de espera, sin embargo, quiero asegurarme de que haya un tiempo de espera razonable para cada solicitud.

Gracias.

Respuesta

16

Creo que puede utilizar SimpleClientHttpRequestFactory para el parámetro de tiempo de espera. La instancia de SimpleClientHttpRequestFactory puede establecerse en la plantilla de reposo mediante el método de constructor o instalador.

De forma predeterminada, RestTemplate utiliza SimpleClientHttpRequestFactory, por lo que puede ser que pueda establecer directamente el valor en restTemplate.

+1

gracias. Revisé la documentación de SimpleClientHttpRequestFactory y menciona que "el tiempo de espera predeterminado es el tiempo de espera predeterminado del sistema". Qué significa eso ? –

+1

He examinado el código fuente para SimpleClientHttpRequestFactory El valor predeterminado es -1 para lectura y tiempo de espera de conexión. Creo que por defecto querían decir que como HTTP depende de URLConnection, dependerá de jdk para la configuración de tiempo de espera predeterminado –

+0

El tiempo de espera predeterminado para URLConnection es infinito. ¿Eso significa que RestTemplate también tiene un valor infinito de tiempo de espera? –

12

Una de las buenas características de spring-android RestTemplate es el uso de la implementación apropiada (recomendada por Google) de RequestFactory según la versión del sistema operativo.

Google recomienda utilizar las instalaciones de J2SE sobre el Gingerbread (versión 2.3 ) y la más reciente, mientras que las versiones anteriores deben utilizar el HttpComponents HttpClient. En función de esta recomendación, RestTemplate comprueba la versión de Android en la que se ejecuta la aplicación y utiliza el ClientHttpRequestFactory adecuado.

Así que la respuesta anterior no es completa porque HttpComponentsClientHttpRequestFactory (que se utiliza para la primavera-androide para las versiones del sistema operativo Android 2.3 <) no se tiene en consideración.

Mi solución fue algo como esto:

public class MyRestTemplate extends RestTemplate { 
    public MyRestTemplate() { 
     if (getRequestFactory() instanceof SimpleClientHttpRequestFactory) { 
      Log.d("HTTP", "HttpUrlConnection is used"); 
      ((SimpleClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000); 
      ((SimpleClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000); 
     } else if (getRequestFactory() instanceof HttpComponentsClientHttpRequestFactory) { 
      Log.d("HTTP", "HttpClient is used"); 
      ((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000); 
      ((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000); 
     } 
    } 
} 
+0

¡Gracias por el código! ¿Cómo podemos establecer un mensaje de tiempo de espera para las llamadas restantes?Como quiero mostrar algún mensaje cuando las solicitudes se exceden en el tiempo sin resultado y sin error desde el lado del servidor – DroidBee

+1

cuando realiza la solicitud, tome la excepción SocketTimeoutException, o similar - y muestre su mensaje de tiempo de espera. – agamov

+0

¡Gracias por el comentario! :) Estoy manejando demasiadas llamadas de descanso que estoy combinando en una interfaz ** de RestService usando anotaciones de Android. Todas esas llamadas de reposo arrojan RestClientException. Pero cuando agregué IOException bajo el cual viene SocketTimeoutException, me está pidiendo que lo maneje donde sea que se realicen las demás llamadas. ¿Hay alguna forma de manejar esto sin hacer cambios en cada llamada de descanso? He publicado mi pregunta: aquí: http://stackoverflow.com/q/16542892/1237656 – DroidBee

7

Para responder de manera explícita la cuestión ...

El valor predeterminado de tiempo de espera es infinito.

De forma predeterminada, RestTemplate utiliza SimpleClientHttpRequestFactory y, a su vez, utiliza HttpURLConnection.

Por defecto, el tiempo de espera para HttpURLConnection es 0 - es decir, infinita, a menos que haya sido fijado por estas propiedades:

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 
+0

¿Hay una API para consultar los valores actualmente establecidos? Puedo ver los setters en HttpComponentsClientHttpRequestFactory para establecer los valores, pero no hay getters correspondientes para consultar los valores directamente? –

Cuestiones relacionadas