Как выполнить тематическое потребление на RabbitMq?

Я новичок в RabbitMq и AMQP, но у меня есть некоторый опыт работы с ActiveMQ и JMS. Я пытаюсь опубликовать сообщение в теме (тема как тема в JMS) и получить это сообщение от нескольких слушателей. Например, я публикую сообщение о том, что в системе появился новый пользователь, и один потребитель отправляет электронное письмо этому пользователю, а другой потребитель индексирует этого пользователя в elasticsearch. Таким образом, каждый потребитель должен прочитать сообщение, пока его нельзя будет удалить из темы.

Я пробовал использовать TopicExchange следующим образом:

@Bean
public TopicExchange profileExchange() {
    return new TopicExchange(PROFILE_EXCHANGE, true, false);
}

@Bean
public Queue putProfileQueue() {
    return new Queue(this.PUT_PROFILE_QUEUE);
}

@Bean
public Binding putProfileBinding() {
    return BindingBuilder.bind(putProfileQueue()).to(profileExchange()).with(PUT_PROFILE_QUEUE);
}

И у меня есть два заявленных слушателя.

Но как только первый слушатель прочитает сообщение, оно удаляется из очереди, а второй слушатель не читает сообщение.

Я не уверен, что правильно понимаю различную конфигурацию AMQP и какую из них я должен использовать для имитации шаблона «тема», который я знал в JMS.


person Hugo Lassiège    schedule 14.08.2014    source источник


Ответы (1)


Вы бы использовали обмен fanout - каждому потребителю нужна своя собственная очередь, привязанная к обмену.

См. руководства.

person Gary Russell    schedule 14.08.2014
comment
Почему бы не topic обмениваться с отдельными очередями для конкретных потребителей? - person pinepain; 15.08.2014
comment
Это тоже сработает (вы также можете сделать это с direct обменом), но большинство считает, что наиболее близким к теме JMS (pub / sub) является обмен fanout. Обмен topic обычно используется для предоставления функций, аналогичных выражению messageSelector JMS, но, вы правы, несколько потребителей могут выбрать одно и то же сообщение с соответствующей привязкой. - person Gary Russell; 15.08.2014