MQ正确的方式来关闭连接

时间:2014-07-09 14:05:20

标签: java ibm-mq connection-leaks

我看到很多例子 http://hursleyonwmq.wordpress.com/2007/05/29/simplest-sample-applications-using-websphere-mq-jms/,甚至在IBM publib上。我猜这段代码有一个缺陷:在主块中关闭队列连接,而不是像我预期的那样在最终中关闭。

在没有泄漏的情况下关闭MQ连接的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

我认为最后这样做会更好。 即。

finally
{
   try
   {
      session.close();
   }
   catch (Exception ex)
   {
      System.err.println("session.close() : " + ex.getLocalizedMessage());
   }

   try
   {
      connection.close();
   }
   catch (Exception ex)
   {
      System.err.println("connection.close() : " + ex.getLocalizedMessage());
   }
}

答案 1 :(得分:0)

自8.0.0(自2014年起)发行以来的IBM MQ支持JMS 2.0。因此,所有QueueConnection,QueueSession QueueSender和QueueReceiver都实现了java.lang.AutoCloseable see ibm mq spec

try (QueueConnection connection = connectionFactory.createQueueConnection();
     //create a session that is not transacted and has an acknowledgment mode 
     QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE)) 
    {
        Queue queue = session.createQueue("queue:///Q1");

        try (QueueSender sender = session.createSender(queue);
             QueueReceiver receiver = session.createReceiver(queue);) 
        {
            //getting and sending messages...
        }

    } catch (JMSException e) {
        //handling jms exceptions...
    }

或使用JMS 2.0 JMSContext

try (JMSContext context = connectionFactory.createContext();) 
    {
        context.createProducer().send(context.createQueue("queue:///Q1"), "text");
    } catch (JMSRuntimeException ex) {
        // handle exception (details omitted)
    }