如何停止回复以便@SendTo正常工作

时间:2018-05-25 22:08:37

标签: rabbitmq spring-amqp spring-rabbit

我在名为“MyService”的类中使用与此类似的Java代码来接收消息,处理传递的对象并返回响应,并打算使用配置的交换和路由密钥返回响应,如使用@SendTo注释:

@RabbitListener(containerFactory = "myContainerFactory", queues = RabbitConfig.MY_QUEUE_NAME)
@SendTo("#{T(com.acme.config.RabbitOutboundConfig).OUTBOUND_EXCHANGE_NAME + '/' + myService.getRoutingKey()}")
public OrderResponse handlePaidOrder(Order order) {
    // do processing on the input Order object here...
    OrderResponse orderResponse = new OrderResponse();
    // fill up response object here
    return orderResponse;
}

public String getRoutingKey() {
    String routingKey;
    // .. custom logic to build a routing key
    return routingKey;
}

这很有道理,也很好用。我遇到的问题是我无法弄清楚如何阻止“reply_to”属性进入消息。我知道我的发件人是否通过调用setReplyAddress来配置RabbitTemplate,这将在消息中产生reply_to属性和correlation_id。

但是,如果我只是不调用setReplyAddress,我仍然会得到一个reply_to属性,如下所示:

reply_to:amq.rabbitmq.reply-to.g2dkAAxyYWJiaXRAd3NK等等

并且在消息中使用该reply_to,@ SendTo无效。 Spring AMQP文档和这篇文章:Dynamic SendTo annotation州:

@SendTo仅在消息中没有replyTo时使用。

此外,当我不在RabbitTemplate上调用setReplyAddress时,我也没有得到相关id。我很确定我会需要那个。所以,我的问题是,如何让我的发送者生成相关id但不生成回复,以便我的接收者可以使用@SendTo注释?

非常感谢。

1 个答案:

答案 0 :(得分:0)

correlationId用于发件人;由于频道是保留的,所以不需要直接回复;您可以在发送方添加MessagePostProcessor以添加correlationId。

@SendTo是一个后备,以防没有reply_to标题。

如果要更改该行为,可以向侦听器容器添加afterReceivePostProcessor以删除replyTo上的MessageProperties属性。

container.setAfterReceivePostProcessor(m -> {
        m.getMessageProperties().setReplyTo(null);
        return m;
}

请记住,如果发件人设置了回复,他可能会期待回复,因此在其他地方发送回复会让他失望并且可能会导致一些延迟,直到回复超时。

如果你的意思是你想在其他地方发送初步回复做更多的工作然后最终回复发起者,那么你应该将replyTo保存在另一个标题中,然后恢复它(或者使用引用它的表达式)已保存的标题)。