2013-03-08 4 views
2

Я немного борюсь с событиями CDI. У меня есть класс, который реализуется как КДИ Singleton почти так: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 Singleton

import javax.ejb.Singleton; 

@Singleton 
public class MyObserver(){ 

    public MyObserver(){}; 

    public onStatusUpdateEvent(@Observes StatusUpdateEvent event){ 

     ...do something... 

    } 
} 

Проблема заключается в том, что, когда myMethod не вызывается ни одного события получен от myObserver. MyClass включен в библиотеку jar моего проекта EAR (банка имеет beans.xml), а MyObserver - EJB того же EAR.

Что я делаю неправильно? Большое спасибо за вашу помощь!

+0

Комментируя мой вопрос. Одна из вещей, которые я заметил, что вышеупомянутый ejb и другой синглтон находятся в разных пулах потоков (admin-thread-pool и thread-pool-1). Это что-то значит? – fabpicca

ответ

2

CDI-инъекция не работает через границы класса-загрузчика. Поскольку ваш проект является EAR, ejb-jar, скорее всего, является отдельным загрузчиком классов. Например, если ваша структура проекта:

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

тогда любые бобы из CDIBean.jar не будут доступны для инъекций в вашем EJBArchive.jar.

+0

Спасибо за ответ, просто хочу отметить одно. На самом деле я могу ввести зависимости из вашего примера, CDIBean.jar. Например, я могу вставить (возвращаясь к моему примеру) весь MyClass в MyObserver без каких-либо проблем, но когда дело доходит до событий, проблема возникает. Когда я прокомментировал свой первый пост, я беспокоюсь о пулах потоков, о любых идеях? – fabpicca

+0

В спецификации упоминаются области, привязанные к контексту потока, как в http://docs.jboss.org/cdi/spec/1.0/html_single/#normalscope, но я пока не могу найти ничего, связанного с событиями. Я попытаюсь воспроизвести вашу проблему и посмотреть, придумаю ли я что-нибудь. – rdcrng

+0

Между тем я решил переключиться на дорогую старую JMS. Насколько я понимаю, события CDI отлично подходят в «более простых» контекстах, а не в сильно структурированных приложениях. Большое спасибо за ваш совет. – fabpicca

Смежные вопросы