Как совместить Retryable и CircuitBreaker вместе весной?

Аннотация Spring @Retryable повторит попытку трижды (по умолчанию) и вернется к методу @Recovery. Однако @CircuitBreaker будет повторять попытку один раз и откатится, когда состояние будет закрыто.

Я хочу объединить эти два: когда состояние выключателя замкнуто, будет три раза повторять попытку, прежде чем откатиться (для работы с переходными ошибками), если состояние разомкнуто, сразу откатится.

Какой-нибудь элегантный способ сделать это? Возможный подход - реализовать логику повтора внутри функции, но я считаю, что это не лучшее решение.


person Zebing Lin    schedule 29.06.2017    source источник


Ответы (1)


@CircuitBreaker уже реализует @Retry как stateful = true, поэтому он знает, сколько вызовов не удалось.

Я думаю, что лучший подход здесь - использовать RetryTemplate внутри вашего метода:

@CircuitBreaker(maxAttempts = 2, openTimeout = 5000l, resetTimeout = 10000l)
void call() {
  retryTemplate.execute(new RetryCallback<Void, RuntimeException>() {
    @Override
    public Void doWithRetry(RetryContext context) {
      myService.templateRetryService();
    }
  });
}

Объявление RetryTemplate:

@Configuration
public class AppConfig {

  @Bean
  public RetryTemplate retryTemplate() {
      RetryTemplate retryTemplate = new RetryTemplate();

      FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
      fixedBackOffPolicy.setBackOffPeriod(2000l);
      retryTemplate.setBackOffPolicy(fixedBackOffPolicy);

      SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
      retryPolicy.setMaxAttempts(2);
      retryTemplate.setRetryPolicy(retryPolicy);

      return retryTemplate;
  }
}

Включение Spring Retry в проекте:

@Configuration
@EnableRetry
public class AppConfig { ... }
person Brother    schedule 18.07.2017
comment
Когда реализована повторная попытка от автоматического выключателя, автоматический выключатель будет видеть ошибки только после завершения повторных попыток. При таком подходе необходимо тщательно устанавливать пороговые значения. В идеале, чтобы брокер был открыт, пороговые значения должны быть меньше. Пожалуйста, проверьте, что для вашего приложения автоматический выключатель должен быть внутри или снаружи. - person Prakhyat; 15.01.2020