我有一个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
语句(现已注释)。按照接口文档,我们有:
调用此方法时,在按顺序关闭消息处理之前,不应返回此方法。这意味着可能已经运行的所有消息侦听器都已返回,并且已返回所有挂起的接收。
这不是我的情况,因为我知道所有邮件都已处理完毕。
任何提示,为什么有时无效?
答案 0 :(得分:0)
我认为没有理由在您的代码中进行System.exit(0)
调用。
我看到很多停止内容的代码,但我没有看到任何处理。
你正在过度思考这个问题。与我过去的方式相比,您的MessageListener
看起来过于复杂。我简化了。监听器不必消失并对其运行的JVM进行核对。它所要做的就是完成,关闭它的连接,让app服务器把它放回池中等待下一条消息到达队列。