【问题标题】:Is it possible to observe a CDI Event inside a WAR when packaged as EAR打包为 EAR 时是否可以在 WAR 中观察 CDI 事件
【发布时间】:2013-02-05 14:11:13
【问题描述】:

我有一个企业应用程序存档 (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 EventBus
  • ...

有什么可以与 CDI 一起使用的吗?也许是一些将事件连接到 WAR 中的 CDI 扩展?

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

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

包装是这样的:

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

【问题讨论】:

  • 在你的WAR文件中你肯定有一个/WEB-INF/beans.xml
  • 是的.. beans.xml 文件已就位。
  • 能否请您发布 WAR 事件侦听器(以了解您如何实例化和使用它们,也许 CDI 不知道您的 bean 实例...)。详细的包装说明也会有所帮助。
  • 它知道我的豆子。如果我在同一个 WAR 中触发事件,则可以使用相同的代码观察它。

标签: java jakarta-ee war cdi ear


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2016-11-05
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多