javax.jms.MessageConsumer 在消费者关闭时挂起接收

标签 java jms ibm-mq

根据 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/

相关文章:

java - jdk.serialFilter 不能用于限制 Java 中 TreeMap 的深度(防止通过 Java 进行 DoS 攻击)

java - Jenkins Sonar 插件如何与 SonarQube 集成?

spring - JMS onMessage ByteMessage 写入 PDF 文件

java - C++ JMS 客户端或 C++/C SOAP 客户端

java - Apache Camel - 发送 JMS 消息时发出警告

java - JMS 与 Spring 和 Webspehre MQ 集成的 JNDI

.net - 使用 SSL 设置 .Net IBM.XMS 客户端

ibm-mq - 将文件加载到 MQ 队列的实用程序

Java:将泛型类型传递给另一个泛型类型类

java - 从 Controller 类型 @RequestParam ArrayList<HashMap<String,String> 获取 JS 变量