JMS关闭客户端资源(MessageConsumer,会话,连接)

问题描述 投票:5回答:1

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

您知道更好的方法来正确关闭所有这三个资源吗?

java jms activemq
1个回答
17
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.