@Observes在sessionscoped bean中?

时间:2011-06-29 16:39:31

标签: events java-ee-6 observer-pattern cdi

是否可能出现以下情况?

“SessionService”是一个无状态EJB,它触发一个事件“LoggedInEvent”。调用具有观察LoggedInEvent的非静态方法的SessionScoped(Weld)bean“SessionBean”,并为该特定用户初始化一些内容。

是否调用了“SessionBean”的正确实例?所有实例都被调用了?我在文档中找不到任何内容。

1 个答案:

答案 0 :(得分:6)

“正确的实例”是一种略带误导的措辞。

这是怎么回事:

  1. 调用SessionService(可能由Web请求触发)。
  2. 如果它触发LoggedInEvent,则以同步方式调用所有已注册的观察者(意味着SessionService在所有观察者终止之前不会终止)。
  3. 每个包含(非静态)观察者方法的bean都将被实例化(前提是bean范围是活动的 - 它通常位于标准Web环境(*)中)。这是SessionBean的情况。如果 - 并且仅当 - SessionBean已经在您的活动会话中实例化 (当然只有一个会话活动关于Web请求),那么当然会使用此实例。
  4. spec

    中的更多详细信息

    所以,回答你的问题:

    是的,将调用正确的实例。为什么?因为容器的责任是确保只有一个SessionBean - 实例与活动会话范围相关联。

    (*):如果调用是由远程ejb调用触发的,则既不能采用活动会话也不能采用活动会话......