我目前有一个JMSListener,如下所示 . 它使用属性文件中值的选择器 . 这很好用 .
@JmsListener(destination = "myQueueDest",
selector = MyHeaders.SELECTOR_KEY + " = '${myapp.selector_val}'")
private void consumeData(MyCustomObj mycustomObj) { }
我现在需要在内存中使用带有值的动态选择器,而不是spring属性 . 有没有办法使用JMSListener(或其他一些监听器mechnaism)从ActiveMQ队列中进行选择?
更新:
可以为我的 @JMSListener
分配一个ID,然后从我的 JmsListenerEndpointRegistry
bean中检索它 . 按ID获取侦听器容器,将其强制转换为 DefaultMessageListenerContainer
,然后调用 setMessageSelector()
,尽管我不确定这是否可行 .
这需要将我的DefaultJmsListenerContainerFactory bean设置为具有 CACHE_SESSION
的缓存级别 .
但这似乎不起作用,因为监听器接收所有消息,无论我设置消息选择器是什么 .
2 回答
JMS规范说在创建使用者时必须提供选择字符串 . 所以答案是否定的 . 必须使用不同的选择字符串关闭和重新创建使用者,以接收符合不同选择条件的消息 .
如果您的项目不是必须使用JMS API,那么您可以使用Active MQ的本机API进行探索 . 我确信每次调用receive时API都会有一种指定不同选择字符串的方法 . IBM MQ的本机API提供了这样的功能 .
如其中一条评论所述:
这个例子解释了如何在启动时进行设置,但是可以通过一些技巧来动态地进行设置:
和CustomJmsListenerContainerFactory