Singleton EJB中的系统异常



我正在阅读EJB specification,从我的角度来看,我被一个矛盾弄糊涂了,尤其是在Singleton Bean的生命周期回调方法中抛出System Exception时,Container的行为方式。

第12.3.1节:

由任何生命周期拦截器回调引发的运行时异常方法导致bean实例及其拦截器被丢弃在拦截器链解锁和任何相关联的拦截器之后实例被丢弃(Singleton Beans除外)。

第4.8.4节:

Singleton初始化期间发生的错误被认为是致命的并且必须导致Singleton实例的丢弃。可能的初始化错误包括注入失败、系统异常从PostConstruct方法抛出,或PostConstruct失败方法容器管理的事务成功提交。

与其他组件类型的实例不同,系统异常引发从业务方法或Singleton的回调不会导致Singleton实例的销毁。

那么,根据第4.8.4节,什么是真的?如果System Exception@PostConstruct方法中抛出,或者Interceptor@PostConstruct方法是否丢弃了Bean?我尝试过它抛出一个EJBException,结果是Beans初始化失败。

更令人惊讶的是,当从Singleton Bean业务方法抛出EJBException时,客户端收到了Exception,并且没有进一步执行其他方法。我可以假设Bean实例已被丢弃吗?根据本规范,不应造成Bean Instance的破坏。在这两种情况下,什么是真的?

我要求提供代码,因为这可能是供应商的错误。正如您所读到的,如果在@PostContract时出现EjbException,则不会构建单例。之后,singleton方法可以抛出任何类型的异常(已检查或未检查),并且实例应该仍在运行。

拦截器生命周期附加到singleton生命周期,因此,如果拦截器不能执行其@PostContract,则不会创建singleton。

需要记住的另一件事是:如果EJB(@Stateless或@Stateful)抛出EjbException(或其拦截器),则实例会自动被丢弃,因此,规范中有一条注释:[58] Except for singletons. See Section 4.8.4

相关内容

最新更新