Spring 的 @Retryable 注解将重试 3 次(默认)并回退到 @Recovery 方法。但是,@CircuitBreaker 将重试一次并在状态关闭时回退。
我想把这两个结合起来:当断路器状态关闭时,会在回退前重试3次(处理瞬态错误),如果状态打开,则直接回退。
有什么优雅的方法可以做到这一点?一种可能的方法是在函数内部实现重试逻辑,但我觉得这不是最好的解决方案。
Spring 的 @Retryable 注解将重试 3 次(默认)并回退到 @Recovery 方法。但是,@CircuitBreaker 将重试一次并在状态关闭时回退。
我想把这两个结合起来:当断路器状态关闭时,会在回退前重试3次(处理瞬态错误),如果状态打开,则直接回退。
有什么优雅的方法可以做到这一点?一种可能的方法是在函数内部实现重试逻辑,但我觉得这不是最好的解决方案。
@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();
}
});
}
声明重试模板:
@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 { ... }