2017-02-03 1 views
0

Я тестирую новый предварительный выпуск CDI2.0, и я ожидал, что BeanManager сможет запускать события асинхронно.CDI2.0 Почему BeanManager не может запускать Async-события?

В CDI 1.2 я делал это:

@Inject 
BeanManager beanManager; 

public void fireEvents() { 
     for (int i = 0; i < 10; i++) { 
      beanManager.fireEvent(new LightEvent("Light Event " + i)); 
      beanManager.fireEvent(new HeavyEvent("Heavy Event " + i)); 
     } 
    } 

Как я хотел проверить асинхронного события, я увидел, что BeanManager не имеет метода с fireAsync(). Вместо этого я должен запускать события по-другому:

@Inject 
private Event<LightEvent> lightEvent; 

@Inject 
private Event<HeavyEvent> heavyEvent; 

public void fireAsyncEvents() { 
    for (int i = 0; i < 10; i++) { 
     lightEvent.fireAsync(new LightEvent("light " + i)); 
     heavyEvent.fireAsync(new HeavyEvent("heavy " + i)); 
    } 
} 

Теперь это прекрасно работает, но я должен определить события в первую очередь. Есть ли планы добавить метод FireAsync() в Beanmanager?

ответ

0

Потому что было принято решение не раздувать BeanManager (BM). Чтобы уточнить, были люди, просящие fireAsync, а также люди, просящие возможность запускать событие непосредственно из BM с выбранными квалификаторами или типом, или типами и квалификаторами. Все это действительные требования, но добавление всего этого в BM наполнит эту точку входа «uber» еще больше.

Поэтому было принято решение создать BeanManager#getEvent(), из которого вы напрямую подключитесь к интерфейсу Event. Оттуда вы можете сделать select(..) на основе желаемых квалификаторов/типов (или оставить его по умолчанию), а затем вы получите fire (для событий синхронизации) или fireAsync (для асинхронного).

Чтобы поддержать мои высказывания выше, вы можете узнать больше в связанных CDI issue или напрямую проверить the pull request.

Так что вы после уже есть и, вероятно, выглядит следующим образом:

@Inject 
BeanManager bm; 

public void myMethod() { 
    // default one 
    bm.getEvent().fireAsync(new MyPayload()); 
    // with selections of subtype and qualifiers 
    bm.getEvent().select(MyType.class, MyQualifier.class).fireAsync(new MyPayload()); 
} 
Смежные вопросы