我看到很多例子 http://hursleyonwmq.wordpress.com/2007/05/29/simplest-sample-applications-using-websphere-mq-jms/,甚至在IBM publib上。我猜这段代码有一个缺陷:在主块中关闭队列连接,而不是像我预期的那样在最终中关闭。
在没有泄漏的情况下关闭MQ连接的正确方法是什么?
答案 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)
}