7

我有一个 Enterprise Application Archive (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 不能用于应用程序范围的事件,还有哪些替代方案?

  • 管理系统
  • 番石榴事件总线
  • ...

有什么适用于 CDI 的吗?也许是一些将事件连接到 WAR 的 CDI 扩展?

- - - - - - 编辑:

如果它在同一个 WAR 中触发,我可以观察到该事件。我也尝试使用@Stateless bean 作为事件侦听器,但没有成功。

包装是这样的:

  • 耳朵
    • WAR(应在此处观察事件)
    • 战争
    • EJB(事件在这里被触发)
4

1 回答 1

7

经过一些更多的研究,它似乎是预期的行为,因为 WAR 类对 EJB 不可见。

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

在这种情况下,JMS 或其他消息传递系统显然是要走的路。还有一个 CDI 扩展可用于 CDI <-> JMS 桥接:Seam3 JMS

于 2013-02-06T09:48:01.770 回答