java - 打包为 EAR 时是否可以在 WAR 中观察 CDI 事件

标签 java jakarta-ee war cdi ear

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

相关文章:

java - Java enum 可以取带后缀的值吗?

resources - Gradle 用 WAR 插件替换资源文件

java - log4j2 不适用于 tomcat

java - 生成 保存 转换为 TIFF PDF

java - Java JRE (7, 8) 的 Windows tar.gz 文件是什么?

java - 为了测试而将方法包或私有(private)化是不好的做法吗?

java - 获取 javax.mail.NoSuchProviderException : imap when trying to poll a mail server

Java 分析 - 检测导致峰值的原因

java - tomcat上的文件监听进程

java - 如何在不使用 eclipse 的情况下从终端为我的 java web 应用程序项目创建 war 文件