Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当使用者关闭时,javax.jms.MessageConsumer挂起接收_Java_Jms_Ibm Mq - Fatal编程技术网

当使用者关闭时,javax.jms.MessageConsumer挂起接收

当使用者关闭时,javax.jms.MessageConsumer挂起接收,java,jms,ibm-mq,Java,Jms,Ibm Mq,根据javadoc,如果我在javax.jms.MessageConsumer上调用receive(),它将无限期地阻塞,直到生成消息或关闭消息使用者 我有一个正在调用receive()的线程。作为线程关闭的一部分,我调用close(),但是使用者仍然阻塞receive(),因此线程不会关闭。我的代码的要点是: public String receiveMessage() { ... ... System.out.println("About to receive") TextMes

根据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()方法与超时一起使用,它将阻塞,直到超时过期

我觉得一切都很好,希望有人能告诉我我做错了什么

  • 请尝试
    receive(长超时)
    ,不要忘记检查返回的mesage是否为
    null
  • 除了
    consumer.close()
    之外,您还可以中断轮询线程-如果
    close()
    执行得不好并且没有通知被阻止的接收器,这将唤醒它

  • 我已经解决了问题,我没有在任何地方连接.start()。一旦我把它放进去,当我关闭MessageConsumer.receive()时,它就停止了阻塞,一切都按照我的预期进行

    谢谢你的建议。

    再考虑一下

    在JMS中,连接是多线程的。会话及以下内容(消费者、制作人、消息等)。如果您要从多个线程访问任何非线程安全的内容,那么您有责任避免多线程访问

    下面显示的代码看起来像是从几个线程调用消费者的方法。违反了那条规则


    关闭连接对象可能更安全。没有线程冲突,任何合理的实现都可以正确地清理与连接相关的资源。

    但是,在另一个线程上调用consumer.close()仍然不是正确的做法。您需要建立一个连接。Close将负责关闭该连接下的所有会话、使用者、生产者等。

    JMS是众所周知的特定于底层实现的。如果你说你用的是哪一个会有帮助。谢谢你的回复。这是IBM MQ 7.0.0.2版。我尝试过receive()的超时版本,但我也遇到了同样的问题-它只是在剩余的超时时间内阻塞,因此我的应用程序在超时完成之前不会关闭,这不是我想要的。是的,另一件事-如果这是关闭整个应用程序的一部分,请关闭整个对象集(
    消息消费者
    会话
    连接
    )。