2013-03-08 81 views
2

我在CDI事件上苦苦掙扎。 我有一個實現爲CDI辛格爾頓差不多是這樣一類:CDI事件沒有從Singleton EJB收到

import import javax.inject.Singleton; 

@Singleton 
public class MyClass{ 

    @Inject 
Event<StatusUpdateEvent> events; 

    public MyClass(){}; 

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

然後,我有我的消費類實現EJB辛格爾頓

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。

我在做什麼錯?非常感謝你的幫助!

+0

評論我的問題。其中一件事我注意到前面提到的ejb和其他單例在不同的線程池(admin-thread-pool和thread-pool-1)上。這是否意味着什麼? – fabpicca 2013-03-08 21:09:59

回答

2

CDI注入不能跨類加載器邊界使用。由於您的項目是EAR,因此ejb-jar很可能位於單獨的類加載器上。例如,如果你的項目結構爲:

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

然後從CDIBean.jar任何豆將不能用於注射到你的EJBArchive.jar

+0

感謝您的回答,只想說一件事。我實際上能夠從你的例子CDIBean.jar注入依賴關係。例如我可以注入(回到我的例子)MyObserver中的整個MyClass,根本沒有任何問題,但是當涉及到事件時,問題就會出現。正如我評論我的第一篇文章,我擔心線程池,任何想法? – fabpicca 2013-03-09 06:34:41

+0

該規範提到作用域綁定到線程上下文中,如http://docs.jboss.org/cdi/spec/1.0/html_single/#normalscope,但我似乎無法找到與事件有關的任何事情。我會試着複製你的問題,看看我是否想出任何東西。 – rdcrng 2013-03-09 19:32:34

+0

與此同時,我決定切換到親愛的老JMS。據我所知,CDI事件在「更容易」的情況下很好,而不是結構嚴密的應用程序。無論如何,非常感謝您的建議。 – fabpicca 2013-03-13 09:25:07