0

我有如下Java代码来接收来自队列的消息,处理它并将处理后的消息写入另一个队列。

    @RabbitListener(queues = "rawFusion")
    @SendTo("Fusion")
    public String receiverFusion(Object _message) {
        String message = getMessage(_message);
        return messageParser.parse(message);
    }

在这里,我总是从“rawFusion”队列中获取消息并将其写入“Fusion”队列。

我想做的是,根据某些条件将消息写入不同的队列。所以我想 在收到来自“RawFusion”队列的消息后决定@SendTo参数(或者可能不使用)。@SendTo

知道怎么做吗?

提前致谢

4

2 回答 2

1

如果发送者设置replyTo消息属性(队列名称或exchange/routkingKey),容器将使用它。@SendTo仅在消息中没有时replyTo使用。

如果您无法更改发件人,则在使用 @RabbitListener 时,@SendTo可以包含 SpEL 表达式,但它没有来自请求的任何上下文,我怀疑您需要智能地路由回复。

您可以将某些内容存储在 ThreadLocal 中并使用

@SendTo("#{someBean.someMethod()}")

检索它。

我将打开一个 JIRA 问题,看看我们是否可以提出一种机制来为评估提供一些上下文(例如输入参数)。

编辑

从 1.6 版开始,@SendTo 可以是一个 SpEL 表达式,在运行时针对 request 和 reply 进行评估@SendTo("!{'some.reply.queue.with.' + result.queueName}")

于 2016-02-23T17:39:32.923 回答
0

不幸的是,我无法对发件人的消息进行任何更改,而且在这种情况下,SpEL 表达式似乎无法解决我的问题。但我找到了解决方法。我不确定这是否是一个好习惯,但它现在解决了我的问题。

我用@SendTo("exchange/")我没有使用任何路由密钥。在我的消息中,我设置了一个标头值,例如“destination=testQueue”,并创建了一个标头交换,它根据目标值路由我的消息。

感谢您的回答,我希望我们可以有一个机制,我们可以@SendTo在收到消息后确定价值。

于 2016-02-23T23:42:54.023 回答