连接关闭不返回

时间:2012-02-29 10:21:26

标签: java connection jms

我有一个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语句(现已注释)。按照接口文档,我们有:

  

调用此方法时,在按顺序关闭消息处理之前,不应返回此方法。这意味着可能已经运行的所有消息侦听器都已返回,并且已返回所有挂起的接收。

这不是我的情况,因为我知道所有邮件都已处理完毕。

任何提示,为什么有时无效?

1 个答案:

答案 0 :(得分:0)

我认为没有理由在您的代码中进行System.exit(0)调用。

我看到很多停止内容的代码,但我没有看到任何处理。

你正在过度思考这个问题。与我过去的方式相比,您的MessageListener看起来过于复杂。我简化了。监听器不必消失并对其运行的JVM进行核对。它所要做的就是完成,关闭它的连接,让app服务器把它放回池中等待下一条消息到达队列。