Java 如何使用rabbitTemplate receiveAndReply

Java 如何使用rabbitTemplate receiveAndReply,java,spring,rabbitmq,spring-rabbit,Java,Spring,Rabbitmq,Spring Rabbit,我刚刚开始试验Spring和rabbitMQ。 我想用rabbit和spring创建一个微设备基础设施, 我一直在跟踪 但这是非常简单的。此外,我正在查看有关如何创建RPC的文档(,),我了解兔子的方法,但我想利用Spring模板来保存样板文件 我似乎不明白在哪里注册reciveAndReplay回调 我试着这样做: 发送 接收 但这并不是一个很大的惊喜,它不起作用的消息收到,但没有回来。我假设这需要在bean创建级别的工厂/模板中的某个地方注册,但我似乎不知道在哪里,遗憾的是文档不清楚。首先,

我刚刚开始试验Spring和rabbitMQ。 我想用rabbit和spring创建一个微设备基础设施, 我一直在跟踪

但这是非常简单的。此外,我正在查看有关如何创建RPC的文档(,),我了解兔子的方法,但我想利用Spring模板来保存样板文件

我似乎不明白在哪里注册reciveAndReplay回调

我试着这样做:

发送

接收

但这并不是一个很大的惊喜,它不起作用的消息收到,但没有回来。我假设这需要在bean创建级别的工厂/模板中的某个地方注册,但我似乎不知道在哪里,遗憾的是文档不清楚。

首先,请使用

您通常会使用与RPC的POJO侦听器连接的
SimpleMessageListenerContainer

template
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;
        }
    });
向队列发送消息

此代码

    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;
        }
    });
从该队列接收消息和消息;添加标头并将相同的消息返回到应答队列<如果没有要接收(和回复)的消息,则代码>已接收将为false

此代码:

    Message receive = this.template.receive();
收到答复

这个测试有点做作,因为应答被发送到与请求相同的队列。在这个测试中,我们不能在客户端使用
sendAndReceive()
,因为线程会阻止等待回复(我们需要执行
receiveAndReply()

有一个更现实的例子,它在不同的线程上执行
send和receive()
s,在主线程上执行
receiveAndReply()
s

注意,该测试在客户端使用侦听器容器进行应答;这通常不再需要,因为兔子代理现在支持


receiveAndReply()
是为了对称而添加的-在大多数情况下,人们使用侦听器容器和侦听器适配器来进行服务器端RPC。

因此,基本上receiveAndReply并不是名副其实的。您的建议是只使用receiver类做一些事情,然后返回一条具有相关id的消息。。。它确实名副其实,只要有消息就行。正如您从这些测试中看到的,它按预期工作。然而,这是一个主动的,而不是被动的行动。对于被动RPC,使用侦听器容器和侦听器适配器。我假设“receiveAndReply”将接收一条消息,然后立即重播到该消息,也许我对术语缺乏理解,因为我对这一点非常陌生,或者我需要多读一些关于这一点的内容,因为即使从文档和您的解释来看,关于如何使用ReceiveandPlay仍然非常不清楚。(如何将回调视为“活动”操作…)这正是我为您指出的测试所做的;我将更清楚地编辑答案-我们显然没有在术语上建立联系。回调是被动的,但是您的代码必须调用
receiveAndReply
(这就是我所说的主动)。