java - getforobject - RestTemplate-valor de tiempo de espera predeterminado
resttemplate spring boot post example (3)
Creo que puedes usar SimpleClientHttpRequestFactory para el parámetro de tiempo de espera. La instancia de SimpleClientHttpRequestFactory se puede configurar para que repose la plantilla mediante el método del constructor o del definidor.
Por defecto, RestTemplate usa SimpleClientHttpRequestFactory, por lo que puede establecer directamente el valor en restTemplate.
¿Cuál es el valor de tiempo de espera predeterminado al usar Spring''s RestTemplate?
Por ejemplo, estoy invocando un servicio web como este:
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);
¿Hay algún valor de tiempo de espera 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.
Para responder explícitamente a la pregunta ...
El tiempo de espera predeterminado es infinito.
Por defecto, RestTemplate usa SimpleClientHttpRequestFactory y eso a su vez usa HttpURLConnection.
De forma predeterminada, el tiempo de espera para HttpURLConnection es 0, es decir, infinito, a menos que haya sido establecido por estas propiedades:
-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec
Una de las características interesantes de Spring-android RestTemplate es el uso de la implementación adecuada (recomendada por Google) de RequestFactory, dependiendo de la versión del sistema operativo.
Google recomienda utilizar las instalaciones de J2SE en Gingerbread (versión 2.3) y más recientes, mientras que las versiones anteriores deberían usar HttpComponents HttpClient. Basándose en esta recomendación, RestTemplate comprueba la versión de Android en la que se está ejecutando su aplicación y utiliza el ClientHttpRequestFactory apropiado.
Por lo tanto, la respuesta anterior no está completa porque HttpComponentsClientHttpRequestFactory (que es utilizada por Spring-Android para las versiones del sistema operativo Android <2.3) no se tiene en cuenta.
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);
}
}
}