如何使用rabbitTemplate receiveAndReply

时间:2015-06-02 12:29:13

标签: java spring rabbitmq spring-rabbit

我刚开始尝试使用Spring和rabbitMQ。 我想用兔子和弹簧创建一个微服务基础设施, 我一直关注Spring boot tutorial

但这非常简单。我正在查看文档(springsRabbit)以了解如何创建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创建级别的工厂/模板中的某处注册,但我似乎并不了解文档的位置和遗憾。

1 个答案:

答案 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。