Как работать с rabbitTemplate receiveAndReply
Я только начал экспериментировать с Spring и rabbitMQ. Я хотел бы создать микросервисную инфраструктуру с кроликом и весной, я следую учебному пособию по загрузке Spring
Но это очень упрощенно. Кроме того, я просматриваю документацию ( пружины, Кролик) о том, как создать RPC, я понимаю подход Кроликов, но я хотел бы использовать шаблон Spring, чтобы спасти меня.
Я просто не могу понять, где зарегистрировать обратный вызов reciveAndReplay в.
Я пытался сделать это:
отправка
System.out.println("Sending message..."); Object convertSendAndReceive = rabbitTemplate.convertSendAndReceive("spring-boot", "send and recive: sent"); System.out.println("GOT " + convertSendAndReceive); //is null
получение
@Component public class Receiver { @Autowired RabbitTemplate rabbitTemplate; public void receiveMessage(String message) { this.rabbitTemplate.receiveAndReply("spring-boot", (Message)->{ return "return this statement"; }); } }
Но это не большой сюрприз, это не работает, сообщение получено, но ничего не возвращается. Я предполагаю, что это должно быть зарегистрировано где-то в фабрике / шаблоне на уровне создания бина, но я не понимаю, где и к сожалению документация неясна.
1 ответ
Во-первых, пожалуйста, используйте Spring AMQP Documentation.
Вы бы обычно использовали SimpleMessageListenerContainer
связан со слушателем POJO для RPC.
Шаблон receiveAndReply
Метод предназначен для "запланированного" RPC на стороне сервера - т.е. получать (и отвечать) только тогда, когда вы хотите, а не всякий раз, когда сообщение приходит в очередь. Не блокирует ожидание сообщения.
Если вы хотите использовать receiveAndReply()
есть тестовый пример, который это иллюстрирует.
РЕДАКТИРОВАТЬ:
Этот код...
this.template.convertAndSend(ROUTE, "test");
отправляет сообщение в очередь.
Этот код...
this.template.setQueue(ROUTE);
boolean received = this.template.receiveAndReply(new ReceiveAndReplyMessageCallback() {
@Override
public Message handle(Message message) {
message.getMessageProperties().setHeader("foo", "bar");
return message;
}
});
Получает сообщение и из этой очереди; добавляет заголовок и возвращает то же сообщение в очередь ответов. received
будет ложным, если не было сообщения для получения (и ответа на него).
Этот код:
Message receive = this.template.receive();
получает ответ.
Этот тест немного надуманный, потому что ответ отправляется в ту же очередь, что и запрос. Мы не можем использовать sendAndReceive()
на стороне клиента в этом тесте, потому что поток будет блокировать ожидание ответа (и нам нужно выполнить receiveAndReply()
).
Другой тест в этом классе имеет более реалистичный пример, где он делает sendAndReceive()
S на разных темах и тому receiveAndReply()
с основной темой.
Обратите внимание, что этот тест использует контейнер слушателя на стороне клиента для ответов; как правило, в этом больше нет необходимости, поскольку брокер кроликов теперь поддерживает прямой ответ.
receiveAndReply()
был добавлен для симметрии - в большинстве случаев люди используют контейнер слушателя и адаптер слушателя для RPC на стороне сервера.