关于注册到多个MQ源的文章已经有很多了,这里记录一下声明queue的坑;
如果使用注册bean的方式声明queue,会导致声明的queue同时被注册到所有的MQ源上;
//如果使用下面的声明方式,queue和exchange会被注册到两个mq源上
@Bean
public Queue devQueue(@Autowired AmqpAdmin devAmqpAdmin) {
//Declares a non-exclusive, autodelete, non-durable queue.
Queue queue = new Queue(dev_queue_name, false, false, true);
//devAmqpAdmin.declareQueue(queue);
return queue;
}
@Bean
public TopicExchange devTopicExchange(@Autowired AmqpAdmin devAmqpAdmin) {
TopicExchange topicExchange = new TopicExchange(dev_exchange_name);
//devAmqpAdmin.declareExchange(topicExchange);
return topicExchange;
}
@Bean
public Binding binding(@Autowired Queue devQueue, @Autowired TopicExchange devTopicExchange) {
return BindingBuilder.bind(devQueue).to(devTopicExchange).with("#"); //all topic
}
为了避免上述问题的发生,可以使用如下的方式声明queue:
@Bean
public AmqpAdmin devAmqpAdmin(@Autowired @Qualifier("devConnectionFactory") ConnectionFactory devConnectionFactory) {
RabbitAdmin admin = new RabbitAdmin(devConnectionFactory);
admin.setAutoStartup(true);
Queue queue = new Queue(dev_queue_name, false, false, true);
TopicExchange topicExchange = new TopicExchange(dev_exchange_name);
Binding binding = BindingBuilder.bind(queue).to(topicExchange).with("#");//all topic
admin.declareQueue(queue);
admin.declareExchange(topicExchange);
admin.declareBinding(binding);
return admin;
}
使用admin声明queue时,这个queue只会在特定的connectionFactory里定义,也就是指定的MQ源里。