Cliente Feign Reactivo con reintentos globales.
Estoy cambiando de cliente Feign a cliente Feign Reactivo, he definido un controlador de reintentos global para Feign:
@Bean
Retryer retryer() {
return new Retryer.Default(100, 1, 5);
}
@Bean
ErrorDecoder errorDecoder() {
return new HttpErrorDecoder();
}
static class HttpErrorDecoder implements ErrorDecoder {
private final ErrorDecoder defaultErrorDecoder = new Default();
@Override
public Exception decode(String methodKey, Response response) {
Exception exception = defaultErrorDecoder.decode(methodKey, response);
if (response.status() != HttpStatus.SC_OK) {
return new RetryableException(response.status(),
"La llamada a la API con la URL: " + response.request().url() + " ha fallado",
response.request().httpMethod(), exception.getCause(), null,
response.request());
}
return exception;
}
}
Con el cliente no reactivo, los reintentos funcionan bien, con el cliente reactivo el descodificador de errores lanza RetryableException como debería, pero el Retryer no reacciona: no se ejecuta ningún reintent elig. Estoy utilizando principalmente webflux Mono
davy.ai
Parece que el Retryer global que ha definido no es compatible con el cliente Feign reactivo.
En la programación reactiva, los reintentos suelen manejarse con la ayuda de operadores como “retry”, “retryWhen”, etc., que deben incluirse explícitamente en el código.
Por lo tanto, debería definir los reintentos para cada llamada/mono por separado usando estos operadores o manejar los reintentos usando un mecanismo de reintentos más avanzado como Spring Retry o Resilience4j. No es posible definir “reintentos globales” para Feign reactivo.