2013-04-09 44 views
1

考虑以下两个EJB:无状态EJB线程问题

@Stateless 
public class MyBean1 { 

    pulic void method1() { 
     //method implementation comes here 
    } 

    pulic void method2() { 
     //method implementation comes here 
    } 
} 


@Stateless 
public class MyBean2 { 

    @EJB 
    MyBean1 myBean1; 

    public void businessMethod() { 
     myBean1.method1(); 
     myBean1.method2(); 
    } 
} 

请问容器出示担保,这两种方法都呼吁同一个实例MyBean1的(并且没有其他方法被调用这两个方法之间调用该实例)?

回答

2

您无法判断您是否可以访问相同的实例。容器决定这一点。

即使您“认为”它是相同的实例(例如代码中的一个@EJB MyBean1),这些调用可能会遇到不同的MyBean实例。

您的EJB的其他业务方法可能会在您的myBean1.method1()myBean1.method2()调用之间调用。这可能是例如对由不同组件构建的EJB的调用。

但是,这应该不是很感兴趣,因为您使用的是无状态的EJB - 也就是说,您不应该在EJB中存储任何状态。
因此,无论您是获得相同或不同的EJB实例,还是其他组件都会调用相同类型的EJB上的业务方法,您的调用不应该成为问题。

+0

那么,“无状态会话bean是线程安全的”究竟意味着什么? – siva636 2013-04-10 09:01:44

+2

这意味着不超过一个线程将访问给定EJB实例的任何业务方法。这是线程安全的。如果你开始担心对EJB组件的不同调用,这意味着它不是无状态的,不应该这样定义。 – 2013-04-10 09:06:34