我刚刚开始尝试Spring和rabbitMQ。
我想用兔子和春天创建一个微服务基础架构,
我一直在关注Spring boot tutorial

但这是非常简单的。我也正在查看有关如何创建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 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。

10-08 12:50