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

6

我有一个简单的JMS客户端,我希望能在结束时关闭与之相关的所有JMS资源,如MessageConsumer、Session和Connection实例。每个类都有一个close()方法,会抛出JMSException异常。据我所知,必须关闭它们中的所有实例,仅关闭Connection实例是不够的。因此,我目前有以下内容:

        try {
            consumer.close();
            session.close();
            connection.close();
        } catch (JMSException e) {
            log.error(e.getMessage(), e);
        }

但是,如果例如一个 consumer.close() 抛出异常,则 session 和 connection 将不会被关闭。因此,更正确的方法应该是:

    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)。

你知道关闭这3个资源的更好方法吗?

1个回答

18

当你关闭父窗口时,子窗口也会关闭,所以你可以关闭会话来关闭其生产者和消费者,或者你可以关闭连接来关闭它创建的所有内容。


1
你有任何支持这个的链接吗?我希望做同样的事情。关闭会话以关闭生产者/消费者...但找不到任何支持它的文献。 - seeker
3
阅读 JMS 规范,在规范中已经定义了所有内容。 - Tim Bish
1
只是为了下一个想知道的人... https://docs.oracle.com/javaee/7/api/javax/jms/Session.html - seeker
1
不需要关闭已关闭会话的生产者和消费者。 - wild_nothing
嗯,这对我来说有点含糊不清。说“在关闭的会话中没有必要关闭生产者和消费者”有点显而易见,因为如果会话已经关闭,你就无法关闭生产者和消费者了。如果这句话说“在即将关闭的会话中没有必要关闭生产者和消费者”,我会更有信心。但我想这有点学究气。 - D. Visser
我会向语法警察报告这个问题。 - Tim Bish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接