连接关闭不返回

问题描述:

我有一个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

当close()被阻塞时,你可以做线程转储吗? 'jstack' /'jconsole'或者JVisualVM会做到这一点。 – 2012-02-29 10:24:16

我看不到在您的代码中调用System.exit(0)的原因。

我看到很多代码阻止的东西,但我没有看到任何处理。

你正在推翻这一点。与我过去的做法相比,你的MessageListener看起来太复杂了。我会简化。侦听器不必消失并且核对它正在运行的JVM。它所要做的就是完成,关闭它的连接,并让应用服务器将它放回池中,等待下一条消息到达队列中。