繁体   English   中英

如何使用rabbitTemplate receiveAndReply

[英]How to work with rabbitTemplate receiveAndReply

我刚刚开始尝试Spring和rabbitMQ。 我想用Rabbit和spring创建一个微服务基础设施,我一直在关注Spring引导教程

但这是非常简单的。 我也正在查看有关如何创建RPC的文档( springsRabbit ),我了解Rabbits的方法,但是我想利用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"; }); } } 

但是,收到消息但什么也没回来,这并不奇怪,这不起作用。 我认为这需要在bean创建级别的工厂/模板中的某个地方注册,但是我似乎不了解文档的位置,可悲的是不清楚。

首先,请使用Spring AMQP文档

通常,您将使用与POJO侦听SimpleMessageListenerContainer连接的SimpleMessageListenerContainer进行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() S中的主线程上。

请注意,该测试在客户端使用侦听器容器进行答复。 通常不再需要此功能,因为Rabbit Broker现在支持直接回复

为对称receiveAndReply()添加了receiveAndReply() -在大多数情况下,人们将侦听器容器和侦听器适配器用于服务器端RPC。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM