Hystrix Feign Retry for Timeout не работает

В моем проекте есть Feign Configuration и Hystrix Commands. ниже Feign Config

@Configuration
public class FeignRetryConfig {

@Primary
@Bean
public Feign.Builder feignBuilder(Retryer nephosFeignRetryer) {
    return HystrixFeign.builder()
            .errorDecoder(new FeignErrorDecoder())
            .retryer(nephosFeignRetryer);
}

// retry set to 3 times
@Bean
public Retryer nephosFeignRetryer() {
    return new Retryer.Default(10, SECONDS.toMillis(5), 5);
}

@Bean
Logger.Level feignLoggerLevel() {
    return Logger.Level.FULL;
}
}

и ниже мой ErrorDecoder:

public class FeignErrorDecoder 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() == 500) {
            log.error(String.format("##### Got %s response from %s #######", response.status(), 
        methodKey));
        return new RetryableException(
                  exception.getMessage(),
                  exception,
                  null
              );
       }
    return exception;
   }
 }

и ниже мой клиент:

@FeignClient(name = "TEST-CONFIG", configuration = FeignRetryConfig.class, fallbackFactory = 
      XYZClientFallbackFactory.class)
public interface TestClient {

    @RequestMapping(value = "/test", method = RequestMethod.GET, consumes = 
     MediaType.APPLICATION_JSON_VALUE)
     Observable<String> test();


}

SO из TEST-CONFIG я бросаю IOException (ошибка 500) в тест, но он не делает никаких повторных попыток. ниже моя ошибка:

com.netflix.hystrix.exception.HystrixRuntimeException: TestClient#test() failed and fallback failed.
at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:815)
at com.netflix.hystrix.AbstractCommand$22.call(AbstractCommand.java:790)
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onError(OperatorOnErrorResumeNextViaFunction.java:140)
at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
at com.netflix.hystrix.AbstractCommand$DeprecatedOnFallbackHookApplication$1.onError(AbstractCommand.java:1451)
at com.netflix.hystrix.AbstractCommand$FallbackHookApplication$1.onError(AbstractCommand.java:1376)
at rx.internal.operators.OnSubscribeDoOnEach$DoOnEachSubscriber.onError(OnSubscribeDoOnEach.java:87)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: feign.RetryableException: status 500 reading TestClient#test(); content:
  {"status":500,"erroritems":[{"code":"RuntimeException","message":"org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection"}]}
at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:108)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:301)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:297)
at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
... 30 common frames omitted
 Caused by: feign.FeignException: status 500 reading TestClient#test(); content:
  {"status":500,"erroritems":[{"code":"RuntimeException","message":"org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection"}]}
at feign.FeignException.errorStatus(FeignException.java:62)
at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:91)

Может кто-нибудь помочь, пожалуйста, что мне не хватает?


person user280960    schedule 18.09.2020    source источник


Ответы (1)


Я думаю, у вас включен hystrix. Попробуйте установить

feign.hystrix.enabled: false

и посмотреть, работает ли это тогда; если это так, это докажет, что ваша конфигурация в порядке. На hystrix and retrying есть сообщение, в котором говорится, что это вместе не ладится. Если вы хотите оставить hystrix включенным (а почему бы и нет), возможно, стоит взглянуть на spring -retry, чтобы обойти проблему.

person Steven Kuypers    schedule 05.03.2021