spring boot注册多个MQ服务器的问题

381 阅读1分钟

关于注册到多个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源里。