当打包为EAR时,是否可以在WAR内观察CDI事件

时间:2013-02-05 14:11:14

标签: java java-ee war cdi ear

我有一个包含多个后端模块(EJB)的企业应用程序归档(EAR)以及一些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
  • 番石榴EventBus
  • ...

有什么与CDI有效吗?也许某些CDI扩展将事件连接到WAR?

-----------编辑:

如果在同一个WAR中触发该事件,我能够观察它。 此外,我尝试使用@Stateless bean作为事件监听器,但没有成功。

包装是这样的:

  • EAR
    • WAR(应在此处观察事件)
    • WAR
    • EJB(事件在这里被触发)

1 个答案:

答案 0 :(得分:7)

经过一些更多的研究后,似乎它的预期行为是因为EJB不能看到WAR类。

更多地考虑这一点这是件好事 - 在集群环境中,CDI事件只能由与触发事件的EJB模块在同一节点上运行的WAR接收。但为了可靠地更新用户视图,我们需要在每个实例上接收它。

在这种情况下,JMS或其他Messaging系统显然是可行的方法。 还有CDI扩展可用于CDI&lt; - &gt;。 JMS桥接:Seam3 JMS