Отправляйте и получайте на обмене фан-аутом RabbitMQ через Spring

Я работаю с RabbitMQ, и меня смущает использование разветвленного обмена и convertSendAndReceive (или sendAndReceive) метода класса RabbitTemplate.

Например, у меня есть 2 потребителя для долговременных очередей QUEUE-01 и QUEUE-02, которые привязаны к надежному обмену разветвлениями FANOUT-01. И 1 издатель FANOUT-01. Я понимаю, что происходит, когда сообщение публикуется с помощью метода convertAndSend (или send), сообщение будет скопировано в каждую очередь и будет обрабатываться каждым потребителем. Но я не уверен, что будет, если я вызову метод sendAndReceive? От какого потребителя я получу ответ? Есть какое-то конкретное поведение? Я не смог найти никакой документации по этому поводу.


person NikolayK    schedule 22.07.2015    source источник


Ответы (2)


sendAndReceive() не подходит для fanout обмена сообщениями; неизвестно, какой ответ победит (как правило, первый). Если вы хотите обрабатывать несколько ответов и агрегировать их, вам нужно будет использовать дискретные вызовы send и receive (или контейнер слушателя для ответов) и выполнить агрегирование самостоятельно.

Рассмотрите возможность использования Spring Integration для таких ситуаций. Он имеет встроенные компоненты для агрегирования сообщений.

person Gary Russell    schedule 22.07.2015
comment
Спасибо за ответ! Это именно то, о чем я думал, но не нашел никаких доказательств. Не могли бы вы предоставить дополнительную информацию об использовании дискретных send и receive вызовов? Может есть примеры? - person NikolayK; 22.07.2015
comment
receive() не блокируется (хотя в следующем выпуске 1.5 есть возможность сделать это). Так что, вероятно, проще всего использовать асинхронный потребитель для ответов. Мне не известен какой-либо конкретный пример для вашего варианта использования, но его довольно легко настроить; см. документацию. - person Gary Russell; 22.07.2015

Метод sendAndReceive в RabbitTemplate используется, когда вы хотите использовать обмен сообщениями в стиле RPC. Здесь можно найти отличное руководство .

person joshuad2    schedule 22.07.2015