20

From spring boot tutorial: https://spring.io/guides/gs/messaging-rabbitmq/

They give an example of creating 1 queue and 1 queue only, but, what if I want to be able to create more then 1 queue? how would it be possible?

Obviously, I can't just create the same bean twice:

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

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

You can't create the same bean twice, it will make ambiguous.

Gary Russell
  • 166,535
  • 14
  • 146
  • 179
winter
  • 2,687
  • 4
  • 18
  • 27

1 Answers1

49

Give the bean definition factory methods different names. Usually, by convention, you would name them the same as the queue, but that's not required...

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

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

The method name is the bean name.

EDIT

When using the queues in the binding beans, there are two options:

@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);
}

or

@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);
}

or even better...

@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());
}
Gary Russell
  • 166,535
  • 14
  • 146
  • 179
  • but, once i have 2 beans, as you can see in the link to tutorial, the method name "binding" you only get 1 queue, so how would you bind this based on your own needs? I mean, I'm trying to bind multiple queue into 1 exchange, using different keys for the queues. but spring boot doesn't provide this. – winter Dec 20 '16 at 08:51
  • Ah, I see you are just not yet familiar with Spring configuration - see my edit. – Gary Russell Dec 20 '16 at 13:53
  • 5
    OMG, seems like a lot of things which are unrelated to this question, become crazingly clear....Thank you very much, u made me a super human :) – winter Dec 25 '16 at 19:29