我有一个企业应用程序存档 (EAR),其中包含多个后端模块 (EJB) 以及一些 Web 模块 (WAR)。
事件在后端模块之一内触发:
@Inject private Event<MyEvent> myEvent;
...
public void fireEvent() {
myEvent.fire(new MyEvent());
}
...
可以在任何其他后端模块中使用如下代码观察到它:
public void listener(@Observes MyEvent myEvent) {
..
}
但我无法检索 WAR 中的事件。这是因为类加载器的可见性(来自 WAR 的类对 EJB 不可见)还是应该由 CDI 处理?
如果 CDI 不能用于应用程序范围的事件,有哪些替代方案?
- JMS
- Guava 事件总线
- ...
有什么可以与 CDI 一起使用的吗?也许一些 CDI 扩展将事件连接到 WAR 中?
------------ 编辑:
如果事件是在同一个 WAR 中触发的,我能够观察到该事件。 我还尝试使用 @Stateless bean 作为事件监听器,但没有成功。
包装是这样的:
- 耳朵
- WAR(事件应在此处观察)
- war
- EJB(事件在这里触发)
最佳答案
经过更多研究后,它的行为似乎符合预期,因为 WAR 类对 EJB 不可见。
仔细想想这是一件好事——在集群环境中,CDI 事件将仅由运行在与触发事件的 EJB 模块相同的节点上的 WAR 接收。但是为了可靠地更新用户 View ,我们需要在每个实例上接收它。
在这种情况下,JMS 或其他消息系统显然是可行的方法。 还有一个 CDI 扩展可用于 CDI <-> JMS 桥接:Seam3 JMS
关于java - 打包为 EAR 时是否可以在 WAR 中观察 CDI 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14709475/