动态 SendTo 注释

Posted

技术标签:

【中文标题】动态 SendTo 注释【英文标题】:Dynamic SendTo annotation 【发布时间】:2016-06-05 15:41:59 【问题描述】:

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

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

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

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

知道怎么做吗?

提前致谢

【问题讨论】:

【参考方案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")

【讨论】:

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")【参考方案2】:

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

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

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

【讨论】:

以上是关于动态 SendTo 注释的主要内容,如果未能解决你的问题,请参考以下文章

Spring框架web sockets独特的@SendTo注解

SVG 中的动态注释

数据注释/验证和动态值

java 动态代理示例,带主要注释

JSP ---[注释,指令,静态包含,动态包含]

如何在 @Table 注释中动态设置模式名称