You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spring Boot中RabbitMQ主配置设置及Edgware版本兼容问题问询

解决Spring Cloud Edgware中多RabbitMQ ConnectionFactory与Zipkin的Bean冲突问题

这个问题的核心是Spring Cloud Edgware版本的spring-cloud-sleuth-zipkin自动配置会默认寻找单个ConnectionFactory类型的Bean,而你配置了两个实例(rabbitConnectionFactoryrabbitConnectionFactory_2),导致注入时出现歧义。下面是几种可行的解决方法:

方法1:标记主ConnectionFactory为默认(最简便)

因为你是用XML配置的RabbitMQ组件,直接给你想要作为主配置的connection-factory添加primary="true"属性即可,这样Spring会将这个实例作为默认的ConnectionFactory供Zipkin的自动配置使用:

<rabbit:connection-factory id="rabbitConnectionFactory" primary="true" 
    host="${rabbitmq.host}" port="${rabbitmq.port}" 
    username="${rabbitmq.username}" password="${rabbitmq.password}" />

另一个rabbitConnectionFactory_2保持原有配置即可,不会影响其他需要指定它的组件。

方法2:自定义Zipkin RabbitSender配置(更灵活)

如果不想依赖@Primary的默认优先级,可以手动创建一个配置类,明确指定Zipkin要使用的ConnectionFactory:

import org.springframework.cloud.sleuth.zipkin2.sender.ZipkinProperties;
import org.springframework.cloud.sleuth.zipkin2.sender.ZipkinRabbitSender;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Qualifier;

@Configuration
public class CustomZipkinRabbitSenderConfig {

    @Bean
    public ZipkinRabbitSender rabbitSender(
            @Qualifier("rabbitConnectionFactory") ConnectionFactory connectionFactory,
            ZipkinProperties zipkinProperties) {
        return ZipkinRabbitSender.builder()
                .connectionFactory(connectionFactory)
                .addresses(zipkinProperties.getRabbit().getAddresses())
                .exchange(zipkinProperties.getRabbit().getExchange())
                .routingKey(zipkinProperties.getRabbit().getRoutingKey())
                .build();
    }
}

这里通过@Qualifier指定了要注入的ConnectionFactory的id,完全绕过了自动配置的歧义问题。

补充说明:版本差异原因

在Spring Cloud Dalston版本中,sleuth与zipkin的整合逻辑没有强制要求单个ConnectionFactory实例,所以你的多配置场景可以正常运行。但升级到Edgware后,自动配置的逻辑做了强化,会主动尝试注入ConnectionFactory,这时多实例的歧义就会触发错误。

内容的提问来源于stack exchange,提问作者Francisco José Martínez Páez

火山引擎 最新活动