Как вы можете создать RabbitMQ MessageListener, используя обмен темами с автоматически объявленными очередями?

Я использую RabbitMQ в Java, используя Spring AMQP. Я отправляю сообщения, используя тему обмена.

Я хочу использовать сообщения, используя автоматически объявленные очереди с указанным routingKey, и единственный способ, которым мне удалось добиться этого, - это использовать Thread, где я буду ждать доставки (используя Consumer.nextDelivery()). Есть ли другой способ сделать это асинхронным?

Также Spring AMQP имеет интерфейс MessageListener, который я могу использовать только для прослушивания именованных очередей. Есть ли способ использовать MessageListener для приема сообщений из автоматически объявленных очередей?

Спасибо!


person dianap    schedule 08.07.2014    source источник


Ответы (1)


Есть ли способ использовать MessageListener для приема сообщений из автоматически объявленных очередей?

На самом деле это функция по умолчанию: http://docs.spring.io/spring-amqp/docs/latest-ga/reference/htmlsingle/#automatic-declaration.

И это главная крутая особенность протокола AMQP - автоматически объявлять объекты MQ по требованию. Это правило работает как для очереди, так и для обменов и связывания между ними.

Итак, вам достаточно указать привязку вашей очереди к этому обмену темами и указать имя очереди из конфигурации <listener-container>.

При запуске вашего приложения все объекты AMQP будут загружены в брокер RabbitMQ через компонент RabbitAdmin, если они еще не присутствуют в брокере, конечно.

person Artem Bilan    schedule 08.07.2014
comment
Я пытался использовать <listener-container>, но когда я объявляю его в XML, мне нужно написать имя очереди. Дело в том, что я хочу использовать автообъявленную очередь для каждого роутинг-ключа. В настоящее время я использую это: String queueName = channel.queueDeclare().getQueue(); channel.queueBind(queueName, EXCHANGE_NAME, routingKey); Мне нужно создать прослушиватель, используя автоматически объявленную очередь, как указано выше. - person dianap; 08.07.2014
comment
Вы можете получить доступ к bean-компоненту SimpleMessageListenerContainer из этого кода и использовать его addQueueNames для этих anonymous очередей. - person Artem Bilan; 08.07.2014
comment
Вероятно, таким образом мне понадобится другой класс для создания очередей и добавления их в мой SimpleMessageListenerContainer, который будет реализовывать логику onMessage. Верно? Или есть лучший способ добавить анонимные имена очередей? Также большое спасибо за ответы. Они очень полезны! - person dianap; 08.07.2014
comment
Если вам нужен отдельный слушатель для каждой анонимной очереди, вы должны создать SimpleMessageListenerContainer для каждой из них. Однако будет легко иметь только одного generic слушателя, получать сообщения из всех этих очередей и далее выполнять некоторую routing логику в целевом обработчике сообщений. Если вы создаете очереди вручную, это только один способ обработки их через прослушиватель — использовать addQueueNames во время выполнения. - person Artem Bilan; 08.07.2014