【问题标题】:How to configure rabbitmq reply queues using spring-amqp?如何使用 spring-amqp 配置 rabbitmq 回复队列?
【发布时间】:2013-11-08 09:42:41
【问题描述】:

我们正在尝试使用 Spring AMQP 在 RabbitMQ 中进行异步调用,谁能告诉我如何使用 spring amqp 配置回复队列、correlationId、(属性)?

    String corrId = java.util.UUID.randomUUID().toString();

 BasicProperties props = new BasicProperties
                                .Builder()
                                .correlationId(corrId)
                                .replyTo(replyQueueName)
                                .build();

 channel.basicPublish("", requestQueueName, props, message.getBytes());

【问题讨论】:

    标签: rabbitmq amqp spring-amqp


    【解决方案1】:

    我假设你需要使用RabbitTemplate:

    rabbitTemplate.convertAndSend(requestQueueName, myObj, new MessagePostProcessor() {
       Message postProcessMessage(Message message) throws AmqpException {
          message.getMessageProperties().setReplyTo(replyQueueName);
          return message;  
       }
    }, new CorrelationData(corrId));
    

    HTH

    【讨论】:

    • CorrelationData 用于发布者确认不是一般相关性。使用这种技术,您应该在postProcessMessage 中设置相关ID。或者,正如我在兔子列表上回复的那样,您可以使用模板的...sendAndReceive...() 方法之一,模板将为您处理相关性。
    • 感谢您的回复。在使用 spring amqp 时仍然卡住,下面是 Producer 端的代码。字符串 corrId = UUID.randomUUID().toString(); String replyQueueName = channel.queueDeclare().getQueue(); MessageProperties prop = new MessageProperties(); prop.setCorrelationId(corrId.getBytes()); prop.setReplyTo(replyQueueName);消息消息 = new Message(query.getBytes(), prop);消息消息 = rabbitTemplate.sendAndReceive(message);您能否告诉我如何在此处获取频道以获取回复队列,并请分享消费者代码。提前致谢。
    • 要从消费者那里获得channel,你的messageListener应该实现ChannelAwareMessageListener
    • 感谢比伦的回复。我上面分享的代码在生产者端。我们真的需要在生产者端实现 ChannelAwareMessageListener 吗?
    • 如果您使用来自生产者的rabbitTemplate.sendAndReceive(message);,则没有理由拥有任何correlationreplyQueue。请看加里的回答