如何停止 replyTo 以便 @SendTo 工作

How to stop replyTo so that @SendTo works

我在一个名为 "MyService" 的 class 中有 Java 与此类似的代码,用于接收消息、处理传递的对象和 return 响应,目的是使用配置的交换和路由密钥获得 returned 响应,如使用 @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 文档和这个 post:Dynamic SendTo annotation 状态:

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

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

在此先致谢。

correlationId 是发件人的; direct reply-to 不需要它,因为频道已保留;您可以在发送方添加 MessagePostProcessor 以添加 correlationId.

如果没有 reply_to header.

@SendTo 是一个后备方案

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

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

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

如果你的意思是你想在其他地方发送一个初始回复做一些更多的工作然后最终回复发起者,那么你应该在另一个 header 中保存 replyTo 并恢复它(或者使用引用 saved-off header).

的表达式