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

Kotlin SpringBoot应用JmsListener无法监听IBM MQ队列问题求助

核心错误点
  • 队列/主题模式不匹配:你在jmsListenerContainerFactory中设置了factory.setPubSubDomain(true),该配置代表开启发布订阅(Topic)模式,而你监听的是点对点队列(Queue),模式不匹配导致监听器只会监听主题类消息,自然无法消费队列中的留存消息,将该配置改为false即可适配队列模式。
  • 连接工厂返回类型不匹配:jmsMQConnectionFactory方法声明返回MQConnectionFactory类型,但实际返回的是Spring封装的SingleConnectionFactory实例,Kotlin强类型校验下会导致连接工厂初始化异常,Spring无法拿到有效的MQ连接,将方法返回值改为ConnectionFactory即可。
  • 监听方法未加open修饰:Kotlin类的方法默认是final修饰,无法被Spring代理,@JmsListener标注的方法需要被Spring动态代理才能触发监听逻辑,需要给receiveMessge方法添加open修饰符。
  • (可选优化)拼写笔误:receiveMessge方法名拼写错误,应为receiveMessage,不影响运行但会降低代码可读性。
修复后的关键代码示例

连接工厂配置

@Bean
open fun jmsMQConnectionFactory(): ConnectionFactory { // 修改返回类型为ConnectionFactory
    val mqQueueConnectionFactory = MQConnectionFactory()
    mqQueueConnectionFactory.port = port
    mqQueueConnectionFactory.channel = channel
    mqQueueConnectionFactory.hostName = host
    mqQueueConnectionFactory.queueManager = queueManager
    mqQueueConnectionFactory.transportType = WMQConstants.WMQ_CM_CLIENT
    mqQueueConnectionFactory.setStringProperty(WMQConstants.WMQ_MQMD_WRITE_ENABLED, "true")
    return SingleConnectionFactory(mqQueueConnectionFactory)
}

监听容器工厂配置

@Bean
open fun jmsListenerContainerFactory(): JmsListenerContainerFactory<*> {
    val factory = DefaultJmsListenerContainerFactory()
    factory.setAutoStartup(true)
    factory.setConnectionFactory(jmsMQConnectionFactory())
    factory.setPubSubDomain(false) // 修改为false适配队列模式
    factory.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE) // 新增自动确认配置
    return factory
}

监听器代码

@Component
class QueueListener {
    @JmsListener(destination = "\${jms.mqA.queue}", containerFactory = "jmsListenerContainerFactory")
    @Throws(JMSException::class)
    open fun receiveMessage(message: Message) { // 加open修饰,修正拼写
        println((message as TextMessage).text)
    }
}
调试排查步骤

如果修改后仍然无法消费,可按以下步骤排查:

  • 开启JMS和IBM MQ的debug日志,确认连接、监听器容器初始化正常,没有隐藏的连接报错,在配置文件中添加:
logging:
  level:
    org.springframework.jms: debug
    com.ibm.mq: debug
  • 核对配置文件中jms.mqA.queue的队列名称和你投递消息的队列完全一致,IBM MQ队列名称对大小写敏感,注意排除前后空格、拼写错误问题
  • 到IBM MQ控制台确认你投递的消息确实存在目标队列中,没有被其他消费者提前消费
  • 临时去掉@JmsListener的containerFactory配置,使用Spring Boot自动装配的默认容器工厂,排除自定义配置的影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 13:12:00