【问题标题】:CDI Events not received from a Singleton EJB未从单例 EJB 接收到 CDI 事件
【发布时间】:2013-03-08 14:29:29
【问题描述】:

我在 CDI Events 上有点挣扎。 我有一个几乎像这样实现为 CDI Singleton 的类:

import import javax.inject.Singleton;

@Singleton
public class MyClass{

    @Inject
Event<StatusUpdateEvent> events;

    public MyClass(){};

    public void myMethod(){
        events.fire(new StatusUpdateEvent());
    }
}

然后我将我的消费者类实现为 EJB Singleton

import javax.ejb.Singleton;

@Singleton
public class MyObserver(){

    public MyObserver(){};

    public onStatusUpdateEvent(@Observes StatusUpdateEvent event){

        ...do something...

    }
}

问题是当myMethod 被调用时,没有从myObserver 接收到任何事件。 MyClass 包含在我的 EAR 项目的库 jar 中(jar 有 beans.xml),MyObserver 是同一 EAR 的 EJB。

我做错了什么?非常感谢您的帮助!

【问题讨论】:

  • 评论我的问题。我注意到的一件事是,前面提到的 ejb 和另一个单例位于不同的线程池(admin-thread-pool 和 thread-pool-1)上。这是否意味着什么?

标签: jakarta-ee ejb cdi


【解决方案1】:

CDI 注入不能跨越类加载器边界。由于您的项目是 EAR,因此 ejb-jar 很可能位于单独的类加载器上。例如,如果您的项目结构是:

--EAR
  |--EAR/lib
  |--|--EAR/lib/CDIBeans.jar
  |--EJBArchive.jar

那么来自CDIBean.jar 的任何bean 都将无法注入到您的EJBArchive.jar。

【讨论】:

  • 感谢您的回答,只想说一件事。按照您的示例,我实际上能够从 CDIBean.jar 注入依赖项。例如,我可以毫无问题地在 MyObserver 中注入(回到我的示例)整个 MyClass,但是当涉及到事件时,问题就出现了。正如我在第一篇文章中评论的那样,我担心线程池,有什么想法吗?
  • 规范提到范围绑定到线程上下文,如docs.jboss.org/cdi/spec/1.0/html_single/#normalscope,但到目前为止我似乎找不到与事件相关的任何内容。我会尝试复制你的问题,看看我是否有什么想法。
  • 与此同时,我决定切换到亲爱的旧 JMS。据我了解,CDI 事件在“更简单”的上下文中很好,而不是在结构化的应用程序中。非常感谢您的建议。
  • @fabpicca 抱歉,我没有早点回复你。我能找到的唯一附加信息是stackoverflow.com/questions/6002885/…。这对它有所启发,但它仍然不允许我让它工作。也许它会帮助你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多