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.