2014-09-25 103 views
2

使用有狀態EJB時,如果客戶端沒有活動會話,服務器如何知道EJB與誰關聯?我以前使用過無狀態的EJB,但現在正在嘗試學習如何使用有狀態的EJB。我正在考慮將我的購物車作爲一個有狀態的EJB來實現,而不是將POJO Cart作爲用戶會話中的一個屬性添加。但是由於有狀態的EJB沒有明確地作爲HttpSession中的一個屬性添加,所以服務器如何將客戶端與有狀態的EJB相關聯?有狀態EJB與會話屬性

+0

服務器無法與客戶端的會話,除非它已被添加(或使用了'@ Inject'和有狀態會話bean是'@關聯SessionScoped')。什麼讓你覺得它是? – 2014-09-26 03:31:06

+0

我認爲,在有狀態EJB的情況下,當我在有狀態EJB中發出請求來運行一個方法時,同一個bean正在爲一個客戶端提供服務,所以我不確定bean和那個1客戶端之間的連接是什麼。 – user1154644 2014-09-26 20:16:02

+0

有狀態會話bean在客戶端執行查找時創建。從查找返回的代理包含某種特定的bean實例的引用/ ID,因此當客戶端在代理上進行後續調用時,它將連接回特定的bean實例。 – 2014-09-26 23:05:47

回答

1

EJB在技術上並不需要需要才能訪問客戶端的JSESSION_ID,因爲就像任何基本的POJO一樣,只要呼叫客戶端處於活動狀態,它就是活的且可用的。一旦調用客戶端被破壞或以其它方式放棄對SFSB的控制下,豆易於被鈍化或破壞(並且因此「忘記」談話)

the Oracle JavaEE-6 tutorial

的狀態被保持爲客戶端/ bean會話的持續時間。如果 客戶端刪除該bean,則會話結束並且狀態 消失。這種狀態的短暫性不是問題, 然而,因爲當客戶端和bean 兩端之間的對話,就沒有必要保留狀態

想起來了,你弄個同樣的方式一個普通java對象的關係:一旦你將組合對象設置爲null,你基本上已經結束了與該對象的對話。這裏同樣適用(有點)。客戶端不需要將特定的會話信息傳遞給EJB。 EJB的正常生命週期和註釋(特別是@Remove)會照顧其他所有內容。

有關SFSB的警告:它們是重量級的,它們比SLSB持續時間更長。除非您確實需要全面的EJB標記,否則不要使用它們。在很多情況下,一個普通的HttpSession和一個SLSB就足夠了。

進一步閱讀

+0

注意事項不一定是正確的。有些模式可以與SFSB一起使用,讓您可以擴展應用程序以避免由SLSB引發的鍋爐代碼和貧血模型。除非您真的擁有*許多*用戶,否則Oracle文檔稱不會過度使用SLSB – Sergio 2014-09-27 13:18:38