我刚开始尝试使用Spring和rabbitMQ。 我想用兔子和弹簧创建一个微服务基础设施, 我一直关注Spring boot tutorial
但这非常简单。我正在查看文档(springs,Rabbit)以了解如何创建RPC,我理解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创建级别的工厂/模板中的某处注册,但我似乎并不了解文档的位置和遗憾。
答案 0 :(得分:2)
首先,请使用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
将是假的。
此代码:
Message receive = this.template.receive();
收到回复。
此测试有点人为,因为回复会发送到与请求相同的队列。在此测试中,我们无法在客户端使用sendAndReceive()
,因为线程会阻止等待回复(我们需要执行receiveAndReply()
)。
Another test in that class有一个更现实的例子,它在不同的线程上执行sendAndReceive()
,在主线程上执行receiveAndReply()
。
请注意,该测试使用客户端的侦听器容器进行回复;由于兔子经纪人现在支持direct reply-to,所以通常不再需要。
为了对称而添加了 receiveAndReply()
- 在大多数情况下,人们使用侦听器容器和侦听器适配器来进行服务器端RPC。