背景:
项目框架为springboot2.2.x,在使用rabbitmq时配置了多个virtual_host,但在实际使用的过程中向某一个virtual_host下的队列发送消息时竟然发送到别的virtual_host下的队列(队列名字都是一样的)去了,仔细检查了配置也没有什么问题…
解决:
Rabbitmq的配置文件是用@Configuration写的,注入了多个@Bean(xxxRabbitTemplate),发现在@Autowired某个rabbitTemplate时未指定某个具体的类,问题就出现在这,@Autowired默认是按type注入的,当某个接口有多个实现类时,结合@Primary是指注入这一个实现类的,这就造成明明配置了那么多个xxxRabbitmqTemplate其实只有那个先注入ioc容器中的实现类生效了。
那之后无论向哪个virtual_host下的队列发送都只会发送到某个ioc容器中存在的那个实现类配置的virtual_host中的队列去。
找到问题在哪就很好解决咯,在@Autowired的时候指定是哪个具体实现类就可以了,即@Autowired搭配@Qualifier(xxxRabbitmqTemplate)注入即可,对了如果像我那样用@Bean(xxx)的方式,@Qualifier(xxx)要个@Bean保持一致;@Bean没有指定类名的话,@Qualifier(@Bean注解下方法名的名称,首字母要小写)
之后就可以向virtual_host对应的队列中发送消息了。
还是对spring理解的不够深啊,再加把劲!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)