Ir al contenido

Cómo reintentar usando Restclient

Spring-Boot Restclient
Autor
Harpal Singh
Software Engineer
Traducido por
Namastecode
Tabla de contenido

1. Introducción

En este breve tutorial, aprenderemos cómo implementar llamadas reintentos utilizando RestClient con el apoyo de spring-retry.

A veces, las conexiones de red pueden ser poco confiables, lo que lleva a fallos temporales al realizar solicitudes HTTP. Puede haber muchas razones para estos fallos, por lo que debemos manejarlos de manera sistemática.

Sabemos que WebClient proporciona un mecanismo de reintento listo para usar. Sin embargo, RestClient aún necesita esta funcionalidad. Veamos cómo utilizar spring-retry, una biblioteca que permite reintentar operaciones fallidas.

2. Configurando spring-retry

En resumen, spring-retry ofrece un enfoque simple para implementar capacidades de reintento a través de anotaciones. Además, podemos personalizar el comportamiento como deseemos. Pero primero, necesitamos importar la última versión de spring-retry y spring-aspects en nuestro proyecto:

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>2.0.5</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>6.1.4</version>
</dependency>

Ahora, podemos utilizar la anotación @Retryable. Vamos a usarla en un método de servicio que encapsula una llamada a RestClient.

3. Configurar RestClient con @Retryable

Finalmente, podemos anotar un método con @Retryable para habilitar la funcionalidad de reintento. Además, también podemos personalizar el comportamiento del reintento, por ejemplo, definir una política de retroceso:

@EnableRetry
public class ExampleService {
    @Retryable(maxAttempts = 5, backoff = @Backoff(delay = 1000))
    public String performRestCall() {
        return restClient
        .get()
        .uri("https://example.com")
        .retrieve()
        .body(String.class);
    }
}

Arriba, usamos @EnableRetry para activar la política de reintentos y anotamos el método del servicio con @Retryable. Esto emula una llamada POST a una URI de ejemplo y devuelve un String. Debemos anotar con @EnableRetry; de lo contrario, la anotación @Retryable será ignorada.

3.1. Reintentando en Excepciones

En algunos casos, podemos querer volver a ejecutar un método cuando se lanza una excepción. Para esto, podemos utilizar el atributo retryFor de la anotación @Retryable. Por ejemplo, podemos reintentar una llamada a un método cuando se lanza una CustomException:

@Retryable(maxAttempts = 5, retryFor = {CustomException.class})
public String performRestCallWithCustomException() {
    // ...
    // throws CustomException
}

Como podemos ver, podemos personalizar fácilmente el comportamiento de reintento como queramos.

4. Conclusión

En este tutorial, aprendimos cómo implementar un mecanismo de reintento utilizando RestClient y spring-retry. También vimos cómo usar la anotación @Retryable para habilitar la funcionalidad de reintento y personalizar el comportamiento del reintento.

Podemos buscar el código completo en Github.

Relacionados

Ejecutando PostgreSQL en un Contenedor Docker
DevOps Postgres Docker Database