2011-11-19 87 views
7

如果有狀態會話bean將被鈍化,它的狀態被寫入硬盤,然後bean實例將被釋放以服務於其他請求(至少這是我的理解)。當同一個客戶端再次激活時,bean實例將從硬盤讀取狀態以重新獲得狀態。但是,bean實例如何知道哪個客戶端需要讀取哪個文件才能維護狀態?當客戶端回來時,有狀態會話bean如何恢復狀態?

我對J2EE很新,所以請原諒我,如果我要求一個非常天真的懷疑。如果我需要了解其他任何主題以瞭解這一點,請指出正確的方向。

回答

13

最好將狀態會話Bean(SfSB)可視化爲非常接近普通Java類的實例。您查找(或注入)SfSB的實例,容器將爲您創建一個並返回實例。然後,您會像處理任何其他Java實例一樣處理該實例。

這意味着,你可以在實例存儲會話,它序列化到磁盤等

的細節是,你正在使用的實例實際上是代理實際的,潛在的SFSB實例。這不是真正的SfSB本身。

當您在本地代理上對該bean進行調用時,它是容器作業將該bean展示給您的內存。 bean的鈍化和激活是在幕後完成的(儘管您可以通過bean生命週期訪問該過程)。

容器需要找到鈍化的SfSB的任何信息都存儲在您正在使用的代理中,但這對您來說是不透明的。你不必擔心。

因此,在一個典型的基於Web的場景中,生命週期就是讓你的bean實例存儲在Web會話中,然後像普通一樣簡單地使用它。如果容器決定它需要鈍化你的bean來騰出空間或任何東西,它會自動爲你鈍化它。當您的用戶返回時,您的應用程序將從Web會話中提取實例並進行調用。那時候,如果bean被鈍化,容器會自動激活你的bean。整個機制取決於容器,對您而言是透明的。你要記住的重要一點是你必須堅持從容器中獲得的SfSB,就像你對任何Java對象一樣。

最後需要注意的是,如果您允許SfSB被鈍化太久,容器會自動爲您刪除它。

+0

謝謝你的解釋。但是在SfSB被刪除之後用戶是否有可能返回?如果可能的話,那種情況下會發生什麼? – Bhushan

+2

是的,這是完全有可能的。如果發生這種情況,當您嘗試訪問SfSB時會發生異常(確切的例外情況,我不能說)。 SfSB的超時是可配置的(通過EJB 3.1中的註釋或通過EJB 3中的容器特定機制),所以目標是將超時持續時間與狀態的預期使用期限相關聯。也就是說,我不會無限制地給他們。此外,SfSB很可能無法在重新部署申請之後繼續存在。重新啓動服務器,是的,但不能重新部署。 –