Ten en cuenta que en la informática un error casi siempre tiene varias resoluciones, no obstante enseñamos lo más óptimo y mejor.
Solución:
Para Bota de resorte >= 1.4
@Configuration
public class AppConfig
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder)
return restTemplateBuilder
.setConnectTimeout(...)
.setReadTimeout(...)
.build();
Para Bota de resorte <= 1.3
@Configuration
public class AppConfig
@Bean
@ConfigurationProperties(prefix = "custom.rest.connection")
public HttpComponentsClientHttpRequestFactory customHttpRequestFactory()
return new HttpComponentsClientHttpRequestFactory();
@Bean
public RestTemplate customRestTemplate()
return new RestTemplate(customHttpRequestFactory());
entonces en tu application.properties
custom.rest.connection.connection-request-timeout=...
custom.rest.connection.connect-timeout=...
custom.rest.connection.read-timeout=...
Esto funciona porque HttpComponentsClientHttpRequestFactory
tiene setters públicos connectionRequestTimeout
, connectTimeout
y readTimeout
y @ConfigurationProperties
te los pone.
Para Spring 4.1 o Spring 5 sin Spring Boot utilizando @Configuration
en lugar de XML
@Configuration
public class AppConfig
@Bean
public RestTemplate customRestTemplate()
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(...);
httpRequestFactory.setConnectTimeout(...);
httpRequestFactory.setReadTimeout(...);
return new RestTemplate(httpRequestFactory);
Finalmente conseguí que esto funcionara.
Creo que el hecho de que nuestro proyecto tuviera dos versiones diferentes del jar commons-httpclient no ayudaba. Una vez que resolví eso, descubrí que puedes hacer dos cosas…
En código puedes poner lo siguiente:
HttpComponentsClientHttpRequestFactory rf =
(HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory();
rf.setReadTimeout(1 * 1000);
rf.setConnectTimeout(1 * 1000);
La primera vez que se llame a este código, establecerá el tiempo de espera para el HttpComponentsClientHttpRequestFactory
clase utilizada por el RestTemplate
. Por lo tanto, todas las llamadas posteriores realizadas por RestTemplate
utilizará la configuración de tiempo de espera definida anteriormente.
O la mejor opción es hacer esto:
donde uso el RestOperations
interfaz en mi código y obtenga los valores de tiempo de espera de un archivo de propiedades.
Esta pregunta es el primer enlace para una búsqueda de Spring Boot, por lo tanto, sería genial poner aquí la solución recomendada en la documentación oficial. Spring Boot tiene su propio frijol de conveniencia RestTemplateBuilder:
@Bean
public RestTemplate restTemplate(
RestTemplateBuilder restTemplateBuilder)
return restTemplateBuilder
.setConnectTimeout(Duration.ofSeconds(500))
.setReadTimeout(Duration.ofSeconds(500))
.build();
La creación manual de instancias de RestTemplate es un enfoque potencialmente problemático porque otros beans configurados automáticamente no se inyectan en instancias creadas manualmente.