JMS关闭客户端资源(MessageConsumer,Session,Connection)

时间:2014-01-09 14:59:23

标签: java jms activemq

我有一个简单的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)。

您是否知道更好地关闭所有这三种资源的方法?

1 个答案:

答案 0 :(得分:14)

关闭父级时,子级也会关闭,因此您可以关闭会话以关闭它的生产者和使用者,或者可以关闭连接以关闭它创建的所有内容。