【问题标题】:@Observes in sessionscoped bean?@Observes 在 sessionscoped bean 中?
【发布时间】:2011-06-29 16:39:30
【问题描述】:
以下情况可能吗?
“SessionService”是一个无状态的 EJB 会触发一个事件“LoggedInEvent”。调用具有观察 LoggedInEvent 的非静态方法的 SessionScoped (Weld) bean“SessionBean”并为该特定用户初始化一些东西。
是否调用了正确的“SessionBean”实例?是否调用所有实例?我在文档中找不到任何内容。
【问题讨论】:
标签:
events
java-ee-6
observer-pattern
cdi
【解决方案1】:
“正确的实例”是一个有点误导的措辞。
会发生什么:
-
SessionService 被调用(可能由 Web 请求触发)。
- 如果它触发其
LoggedInEvent,所有注册的观察者都以同步方式调用(这意味着SessionService不会在所有观察者终止之前终止)。
- 每个包含(非静态)观察者方法的 bean 都将被实例化(假设 bean 范围是活动的 - 它通常在标准 Web 环境中 (*))。您的
SessionBean 就是这种情况。如果 - 且仅当 - SessionBean 已经在您的活动会话中被实例化了(肯定只有一个关于网络请求的活动会话),那么这个实例当然会被使用。
更多详情请关注spec。
所以,回答你的问题:
是的,将调用正确的实例。为什么?因为容器有责任确保只有一个SessionBean-instance 与活动会话范围相关联。
(*):如果调用例如由远程 ejb 调用触发,则您既不能假定活动会话也不能假定活动会话...