问题描述
我已经设置了一个 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