Spring Boot中如何在Server实例禁用@SqsListener,仅在Worker实例运行?
解决方法
有几种简单直接的方式可以实现只在Worker实例中启用@SqsListener,Server实例禁用:
方法1:用配置属性控制Bean加载
把监听器逻辑放到单独的组件类中,通过@ConditionalOnProperty注解根据配置属性决定是否加载这个Bean:
@Component @ConditionalOnProperty(name = "sqs.worker.enabled", havingValue = "true", matchIfMissing = false) public class SqsMessageListener { private static final Logger log = LoggerFactory.getLogger(SqsMessageListener.class); @SqsListener("queue_name") public void loadMessagesFromQueue(Object message) { log.info("inside loadMessagesFromQueue"); log.info("Queue Messages: " + message); } }
然后在实例的配置文件里设置:
- Worker实例:
sqs.worker.enabled=true - Server实例:
sqs.worker.enabled=false(或者不配置这个属性,因为matchIfMissing=false会默认不加载)
方法2:用Spring Profiles区分实例角色
给监听器组件指定专属的profile,只有激活该profile时才会创建这个Bean:
@Component @Profile("worker") public class SqsMessageListener { private static final Logger log = LoggerFactory.getLogger(SqsMessageListener.class); @SqsListener("queue_name") public void loadMessagesFromQueue(Object message) { log.info("inside loadMessagesFromQueue"); log.info("Queue Messages: " + message); } }
启动实例时通过参数指定profile:
- Worker实例启动参数:
--spring.profiles.active=worker - Server实例直接启动(不指定worker profile,默认不会加载这个监听器Bean)
这两种方法都能精准控制监听器的启用范围,根据你的部署习惯选择即可。
内容的提问来源于stack exchange,提问作者akhil
相关产品推荐
相关产品推荐

