springboot 应用程序中的 Jmslistener 不起作用

问题描述

我已经设置了一个 Kotlin Springboot 应用程序并尝试侦听 MQ 队列,但侦听器不工作。应用程序正在运行,我删除了一条消息,但 JmsListener 没有接收到它。我的代码如下。

@SpringBootApplication
@EnableJms
open class MainApplication

fun main(args: Array<String>) {
    runApplication<MainApplication>(*args)
}
@Configuration
open class MqConfig {
    @Value("\${jms.mq.port}")
    private var port: Int = 0

    @Value("\${jms.mq.channel}")
    private var channel: String? = null

    @Value("\${jms.mq.host}")
    private var host: String? = null

    @Value("\${jms.mq.manager}")
    private var queueManager: String? = null

    @Bean
    open fun jmsMQConnectionFactory(): MQConnectionFactory {
        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(true)
        return factory
    }
@Component
class QueueListener {

    @JmsListener(destination = "\${jms.mqA.queue}",containerFactory = "jmsListenerContainerFactory")
    @Throws(JMSException::class)
    fun receiveMessge(message: Message) {
        println((message as TextMessage).text)
    }

我的代码有什么明显的错误吗?为什么发布者不工作?在日志中,我什么也没看到,消息仍然在 MQ 上(我的听众没有收到)......如何调试?任何帮助表示赞赏。

解决方法

@Shashi 确实有道理。如果您有 factory.setPubSubDomain(true),那么尽管您的 Spring 代码没有改变,但您使用的是主题而不是队列。

因此,我希望 jms.mqA.queue 中的 application.properties 是一个主题而不是一个队列。

我知道这只是推测,所有这一切都取决于您在 jms.mqA.queue 中设置的 application.properties,但您还没有分享那一点配置。将它命名为 jms.mqA.queue 有点误导,我会选择 jms.mqA.destination

评论讨论后添加。

这可能有点矫枉过正,但请尝试将以下装饰添加到您的应用程序中。

@SpringBootApplication
@EnableIntegration
@EnableJms
@ComponentScan
@EnableAutoConfiguration