如何根据配置条件启用对应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
相关产品推荐
相关产品推荐

