Spring Boot中RabbitMQ主配置设置及Edgware版本兼容问题问询
解决Spring Cloud Edgware中多RabbitMQ ConnectionFactory与Zipkin的Bean冲突问题
这个问题的核心是Spring Cloud Edgware版本的spring-cloud-sleuth-zipkin自动配置会默认寻找单个ConnectionFactory类型的Bean,而你配置了两个实例(rabbitConnectionFactory和rabbitConnectionFactory_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




