动态SendTo注释

时间:2016-02-23 17:04:24

标签: rabbitmq amqp spring-amqp spring-rabbit rabbitmq-exchange

我有以下Java代码从队列接收消息,处理它并将处理过的消息写入另一个队列。

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

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

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

知道怎么做吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

如果发件人设置了replyTo邮件属性(队列名称或exchange/routkingKey),则容器将使用该属性。仅当消息中没有@SendTo时才会使用replyTo

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

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

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

检索它。

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

修改

Starting with version 1.6, the @SendTo can be a SpEL expression that is evaluated at runtime against the request and reply@SendTo("!{'some.reply.queue.with.' + result.queueName}")

答案 1 :(得分:0)

不幸的是我无法对发件人的邮件进行任何更改,看起来SpEL表达式在这种情况下无法解决我的问题。但我找到了一个解决方法。我不确定它是否是一个好的做法,但它现在解决了我的问题。

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

感谢您的回答,我希望我们能够建立一种机制,以便在收到消息后确定@SendTo值。