如何配置和启用 JMS 侦听器以根据某些条件使用消息?

Posted

技术标签:

【中文标题】如何配置和启用 JMS 侦听器以根据某些条件使用消息?【英文标题】:How to configure and enable a JMS Listener to consume messages based on some condition? 【发布时间】:2022-01-01 15:17:08 【问题描述】:

我的应用程序中有两个侦听器(fooMessagesbarMessages),它们都连接到同一个队列。在某个时间点,只有一个侦听器会根据某种条件使用队列中的消息。在application.yml 文件中,如果fooEnabled 设置为true,则fooMessages 侦听器应使用消息,如果fooEnabled 设置为false,则barMessages 侦听器应使用消息。

听众:

@JMSListener(destination="$queueName", selector = "$selectorName")
public void fooMessages(Message message) 
   // foo logic

    
@JMSListener(destination="$queueName", selector = "$selectorName")
public void barMessages(Message message) 
   // bar logic

application.yml文件:

queueName: myqueue
selectorName: "priority=medium"
fooEnable: true

如何配置监听器来处理这种情况?

【问题讨论】:

【参考方案1】:
    给每个听众一个id 配置容器工厂不自动启动监听器https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.integration.spring.jms.listener.auto-startup 使用JmsListenerEndpointRegistry bean - registry.getListenerContainer("fooListener").start(); 手动启动容器
@Bean
ApplicationRunner runner(@Value("$fooEnabled") boolean fooEnabled, 
        @Value("$barEnabled") boolean barEnabled, JmsListenerEndpointRegistry registry) 
    return args -> 
        if (fooEnabled) ...
    

【讨论】:

以上是关于如何配置和启用 JMS 侦听器以根据某些条件使用消息?的主要内容,如果未能解决你的问题,请参考以下文章

使用线程池的 JMS 侦听器

使用 Spring 启动和停止 JMS 侦听器

JMS 2.0 - 如何接收来自共享消费者主题的消息?

@ConditionalOnProperty注解使用

如何在启动时以编程方式禁用 Spring @JmsListener

Spring + JMS + ActiveMQ实现简单的消息队列(监听器异步实现)