MessageDrivenBean 中的 finalize 方法

finalize method in MessageDrivenBean

Message-Driven Bean Class

the requirements of a message-driven bean class:

It must not define the finalize method.

以上要求的原因是什么?

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

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

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

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

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

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