动态 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 注释的主要内容,如果未能解决你的问题,请参考以下文章