问题描述
我想使用 Spring-Retry 实现断路器设计模式。我面临的主要问题是为所有请求打开电路。如果我从浏览器发出新请求,它仍然会不断重试。
我有一个带有 RetryTemplate
的 CircuitBreakerRetryPolicy
,定义如下:
@Configuration
public class MyApplicationConfig {
@Bean
public RetryTemplate retryTemplate(RetryPolicy cbRetry) {
RetryTemplate retryTemplate = new RetryTemplate();
FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
fixedBackOffPolicy.setBackOffPeriod(1000);
retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
retryTemplate.setRetryPolicy(circuitBreakerRetryPolicy);
return retryTemplate;
}
@Bean("cbRetry")
public RetryPolicy circuitBreaker() {
CircuitBreakerRetryPolicy circuitBreakerRetryPolicy = new CircuitBreakerRetryPolicy();
circuitBreakerRetryPolicy.setResetTimeout(20000);
circuitBreakerRetryPolicy.setopenTimeout(2000);
return circuitBreakerRetryPolicy;
}
}
然后我使用 RestTemplate
调用一个不存在的 url,只是为了使调用失败并计算重试次数。电路应该在 2 秒内打开,但如果我在第一个调用失败后立即尝试另一个调用,它会再次重试。
如何使电路在所有传入请求的给定 openTimeOut 期间保持打开状态?
我尝试将 RetryState
提供给 retryTemplate 调用,但这也无济于事。
谢谢!
解决方法
spring-retry
状态是线程绑定的。
您需要编写自定义策略来维护全局状态。