2011-06-29 85 views
2

是否可能出現以下情況?@觀察sessionscoped bean嗎?

作爲無狀態EJB的「SessionService」觸發事件「LoggedInEvent」。 SessionScoped(Weld)bean「SessionBean」具有觀察LoggedInEvent的非靜態方法,併爲該特定用戶初始化一些事情。

是否調用了「SessionBean」的正確實例?所有實例都被調用了嗎我在文檔中找不到任何東西。

回答

6

「正確的實例」是一個有點誤導性的措辭。

什麼情況是這樣的:

  1. SessionService被調用(可能是一個Web請求觸發)。
  2. 如果它觸發其LoggedInEvent,則所有註冊的觀察者都以同步方式被調用(這意味着在所有觀察者終止之前SessionService不會終止)。
  3. 每個包含一個(非靜態)觀察者方法的bean都將被實例化(假設bean作用域是活動的 - 它通常位於標準Web環境(*)中)。這將是您的SessionBean的情況。如果 - 且僅當 - SessionBean已在您的活動會話(當然只有一個會話在Web請求中處於活動狀態)下實例化,則當然會使用此實例。

更多詳細資料在spec

因此,要回答你的問題:

是的,正確的實例將被調用。爲什麼?因爲容器的責任是確保只有一個SessionBean -instance與活動會話作用域相關聯。

(*):如果調用例如由遠程ejb調用觸發,則既不能假定活動會話也不能激活對話...