Как работать с 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 на стороне сервера.

Другие вопросы по тегам