我刚刚开始尝试Spring和rabbitMQ。
我想用兔子和春天创建一个微服务基础架构,
我一直在关注Spring boot tutorial
但这是非常简单的。我也正在查看有关如何创建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 Documentation。
通常,您可以将SimpleMessageListenerContainer
与POJO侦听器连接在一起以进行RPC。
模板receiveAndReply
方法适用于“计划的”服务器端RPC-即仅在您需要时接收(并回复),而不是在消息到达队列时接收。它不会阻止等待消息。
如果要使用receiveAndReply()
,则有一个test case that illustrates it。
编辑:
此代码...
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
将为false。这段代码:
Message receive = this.template.receive();
收到答复。
这个测试有点人为,因为答复被发送到与请求相同的队列中。在此测试中,我们无法在客户端使用
sendAndReceive()
,因为线程将阻止等待答复(并且我们需要执行receiveAndReply()
)。Another test in that class有一个更现实的示例,其中在不同线程上执行
sendAndReceive()
,在主线程上执行receiveAndReply()
。请注意,该测试在客户端使用侦听器容器进行答复。通常不再需要,因为Rabbit Broker现在支持direct reply-to。
添加
receiveAndReply()
是为了对称-在大多数情况下,人们将侦听器容器和侦听器适配器用于服务器端RPC。