以下情况可能吗?
“SessionService”是一个无状态 EJB,它会触发事件“LoggedInEvent”。调用具有观察 LoggedInEvent 的非静态方法的 SessionScoped (Weld) bean“SessionBean”,并为该特定用户初始化一些内容。
是否调用了正确的“SessionBean”实例?所有实例都被调用了吗?我在文档中找不到任何内容。
最佳答案
“正确的实例”是一个有点误导性的措辞。
发生的事情是这样的:
- 调用
SessionService
(可能由网络请求触发)。 - 如果它触发其
LoggedInEvent
,所有注册的观察者都会以同步方式调用(这意味着SessionService
不会在所有观察者终止之前终止)。 - 每个包含(非静态)观察者方法的 bean 都将被实例化(前提是 bean 作用域处于事件状态 - 通常位于标准 Web 环境中 (*))。您的
SessionBean
就是这种情况。当且仅当SessionBean
已在您的事件 session 中实例化(对于 Web 请求,当然只有一个事件 session ),那么当然会使用此实例.
更多详细信息请参阅 spec .
那么,回答你的问题:
是的,将调用正确的实例。为什么?因为容器有责任确保只有一个 SessionBean
实例与事件 session 范围关联。
(*):如果调用是由远程 ejb 调用触发的,则您既不能假定事件 session ,也不能假定事件对话...
关于events - @在 session 范围 bean 中观察?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524170/