如何在Spring中将Retryable和CircuitBreaker组合在一起?

时间:2017-06-29 18:54:31

标签: java spring spring-retry circuit-breaker retrypolicy

Spring的@Retryable注释将重试三次(默认)并回退到@Recovery方法。然而,@ StateitBreaker将重试一次并在州关闭时回落。

我想把这两个结合起来:当断路器状态关闭时,会在退回之前重试三次(处理瞬态错误),如果状态是开启的话,会直接回落。

任何优雅的方式来做到这一点?一种可能的方法是在函数内部实现重试逻辑,但我觉得它不是最好的解决方案。

1 个答案:

答案 0 :(得分:2)

@CircuitBreaker已经将@Retry实现为有状态=真,这就是他如何知道有多少次调用失败。

我认为这里最好的方法是在方法中使用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 { ... }