我想在一个Spring boot应用程序中实现CircuitBreaker模式.我有两个API,每个API都有自己的配置.我在应用程序类中定义了这两种配置方法. 此外,在应用程序类中,我定义了一个CustomCircuitBreakerFactory类型的Spring Bean.此类型是一个自定义类,将创建用于管理和配置API的断路器.这个spring bean在其构造函数中接受三个参数:

import io.github.resilience4j.circuitbreaker.CallNotPermittedException;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory;

import org.springframework.context.annotation.Bean;

import java.time.Duration;
import java.util.List;


@SpringBootApplication(scanBasePackages = {"com.company.*"})
public class ApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApiApplication.class, args);
    }

    @Bean
    @Qualifier("api1CircuitBreakerConfig")
    public CircuitBreakerConfig api1CircuitBreakerConfig() {

        return CircuitBreakerConfig.custom()
            .failureRateThreshold(50)
            .waitDurationInOpenState(Duration.ofSeconds(10))
            .permittedNumberOfCallsInHalfOpenState(10)
            .slidingWindowSize(100)
            .minimumNumberOfCalls(20)
            .recordExceptions(RuntimeException.class, CallNotPermittedException.class)
            .build();
    }

    @Bean
    @Qualifier("api2CircuitBreakerConfig")
    public CircuitBreakerConfig api2CircuitBreakerConfig() {
        return CircuitBreakerConfig.custom()
            .failureRateThreshold(40)
            .waitDurationInOpenState(Duration.ofSeconds(10))
            .permittedNumberOfCallsInHalfOpenState(10)
            .slidingWindowSize(150)
            .minimumNumberOfCalls(30)
            .recordExceptions(RuntimeException.class, CallNotPermittedException.class)
            .build();

    }

    @Bean
    public CustomCircuitBreakerFactory customCircuitBreakerFactory(
        ReactiveResilience4JCircuitBreakerFactory circuitBreakerFactory,
        CircuitBreakerConfig api1CircuitBreakerConfig,
        CircuitBreakerConfig api2CircuitBreakerConfig) {
        return new CustomCircuitBreakerFactory(circuitBreakerFactory, api1CircuitBreakerConfig, api2CircuitBreakerConfig);
    }
}


它是CustomCircuitBreakerFactory的实现.它是用于配置和管理断路器的组件类.它的构造函数中有三个参数,有两种方法 for each 底层API创建和配置断路器实例.

import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class CustomCircuitBreakerFactory {

    private final ReactiveResilience4JCircuitBreakerFactory circuitBreakerFactory;
    private final CircuitBreakerConfig api1CircuitBreakerConfig;
    private final CircuitBreakerConfig api2CircuitBreakerConfig;


    public CustomCircuitBreakerFactory(
        ReactiveResilience4JCircuitBreakerFactory circuitBreakerFactory,
        @Qualifier("api1CircuitBreakerConfig") CircuitBreakerConfig api1CircuitBreakerConfig,
        @Qualifier("api2CircuitBreakerConfig") CircuitBreakerConfig api2CircuitBreakerConfig) {
        this.circuitBreakerFactory = circuitBreakerFactory;
        this.api1CircuitBreakerConfig= api1CircuitBreakerConfig;
        this.api2CircuitBreakerConfig= api2CircuitBreakerConfig;
    }


    public CircuitBreaker createApi1CircuitBreaker() {
        return (CircuitBreaker) circuitBreakerFactory.create("api1");
    }

    public CircuitBreaker createApi2CircuitBreaker() {
        return (CircuitBreaker) circuitBreakerFactory.create("api2");
    }
}

当我运行应用程序时,我得到了这个错误:ApiApplication中的方法customCircuitBreakerFactory的参数1需要一个bean,但找到了2个: - api 1CircuitBreakerconfig:由ApiFacadeApplication中的方法'api 1CircuitBreakerconfig'定义 - api 2CircuitBreakerconfig:由ApiFacadeApplication中的方法'api 2CircuitBreakerconfig'定义 我用了@ fixier,但它不工作.

我用了@ fixier,但它不工作.

推荐答案

代码中存在几个问题

  1. @Qualifier在注入bean但未提供时起作用.使用创建bean的注释可以为bean设置自定义限定符:@Bean@Service@Component或类似的.
  2. @Component@Bean都向Spring上下文添加了bean.你应该使用其中之一,而不是两者.
  3. @Qualifier应在every处进行自动装配过程的地方使用.

所以,让你的代码工作的步骤:

  1. 删除api1CircuitBreakerConfig()api2CircuitBreakerConfig()上的@Qualifier,改为将名称添加到@Bean注释中.注意,默认情况下Spring使用等于方法/类名称的限定符,因此在您的情况下它是多余的.
  2. CustomCircuitBreakerFactory删除@Component
  3. ApiApplication.customCircuitBreakerFactory的参数中添加@Qualifer个注释

Java相关问答推荐

如何使用解析器组合子解析Java数组类型签名?

Select 按位运算序列

ittext pdf延迟签名,签名无效

将数组整体转换为链接表

如何使用Maven和Spring Boot将构建时初始化、跟踪类初始化正确传递到本机编译

对Java中的通配符参数的混淆

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

什么是Java原子属性的正确getter和setter

按属性值从流中筛选出重复项

在Eclipse中调试未导出的JDK模块的Java包

try 使用Spring集成和MySQL实现发件箱模式时,锁定等待超时

在java中使用不同的application.properties-jar而不使用Spring

没有Tomcat,IntelliJ如何在本地运行API?

由于可为null,无法在kotlin中实现java接口

Java编译器是否进行了持续的折叠优化,以及如何进行判断?

获取401未经授权,即使在标头中设置了浏览器名称和cookie

using case default on switch语句返回;预览特征切换中的模式匹配仅在源级别20及以上的情况下可用;

java.util.LinkedList()是如何成为MutableList的实例的?

如何在 Android Studio 中删除 ImageView 和屏幕/父级边缘之间的额外空间?

Xml Reader 将 BMP 外部的字符解析为代理项对,这会导致无效的 xml