CDI2.0为什么BeanManager无法触发异步事件?

时间:2017-02-03 11:48:57

标签: events java-ee asynchronous cdi

我正在测试新的CDI2.0预发行版,我期待BeanManager能够异步触发事件。

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));
    }
}

现在这很好用,但我必须先定义事件。 是否有计划向Beanmanager添加fireAsync()方法?

1 个答案:

答案 0 :(得分:1)

因为决定不要那么膨胀BeanManager(BM)。为了进一步阐述,有人要求fireAsync以及人们要求选择直接从BM使用选定的限定符或类型,类型和限定符来触发事件。所有这些都是有效要求,但将所有这些添加到BM上会使这个“超级”入口点更加膨胀。

因此,决定创建BeanManager#getEvent(),直接从Event界面创建select(..)。从那里你可以根据所需的限定符/类型fire(或保留默认值)然后fireAsync(用于同步事件)或@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()); } (用于异步)。

为了支持上述陈述,您可以在相关的CDI issue中详细了解或直接查看the pull request

所以你所追求的已经存在,可能看起来像这样

{{1}}