根据 javadoc,如果我在 javax.jms.MessageConsumer 上调用 receive(),它将无限期阻塞,直到生成消息或直到消息使用者关闭。
我有一个正在调用 receive() 的线程。作为线程关闭的一部分,我正在调用 close(),但消费者仍然阻塞在 receive() 中,因此线程不会关闭。我的代码的要点是:
public String receiveMessage() {
...
...
System.out.println("About to receive")
TextMessage message = (TextMessage) consumer.receive();
System.out.println("No longer receiving")
...
...
}
public void stop() {
try {
if (consumer != null) {
consumer.close();
}
} catch (JMSException ex) {
throw new IllegalStateException(ex);
}
}
在调试器中我可以看到 close() 被调用,但接收仍然阻塞。如果我使用带有超时的 receive() 方法,它将阻塞直到超时到期。
我觉得一切正常,希望有人能告诉我哪里做错了。
最佳答案
我已经解决了问题,我没有在任何地方执行 connection.start()。一旦我把它放进去,当我关闭它时 MessageConsumer.receive() 停止阻塞并且一切都按我预期的那样工作。
感谢您的建议。
关于javax.jms.MessageConsumer 在消费者关闭时挂起接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8006891/