当打包为EAR时,是否可以在WAR内观察CDI事件
我有一个包含多个后端模块(EJB)的企业应用程序归档(EAR)以及一些Web模块(WAR)。
事件在其中一个后端模块中被触发:
@Inject private Event myEvent; ... public void fireEvent() { myEvent.fire(new MyEvent()); } ...
可以在任何其他后端模块中观察到这样的代码:
public void listener(@Observes MyEvent myEvent) { .. }
但是我无法在WAR中检索事件。 这是因为类加载器可见性(来自WAR的类对EJB不可见)还是CDI应该处理这个问题?
如果CDI不能用于应用程序范围的事件,有哪些替代方案?
- JMS
- 番石榴EventBus
- …
有什么与CDI有效吗? 也许某些CDI扩展将事件连接到WAR?
———–编辑:
如果它在同一个WAR中被触发,我能够观察到该事件。 此外,我尝试使用@Stateless bean作为事件侦听器,但没有成功。
包装是这样的:
- 耳
- WAR(应在此处观察事件)
- 战争
- EJB(事件在这里被触发)
经过一些研究之后,似乎它的预期行为是因为EJB类不可见WAR类。
更多地考虑它这是一件好事 – 在集群环境中,CDI事件只能由与触发事件的EJB模块在同一节点上运行的WAR接收。 但为了可靠地更新用户视图,我们需要在每个实例上接收它。
在这种情况下,JMS或其他Messaging系统显然是可行的方法。 还有一个CDI扩展可用于CDI < - > JMS桥接: Seam3 JMS