MessageDrivenBean中的finalize方法

时间:2015-11-18 08:08:24

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

Message-Driven Bean Class

  

消息驱动的bean类的要求:

It must not define the finalize method.

上述要求的原因是什么?

3 个答案:

答案 0 :(得分:1)

如果查看EJB规范,您将看到它是所有类型EJB的必需品。

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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