我刚刚开始尝试 Spring 和rabbitMQ。 我想用rabbit和spring创建一个微服务基础设施, 我一直在关注Spring boot tutorial
但这非常简单。我也在查看文档( springs 、 Rabbit )以了解如何创建 RPC,我了解 Rabbits 方法,但我想利用 Spring 模板来保存样板文件。
我似乎无法理解在哪里注册 receiveAndReplay 回调。
我尝试这样做:
正在发送
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 .
您通常会使用与 POJO 监听器连接的 SimpleMessageListenerContainer
进行 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;
}
});
从该队列接收消息;添加 header 并将相同的消息返回到回复队列。如果没有消息要接收(和回复),received
将为 false。
这段代码:
Message receive = this.template.receive();
收到回复。
这个测试有点人为,因为回复被发送到与请求相同的队列。在此测试中,我们无法在客户端使用 sendAndReceive()
,因为线程会阻塞等待回复(并且我们需要执行 receiveAndReply()
)。
Another test in that class有一个更实际的示例,它在不同线程上执行 sendAndReceive()
,并在主线程上执行 receiveAndReply()
。
请注意,该测试使用客户端的监听器容器进行回复;通常不再需要,因为兔子经纪人现在支持 direct reply-to .
receiveAndReply()
是为了对称性而添加的 - 在大多数情况下,人们使用监听器容器和监听器适配器来进行服务器端 RPC。
关于java - 如何使用rabbitTemplate receiveAndReply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30596119/