我有一个简单的JMS客户端,我想在最后关闭所有JMS相关资源,即MessageConsumer,Session,Connection的实例。这些类中的每一个都有一个抛出JMSException的close()方法。我读过我必须关闭所有这些并关闭Connection的实例是不够的。所以这就是我到目前为止所做的:
try {
consumer.close();
session.close();
connection.close();
} catch (JMSException e) {
log.error(e.getMessage(), e);
}
但是,例如,如果consumer.close()抛出异常,则会话和连接将不会关闭。所以更正确的方法是:
try {
consumer.close();
} catch (JMSException e) {
log.error(e.getMessage(), e);
}
try {
session.close();
} catch (JMSException e) {
log.error(e.getMessage(), e);
}
try {
session.close();
} catch (JMSException e) {
log.error(e.getMessage(), e);
}
但由于代码重复,它看起来不太好。我发现很难将它抽象出来,因为这些类都没有实现与close()方法的公共接口(例如Closable)。
您是否知道更好地关闭所有这三种资源的方法?
答案 0 :(得分:14)
关闭父级时,子级也会关闭,因此您可以关闭会话以关闭它的生产者和使用者,或者可以关闭连接以关闭它创建的所有内容。