【问题标题】:finalize method in MessageDrivenBeanMessageDrivenBean 中的 finalize 方法
【发布时间】:2016-02-19 20:53:45
【问题描述】:

Message-Driven Bean Class

消息驱动 bean 类的要求:

It must not define the finalize method.

上述要求的原因是什么?

【问题讨论】:

标签: java jakarta-ee ejb jms java-ee-6


【解决方案1】:

除非按照服务器中配置的次数失败,否则不会对 MDB 进行垃圾回收。因此,这个方法可能永远不会被调用,因为 MDB 被汇集在 MDB 池中并且只是根据需要重用。由于 finalize 方法由 GC 调用,因此您不应该在 MDB 中定义它是合理的,因为它的所有生命周期都由 EJB 容器管理。如果您重写该方法,则不会出现任何异常,因为它已经从 Object 类继承,但是无法预测何时调用其中的代码。此外,访问 MDB 中的任何资源都为时已晚,因为 EJB 容器已经完成了关闭连接等的清理工作

【讨论】:

    【解决方案2】:

    原因是 bean 生命周期由容器(EJB、CDI 或其他容器)管理,因此您应该使用带有 @PreDestroy 注释的方法在 bean 被处置时进行清理。请记住,JVM 不保证在对象处理期间调用finalize,因此即使在 Java SE 环境中也不应该使用它(Java 没有像 C++ 中那样的析构函数的概念)。

    【讨论】:

      【解决方案3】:

      如果您查看 EJB 规范,您会发现它是所有类型的 EJB 的要求。

      http://download.oracle.com/otndocs/jcp/ejb-3.1-pfd-oth-JSpec/

      我找不到明确的答案,但是在过去 13 年中查看各种 Java 论坛,您可以看到一致的答案说,因为容器将决定 EJB 的生命周期,因此可能永远不会调用 finalize (或在您不期望的时候调用)并且使用它会有危险。

      https://community.oracle.com/thread/1582366

      【讨论】:

        猜你喜欢
        • 2011-01-08
        • 2011-07-07
        • 2013-09-20
        • 1970-01-01
        • 2011-06-05
        • 2016-06-10
        • 2015-01-09
        • 2019-04-10
        • 2011-03-19
        相关资源
        最近更新 更多