2011-06-29 42 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调用触发,则既不能假定活动会话也不能激活对话...