当使用者关闭时,javax.jms.MessageConsumer挂起接收
根据javadoc,如果我在javax.jms.MessageConsumer上调用receive(),它将无限期地阻塞,直到生成消息或关闭消息使用者 我有一个正在调用receive()的线程。作为线程关闭的一部分,我调用close(),但是使用者仍然阻塞receive(),因此线程不会关闭。我的代码的要点是:当使用者关闭时,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
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()的超时版本,但我也遇到了同样的问题-它只是在剩余的超时时间内阻塞,因此我的应用程序在超时完成之前不会关闭,这不是我想要的。是的,另一件事-如果这是关闭整个应用程序的一部分,请关闭整个对象集(
消息消费者
,会话
,连接
)。