CDI 1.X 异步事件

CDI 1.X asynchronous events

我在看这个项目https://github.com/MSzturc/cdi-async-events-extension/, 它在 CDI 1.X 中提供异步事件(内置异步来自 2.0)。

现在我在质疑自定义里面的这段代码 Extension:

public <X> void processAnnotatedType(@Observes ProcessAnnotatedType<X> event, final BeanManager beanManager) {
    final AnnotatedType<X> type = event.getAnnotatedType();
    for (AnnotatedMethod<?> method : type.getMethods()) {
        for (final AnnotatedParameter<?> param : method.getParameters()) {
            if (param.isAnnotationPresent(Observes.class) && param.isAnnotationPresent(Async.class)) {
                asyncObservers.add(ObserverMethodHolder.create(this.pool, beanManager, type, method, param));
            }
        }
    }
}

public void afterBeanDiscovery(@Observes AfterBeanDiscovery event) {
    for (ObserverMethod<?> om : this.asyncObservers) {
        event.addObserverMethod(om);
    }
}

基本上,在注册每个 Bean 时,它会查看每个方法以查看参数是否具有 @Async 注释。

然后,在发现步骤之后,它正在注册 @Observes @Async 方法。
查看由 JBoss Weld 2 提供的 addObserverMethod() 方法,我看到:

additionalObservers.add(observerMethod);

那么我的问题是,那些方法不会被调用两次吗?我的意思是,它们可能会被注册两次,首先是容器本身,然后是调用 addObserverMethod() 方法。

我不熟悉该项目,但乍一看似乎已经过时且无人维护。

至于扩展 - 它基本上再次添加了 "same" 观察者方法 (OM),它有自己的 OM 实现。所以我想说行为取决于 CDI 实现,因为规范不能保证当你再次注册 "the same" OM 时会发生什么 - 它是被替换还是像你说的那样只是添加?

"the same" 我指的是完全相同的底层 Java 方法,尽管包裹在更漂亮的外衣中。

最终,您可以轻松尝试并亲眼看看,但我建议不要使用该项目,因为您遇到的任何问题都不太可能在项目方面得到解决。