You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据配置条件启用对应JMS Listener消费队列消息?

按需激活JMS监听器的实现方案

以下是两种可直接落地的实现方案:

方案1:基于@ConditionalOnProperty控制监听器实例加载(兼容性最优)

通过Spring条件注解控制对应监听器Bean的加载逻辑,从根源上避免不需要的监听器被注册到JMS上下文。

  • 操作方式:将两个监听器拆分到独立的组件类,分别添加条件注解即可:
// Foo监听器:仅fooEnable为true时实例化并注册
@Component
@ConditionalOnProperty(name = "fooEnable", havingValue = "true", matchIfMissing = false)
public class FooMessageListener {
    @JMSListener(destination="${queueName}", selector = "${selectorName}")
    public void fooMessages(Message message) {
        // foo逻辑
    }
}

// Bar监听器:仅fooEnable为false时实例化并注册
@Component
@ConditionalOnProperty(name = "fooEnable", havingValue = "false")
public class BarMessageListener {
    @JMSListener(destination="${queueName}", selector = "${selectorName}")
    public void barMessages(Message message) {
        // bar逻辑
    }
}
  • 原有application.yml无需额外修改,直接调整fooEnable的值即可切换消费监听器。

方案2:基于autoStartup属性动态启停监听器(无需拆分类)

如果不想调整现有代码结构,可直接利用@JMSListener的autoStartup属性配合SpEL表达式,动态控制监听器是否启动:

@Component
public class CommonMessageListener {
    // foo监听器仅当fooEnable为true时自动启动
    @JMSListener(destination="${queueName}", selector = "${selectorName}", autoStartup = "${fooEnable:false}")
    public void fooMessages(Message message) {
        // foo逻辑
    }
    
    // bar监听器仅当fooEnable为false时自动启动
    @JMSListener(destination="${queueName}", selector = "${selectorName}", autoStartup = "#{!${fooEnable:false}}")
    public void barMessages(Message message) {
        // bar逻辑
    }
}

注意:该方案需要Spring Framework 4.3及以上版本支持,否则无法在autoStartup属性中正确解析占位符和SpEL表达式。

内容的提问来源于stack exchange,提问作者Rushali Atre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:24:04