我有一个简单的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 {
connection.close();
} catch (JMSException e) {
log.error(e.getMessage(), e);
}
但由于代码重复而显得不太好。我发现很难将其抽象出来,因为这些类都没有一个使用close()方法实现公共接口(例如,像Closable)。
您知道更好的方法来正确关闭所有这三个资源吗?
关闭父级时,子级也将关闭,因此您可以关闭会话以关闭其生产者和使用者,也可以关闭连接以关闭其创建的所有内容。