是否将javax.ejb.SessionContext注入到bean-managed-concurrency Singleton bean threadsafe?

时间:2012-08-19 16:36:08

标签: java-ee ejb-3.0 java-ee-6 ejb-3.1

我有一个@Singleton会话bean。该bean使用@ConcurrencyManagement ( ConcurrencyManagementType.BEAN )进行注释。

它通过SessionContext注释注入@Resource

这是SessionContext本质上线程安全吗(因为它是一个容器生成的对象,也用于非bean管理的并发情况),或者我的bean必须在锁上同步才能访问和操作它? EJB 3.1 specification的第16.15.2节未提及注入EJBContext个对象的线程安全性。

2 个答案:

答案 0 :(得分:1)

来自a posting by Marina Vatkina on the users@ejb-spec.java.net mailing list

  非单例bean中的

EJBContext只能由单个线程访问,因此它不需要是线程安全的。如果我们在4.8.5单例会话Bean并发部分中使用以下文本,那么如果多个线程可以同时访问该单例实例,则使开发人员有责任确保上下文是线程安全的:

     
    

“在单例会话bean实例状态中存储不支持并发访问的Java EE对象(例如,对Java持久性实体管理器或有状态会话bean的引用)是合法的。但是,Bean提供程序负责确保一次不能通过多个线程访问这些对象。“

  

答案 1 :(得分:0)

上下文对象必须是线程安全的,并且几乎可以肯定使用线程局部变量来实现它(事实上,一旦你意识到容器只是操纵线程局部变量,就可以理解Java EE的许多神秘部分: java:comp,security,transaction等)。否则,EJB容器实现没有其他方法可以从getInvokedBusinessInterface,wasCancelCalled等返回可靠的结果。

例如,假设一个不是线程安全的EJBContext实现;即,它有一个成员变量invokedBusinessInterface和一个set容器调用Bean方法之前调用的setInvokedBusinessInterface方法。在这种情况下,如果同时调用两个单例方法,其中一个线程必然会从getInvokedBusinessInterface得到错误的答案,并且bean方法可以应用的任何数量的同步都不能解决这个问题。