我遇到了从EJB计时器触发的CDI事件的问题。
重点是,可以通过手动用户操作触发save事件(例如,从CDI SessionScoped bean方法触发)。在这种情况下,所有注册的观察员都应该抓住它。但是如果从Timer触发的CDI事件被SessionScoped bean捕获(无论如何不需要),则会抛出异常,找不到活动的Context。
那么......我怎么能告诉CDI事件机制只有ApplicationScoped bean应该捕获事件,以防它被EJB Timer触发?
答案 0 :(得分:3)
我找到了解决方案。
@Observes包含参数" notifyObserver"。如果将其设置为Reception.IF_EXISTS,则CDI不会在HTTP请求之外创建SessionScoped bean(如果没有)。
因此,EJB Timer触发事件不会被SessionScoped bean捕获(因为它不存在),并且由于存在SessionScoped bean的现有实例,因此将捕获手动触发的事件。