我们有一个监听 JMS 队列(WebSphere 7)的 Spring 项目(3.0.5)。我们需要能够打开/关闭队列监听器。我们目前正在通过我们自己的 RESTful 端点以编程方式调用 DefaultMessageListenerContainer.start() 和 stop() 来打开/关闭监听器。
我们观察到,在两次或三次(开/关/开或开/关/开/关/开)切换侦听器后,侦听器进入挂起状态,我们无法将其关闭。
为了调试正在发生的事情,我们将日志级别设置为 Trace。成功打开侦听器后,我们会在日志中看到以下消息:
XXXX-XX-XX [myListenerContainer-1] TRACE cgcrcmMessageListenerContainer - doReceiveAndExecute - 会话 [com.ibm.mq.jms.MQQueueSession@1872c950] 的使用者 [com.ibm.mq.jms.MQQueueReceiver@45486b51] 未收到消息
但是,我们最后一次在监听器挂起之前打开它,我们在日志中没有看到这条消息。
额外细节:
- 无论消息是否进入队列,都可以重现挂起状态。
- 上次我们在监听器挂起之前打开它,我们可以通过将消息放入队列来“纠正”挂起状态。收到消息后,我们会在日志中看到运行状况良好的跟踪消息,并且可以关闭侦听器。