Spring CircuitBreakerRetryPolicy:为所有请求打开电路

问题描述

我想使用 Spring-Retry 实现断路器设计模式。我面临的主要问题是为所有请求打开电路。如果我从浏览器发出新请求,它仍然会不断重试。

我有一个带有 RetryTemplateCircuitBreakerRetryPolicy,定义如下:

@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 状态是线程绑定的。

您需要编写自定义策略来维护全局状态。