2017-06-29 151 views
1

Spring的@Retryable注释将重试三次(默认)并回退到@Recovery方法。然而,@CircuitBreaker会在状态关闭时重试一次并回退。如何在Spring中将Retryable和CircuitBreaker结合在一起?

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

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

回答

0

@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; 
    } 
} 

项目启用春重试:

@Configuration 
@EnableRetry 
public class AppConfig { ... }