EJB请求引用自己?

时间:2012-01-06 15:17:55

标签: java-ee ejb jndi

如果EJB的方法对同一个EJB进行JNDI查找然后执行其他方法,那么这是否可以保证在同一个线程中执行?如何实现EJB对象的实际;它与调用方法中使用的实例相同吗?

1 个答案:

答案 0 :(得分:3)

EJB规范对将EJB注入其自身的可能性没有限制(参见EJB 3.1规范,第16.5.1.1章):

  

[@EJB]引用可以是会话bean的业务接口,也可以是会话bean的无接口视图,也可以是会话bean或实体bean的本地home接口或远程home接口。

与每个EJB调用一样,它将始终在同一个线程中执行;根据非可重入实例规则,必须不能是同一个实例(第4.10.13章):

  

[...]有状态和无状态会话bean不必编码为可重入。此规则的一个含义是应用程序无法对无状态或有状态会话Bean实例进行环回调用。

这意味着:如果bean A调用bean B上的方法,并且B调用A上的任何方法,则容器必须确保B调用A的另一个实例;它是同一个线程的事实并不重要,因为重入和线程安全是不同的事情。

当A通过查找的JNDI引用调用自身时,同样的情况也适用,因为容器在运行时需要查找A的自由实例。相反,如果A直接调用其中一个方法,则它是一个简单的Java方法调用“this”,不涉及容器。