【发布时间】:2016-02-19 20:53:45
【问题描述】:
【问题讨论】:
-
好问题,我找到了相关的 jsr (19) 但没有更多细节jcp.org/en/jsr/detail?id=19#3
标签: java jakarta-ee ejb jms java-ee-6
【问题讨论】:
标签: java jakarta-ee ejb jms java-ee-6
除非按照服务器中配置的次数失败,否则不会对 MDB 进行垃圾回收。因此,这个方法可能永远不会被调用,因为 MDB 被汇集在 MDB 池中并且只是根据需要重用。由于 finalize 方法由 GC 调用,因此您不应该在 MDB 中定义它是合理的,因为它的所有生命周期都由 EJB 容器管理。如果您重写该方法,则不会出现任何异常,因为它已经从 Object 类继承,但是无法预测何时调用其中的代码。此外,访问 MDB 中的任何资源都为时已晚,因为 EJB 容器已经完成了关闭连接等的清理工作
【讨论】:
原因是 bean 生命周期由容器(EJB、CDI 或其他容器)管理,因此您应该使用带有 @PreDestroy 注释的方法在 bean 被处置时进行清理。请记住,JVM 不保证在对象处理期间调用finalize,因此即使在 Java SE 环境中也不应该使用它(Java 没有像 C++ 中那样的析构函数的概念)。
【讨论】:
如果您查看 EJB 规范,您会发现它是所有类型的 EJB 的要求。
http://download.oracle.com/otndocs/jcp/ejb-3.1-pfd-oth-JSpec/
我找不到明确的答案,但是在过去 13 年中查看各种 Java 论坛,您可以看到一致的答案说,因为容器将决定 EJB 的生命周期,因此可能永远不会调用 finalize (或在您不期望的时候调用)并且使用它会有危险。
【讨论】: