В настоящее время у меня есть FooListener
который слушает очередь, содержащую сообщения Foo
. Как добавить еще BarListener
класс BarListener
для прослушивания одной очереди для сообщений Bar
?
Мой RabbitMQ в настоящее время настроен следующим образом:
@Configuration
public class RabbitMQConfig {
@Bean
public MessageListenerContainer messageListenerContainer() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueues(workQueue());
container.setMessageListener(new MessageListenerAdapter(fooListener(), new JsonMessageConverter()));
container.setDefaultRequeueRejected(false);
return container;
}
}
В настоящее время нет встроенной поддержки для маршрутизации к различным слушателям в соответствии с типом полезной нагрузки.
Вы можете написать простую оболочку слушателя...
public void handleMessage(Object payload) {
if (payload instanceof Foo) {
this.fooListener.handleMessage((Foo) payload);
}
else if (payload instanceof Bar) {
this.barListener.handleMessage((Bar) payload);
}
else {
// unexpected payload type
}
}
РЕДАКТИРОВАТЬ:
Spring AMQP 1.5 (в настоящее время на этапе 1 - 1.5.0.M1) теперь поддерживает эту функцию; посмотреть, что нового и объявить в блоге.
Используйте ту же очередь для разных сообщений, я думаю, что это не самый лучший вариант.
У вас может быть один обмен с двумя ключами маршрутизации и разными связями с двумя очередями. Другой способ - использовать обертку, как говорит Гэри Расселл, но отливки не имеют хорошей производительности, и, кроме того, это решение не очень "принцип единой ответственности".
С уважением.