2014-01-30 122 views
7

我是ejbs的新手,我想知道有狀態會話bean是否會被銷燬。我在我的servlet中注入了一個有狀態的會話bean。即使在30分鐘後,我看到這個bean是活躍的。我正在使用jboss eap 6.0。我相信HttpSession與有狀態會話bean無關。我使HttpSession無效,以確保HttpSession與靜態會話bean無關。那麼,如果我的應用程序有很多用戶,並且如果我創建了一個新的bean,那麼如果我的服務器的性能下降了,每個用戶會如何呢?容器如何管理有狀態會話bean。什麼時候刪除或銷燬了一個bean?有狀態會話Bean何時銷燬?

我讀this後和其他人。但是我沒有弄清楚。

+1

退房甲骨文[Java EE的7教程] (http://docs.oracle.com/javaee/7/tutorial/doc/partentbeans.htm#BNBLR)。他們有一個有狀態會話bean的例子。如果您想構建一個可伸縮的應用程序,請遠離statelfull服務器代碼,而讓客戶端保持所有狀態。 – Ralf

+0

謝謝,幫助。 '當客戶端終止時,它的會話bean似乎終止,並且不再與客戶端關聯。「我關閉並打開了瀏覽器併發送了相同的請求,我可以看到有狀態的Bean不再存在。 –

+0

儘管如此,它仍然不能完全回答我的工作方式。我知道這是保持有狀態bean活着的客戶端,但是這對於瀏覽器是如何工作的?我假設你使EJB會話範圍有限? – Gimby

回答

1

@SessionScoped批註纔有意義,在網絡環境中,網絡環境之外,你應該假設你的@SessionScoped將被忽略,你的狀態EJB會像普通舊有狀態EJB,你不應該注入一個有狀態的資源(舊的常規有狀態EJB)轉換爲無狀態(Servlet),在這種情況下,有狀態ejbs的範圍將取決於servlet實例的範圍和java servlet規範。並不嚴格要求容器爲每個會話或請求創建一個servlet實例,事實上,某些容器將使用servlet的單個實例來爲所有客戶端提供服務,在這種情況下,您最終會遇到這種醜陋的情況在一個單一的狀態EJB實例將是服務於所有客戶,檢查了這一點,

Stateful session beans unexpected behaviour when packaged in a war and packaged in an ear->jar

2

有狀態會話bean是不是客戶情境,必須在代碼中明確地銷燬。

1)SFSB必須定義由@Remove註解的方法:

@Stateful 
@Local(ILocalQuiz.class) 
public class QuizBean implements ILocalQuiz{ 

//... 

    @Remove 
    @Override 
    public void end() { 
     System.out.println("QuizBean instance will be removed.."); 
    } 

} 

2)SessionScoped bean必須顯式調用end()方法:

public void cleanUp(){ 
    System.out.println("Cleaning up before destroying the SessionScoped bean."); 
    quizProxy.end(); 
}