【问题标题】:JMS closing client resources (MessageConsumer, Session, Connection)JMS 关闭客户端资源(MessageConsumer、Session、Connection)
【发布时间】:2014-01-28 04:58:50
【问题描述】:

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

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

【问题讨论】:

    标签: java jms activemq


    【解决方案1】:

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

    【讨论】:

    • 你有支持这个的链接吗?我希望做同样的事情。关闭会话以关闭生产者/消费者。但找不到任何文献来支持它。
    • 阅读 JMS 规范,里面都有定义。
    • 只是为了让下一个人想知道...docs.oracle.com/javaee/7/api/javax/jms/Session.html
    • docs.oracle.com/javaee/7/api/javax/jms/Session.html#close-- "没有必要关闭已关闭会话的生产者和消费者。"
    • 嗯,这对我来说似乎有点模棱两可。说“不需要关闭已关闭会话的生产者和消费者”是显而易见的,因为如果会话已经关闭,您将无法关闭生产者和消费者。如果这句话说“没有必要关闭你即将关闭的会话的生产者和消费者”,我会更有信心。但我想这有点迂腐。
    猜你喜欢
    • 2020-01-03
    • 2022-11-05
    • 1970-01-01
    • 2018-08-16
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多