使用Spring Boot创建多个RabbitMQ队列

21

从Spring Boot教程中:

https://spring.io/guides/gs/messaging-rabbitmq/

他们给出了创建一个队列和仅一个队列的示例,但是如果我想创建多个队列怎么办?这是否可能?

显然,我不能简单地两次创建相同的bean:

@Bean
Queue queue() {
    return new Queue(queueNameAAA, false);
}

@Bean
Queue queue() {
    return new Queue(queueNameBBB, false);
}

您无法创建相同的Bean两次,这样会造成歧义。

1个回答

49

给豆子定义工厂方法起不同的名称。通常,按照惯例,您会将它们命名为与队列相同的名称,但这并非必需...

@Bean
Queue queue1() {
    return new Queue(queueNameAAA, false);
}

@Bean
Queue queue2() {
    return new Queue(queueNameBBB, false); 
}

方法名就是bean名称。

编辑

在使用绑定bean中的队列时,有两个选项:

@Bean
Binding binding1(@Qualifier("queue1") Queue queue, TopicExchange exchange) {
    return BindingBuilder.bind(queue).to(exchange).with(queueNameAAA);
}

@Bean
Binding binding2(@Qualifier("queue2") Queue queue, TopicExchange exchange) {
    return BindingBuilder.bind(queue).to(exchange).with(queueNameBBB);
}
或者
@Bean
Binding binding1(TopicExchange exchange) {
    return BindingBuilder.bind(queue1()).to(exchange).with(queueNameAAA);
}

@Bean
Binding binding2(TopicExchange exchange) {
    return BindingBuilder.bind(queue2()).to(exchange).with(queueNameBBB);
}

或者更好的是...

@Bean
Binding binding1(TopicExchange exchange) {
    return BindingBuilder.bind(queue1()).to(exchange).with(queue1().getName());
}

@Bean
Binding binding2(TopicExchange exchange) {
    return BindingBuilder.bind(queue2()).to(exchange).with(queue2().getName());
}

但是,一旦我有了两个bean,就像您在教程链接中看到的那样,方法名“binding”只会得到1个队列,那么您如何根据自己的需求进行绑定呢?我的意思是,我正在尝试将多个队列绑定到一个交换机上,使用不同的键来区分队列。但是Spring Boot没有提供这个功能。 - winter
啊,我明白了,你只是还不熟悉Spring配置 - 看看我的编辑。 - Gary Russell
5
哇,似乎很多与这个问题无关的事情都变得异常清晰了...非常感谢,你让我成为了一个超级人类 :) - winter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接