为MessageListeners调用stop()并暂时暂停连接传入消息的正确位置。(JMSCC0012 ..)?

时间:2018-01-30 16:15:13

标签: java asynchronous jms ibm-mq mq

正如我在JMS规范中看到的,无法从onMessage()为异步MessageListener调用connection.stop()。 你能否告知正确的地方调用connection.stop()来暂停传入消息的传递并且不会出现异常:“JMSCC0012:方法'stop()'可能不是从一个消息Listener调用。“ 并在一些事件后自动恢复连接?使用connection.stop()的最佳做法是什么?

  

来自JMS 2.0规范:

     

6.1.5。暂停传入消息的传递如果在调用stop时正在运行任何消息侦听器,则stop必须等到所有消息都停止   在它可能返回之前已经返回。虽然这些消息监听器是   完成后,他们必须拥有连接的全部服务   可供他们使用。消息侦听器不得尝试停止它自己的   连接因为这会导致死锁。 JMS提供者必须   检测到这一点并抛出一个javax.jms.IllegalStateException。

     

来自jms 1.1:

     

4.3.4暂停传入消息的传递如果在调用stop时正在运行MessageListeners,则必须等到所有传递消息都停止   在它可能返回之前返回。虽然这些MessageListeners是   完成后,他们必须拥有连接的全部服务   可供他们使用。

1 个答案:

答案 0 :(得分:2)

我的解决方案是从volatile boolean设置suspendConnection变量onMessage()。并从解析消息的其他线程中检查此变量。在suspendConnection内设置变量onMessage()时,我从解析器线程调用connection.stop()