下面的场景可能吗?
"SessionService"是一个无状态EJB,它触发一个事件"LoggedInEvent"。调用一个具有观察LoggedInEvent的非静态方法的SessionScoped(Weld)bean"SessionBean",并为该特定用户初始化一些东西。
是否调用了"SessionBean"的正确实例?是否调用了所有实例?我在文件中找不到任何东西。
"正确的实例"是一个有点误导性的措辞。
结果是:
- 调用
SessionService
(可能是由web请求触发的) - 如果它触发其
LoggedInEvent
,则以同步方式调用所有注册的观察者(这意味着SessionService
不会在所有观察者终止之前终止) - 每个包含(非静态)观察者方法的bean都将被实例化(前提是bean范围是活动的——它通常在标准的web环境中(*))。您的
SessionBean
就是这样。如果-并且仅当-SessionBean
已经在活动会话中实例化(关于web请求,肯定只有一个会话处于活动状态),那么当然会使用此实例
规范中的更多细节
所以,为了回答你的问题:
是的,将调用正确的实例。为什么?因为容器的责任是确保只有一个SessionBean
-实例与活动会话作用域相关联。
(*):例如,如果调用是由远程ejb调用触发的,那么您既不能假设是活动会话,也不能假定是活动会话。。。