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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 11:27:03