正如我在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是 完成后,他们必须拥有连接的全部服务 可供他们使用。
答案 0 :(得分:2)
我的解决方案是从volatile boolean
设置suspendConnection
变量onMessage()
。并从解析消息的其他线程中检查此变量。在suspendConnection
内设置变量onMessage()
时,我从解析器线程调用connection.stop()
。