es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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, ¿hay alguna manera de hacerlo funcionar o el Retryer no funciona para Feign Reactivo? Si es así, ¿es posible definir “reintentos globales” o necesito definir un reintentó para cada llamada/Mono?

Tags:  , ,

Answer

  1. Avatar for 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.

Comments are closed.