【问题标题】:How to stop replyTo so that @SendTo works如何停止回复以便 @SendTo 工作
【发布时间】:2018-11-05 08:09:27
【问题描述】:

我在一个名为“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 state:

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

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

非常感谢。

【问题讨论】:

    标签: rabbitmq spring-amqp spring-rabbit


    【解决方案1】:

    correlationId 是给发送者的;由于频道已保留,因此不需要直接回复;您可以在发送端添加MessagePostProcessor 以添加correlationId。

    @SendTo 是在没有 reply_to 标头的情况下的后备。

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

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

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

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

    【讨论】:

    • 但是请记住,如果发件人设置了一个回复,他很可能会期待回复,因此将回复发送到其他地方会让他失望,并且可能会导致一些延迟,直到回复超时。
    • 很好的答案,加里。这帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2012-03-23
    • 2012-02-02
    • 2017-04-20
    • 2018-12-04
    • 2012-08-09
    相关资源
    最近更新 更多