Saltar al contenido

Tiempo de espera de Spring RestTemplate

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, connectTimeouty 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.

Aquí tienes las comentarios y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *