java - JMSListener - 动态选择器

标签 java jms activemq spring-jms

我目前有一个 JMSListener,如下所示。它使用属性文件中的值选择器。这工作得很好。

 @JmsListener(destination = "myQueueDest",
     selector = MyHeaders.SELECTOR_KEY + " = '${myapp.selector_val}'")
 private void consumeData(MyCustomObj mycustomObj) { }

我现在需要使用具有内存中值的动态选择器,而不是 spring 属性。有没有办法使用 JMSListener (或其他一些监听器机制)来从 ActiveMQ 队列中进行选择?

更新:

可以为我的 @JMSListener 分配一个 ID,然后从我的 JmsListenerEndpointRegistry bean 中检索它。通过 ID 获取监听器容器,将其转换为 DefaultMessageListenerContainer,然后调用 setMessageSelector(),尽管我不完全确定这是否有效。

这需要将我的 DefaultJmsListenerContainerFactory bean 设置为具有 CACHE_SESSION 的缓存级别。

但这似乎不起作用,因为无论我将消息选择器设置为什么,监听器都会拾取所有消息。

最佳答案

JMS 规范规定在创建使用者时必须提供选择字符串。所以答案是否定的。消费者必须关闭并使用不同的选择字符串重新创建,才能接收匹配不同选择标准的消息。

如果您的项目不需要使用 JMS API,那么您可以探索使用 Active MQ 的 native API。我确信 API 将有办法在每次调用接收时指定不同的选择字符串。 IBM MQ 的 native API 提供了这样的功能。

关于java - JMSListener - 动态选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39472329/

相关文章:

jboss - 在 JBoss 6.0 中延迟启动 JMS 监听器 (MDB)

java - ActiveMQ Broker RedeliveryPlugin 消息存储

java - 有没有办法在 JUnit 测试中使用 JMS?

eclipse - 导入 Guava 源时无法解析导入 javax.inject

java - 按需类型导入声明导入什么?

java - 为什么我得到 UNAUTHORIZED_DOMAIN :Domain not whitelisted by project?

java - 如何使用 ActiveMQ 消费来自虚拟主题的消息?

java - 如何在 Apache Tomee 下配置 ActiveMQ 内存设置?

spring - 消息发送后立即检索 JMS header 而不消耗消息

java - 重写和隐藏父类(super class)的静态方法有什么区别