2013-04-09 39 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