[英]How to work with rabbitTemplate receiveAndReply
我刚刚开始尝试Spring和rabbitMQ。 我想用Rabbit和spring创建一个微服务基础设施,我一直在关注Spring引导教程
但这是非常简单的。 我也正在查看有关如何创建RPC的文档( springs , Rabbit ),我了解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.