连接关闭不返回
问题描述:
我有一个JMS客户端这是使用下面的代码消耗从队列中的消息:连接关闭不返回
try {
...
FileUtils.writeStringToFile(getNextFile(), txtMessage.getText());
} catch (JMSException e) {
LOG.error(e.getMessage());
} catch (IOException e) {
LOG.error(e.getMessage());
}finally{
if(this.openMessages<=0){
try {
if(transacted){
session.commit();
LOG.info("Session commited");
}
consumer.close();
// System.exit(0);
closeSession();
System.exit(0);
} catch (JMSException e) {
LOG.error("Error while closing the consumer and session.", e);
} catch (Exception e2) {
LOG.error("Global Exception while closing the consumer and session.", e2);
}
}
}
public void closeSession() throws JMSException {
if (connection != null) {
connection.stop();
connection.close();
}
}
关闭后消费我想关闭会话。为了关闭它,一个叫做closeSession
的方法停止了连接并关闭它。不幸的是,由于某种原因,有时候,调用close
不会返回。因此,我在上面的代码片段中添加了一条exit
语句(现在已注释)。继接口文档后,我们有:
当调用此方法时,它应该不会返回,直到消息处理已按顺序关闭。这意味着所有可能已经运行的消息监听器都已经返回,并且所有待处理的接收都已经返回。
这不是我的情况,因为我知道所有的消息都已被处理。
任何提示为什么这是有时不工作?
答
我看不到在您的代码中调用System.exit(0)
的原因。
我看到很多代码阻止的东西,但我没有看到任何处理。
你正在推翻这一点。与我过去的做法相比,你的MessageListener
看起来太复杂了。我会简化。侦听器不必消失并且核对它正在运行的JVM。它所要做的就是完成,关闭它的连接,并让应用服务器将它放回池中,等待下一条消息到达队列中。
当close()被阻塞时,你可以做线程转储吗? 'jstack' /'jconsole'或者JVisualVM会做到这一点。 – 2012-02-29 10:24:16