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
相关产品推荐
相关产品推荐

