我正在测试新的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()方法?
答案 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}}