问题描述
我在 Gradle 中使用 Spring Boot 2.4。
以下是我定义依赖项的方式:
compile 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'
它工作正常,但是当我添加时:
implementation 'org.springframework.cloud:spring-cloud-starter-sleuth'
我收到此错误:
java.lang.classCastException: class org.springframework.cloud.sleuth.instrument.circuitbreaker.TraceCircuitBreaker cannot be cast to class org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreaker (org.springframework.cloud.sleuth.instrument.circuitbreaker.TraceCircuitBreaker and org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreaker are in unnamed module of loader 'app')
at org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory$$EnhancerBySpringcglib$$a7735aed.create(<generated>) ~[spring-cloud-circuitbreaker-resilience4j-2.0.0.jar:2.0.0]
有人知道出了什么问题吗?
解决方法
我最近遇到了同样的问题。这是我解决问题的方法:
我使用 Resilience4JCircuitBreakerFactory 来创建断路器。
@Autowired
private Resilience4JCircuitBreakerFactory circuitBreakerFactory;
...
CircuitBreaker checkStockWithCircutBreaker = circuitBreakerFactory.create("inventory");
一旦我添加了 spring-cloud-starter-sleuth 依赖项,这就不起作用了。使用抽象类 CircuitBreakerFactory 以便 Spring 自动注入可用的适当 CircuitBreakerFactory 实例
@Autowired
private CircuitBreakerFactory circuitBreakerFactory;
...
CircuitBreaker checkStockWithCircutBreaker = circuitBreakerFactory.create("inventory");
,
如 Spring Cloud Sleuth 文档中所述,您必须禁用 sleuth 断路器。只需在 application.properties 中添加以下属性即可解决:spring.seuth.circuitbreaker.enabled=false