Spring Boot IBM QUEUE监听器单次读取后停止,如何实现持续监听
Spring Boot IBM MQ持续监听配置解决方案
问题原因
你当前的实现采用JmsTemplate.receive()单次同步拉取接口,且逻辑写在CommandLineRunner.run()方法中,仅会在项目启动完成后执行一次拉取动作,拉取到单条消息后逻辑执行结束,自然不会持续监听后续新消息。
修复方案
改用Spring JMS提供的@JmsListener注解实现异步持久监听,该注解会自动启动后台线程持续监控目标队列,有新消息到达时自动触发回调方法执行。
1. 修改主类代码
删除原有的CommandLineRunner实现逻辑,新增带@JmsListener注解的消息处理方法:
@SpringBootApplication @EnableJms public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); System.out.println("******MQ监听服务启动完成!!!"); } // 持续监听MYQUEUE队列的新消息 @JmsListener(destination = "MYQUEUE") public void handleMqMessage(javax.jms.Message message) { try { String msgBody = ((javax.jms.TextMessage) message).getText(); System.out.println("收到新消息 : " + msgBody); // 按需添加业务处理逻辑 } catch (javax.jms.JMSException e) { e.printStackTrace(); } } }
2. 可选:自定义监听容器配置
如果需要调整并发消费数、消息签收模式等参数,可自定义JmsListenerContainerFactory:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerContainerFactory; import javax.jms.ConnectionFactory; import javax.jms.Session; @Configuration public class JmsCustomConfig { @Bean public JmsListenerContainerFactory<?> jmsListenerContainerFactory(ConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); // 配置并发消费者范围:最小3个,最大10个 factory.setConcurrency("3-10"); // 配置客户端手动签收模式,按需调整为AUTO_ACKNOWLEDGE自动签收 factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE); return factory; } }
3. 确认基础配置
确保application.yml/application.properties中已经配置正确的IBM MQ连接参数:
ibm: mq: queue-manager: 你的队列管理器名称 channel: 你的通道名称 conn-name: 队列服务器地址(端口) user: 用户名 password: 密码
同时确认项目已引入IBM MQ官方Spring Boot Starter依赖:
<!-- Maven依赖示例 --> <dependency> <groupId>com.ibm.mq</groupId> <artifactId>mq-jms-spring-boot-starter</artifactId> <version>对应你的MQ服务版本</version> </dependency>
内容的提问来源于stack exchange,提问作者user1591156
相关产品推荐
相关产品推荐

