【问题标题】:Execution order of different CDI Events in same transaction同一事务中不同 CDI 事件的执行顺序
【发布时间】:2020-07-20 08:59:25
【问题描述】:

在我的软件解决方案中,我使用带有 EJB 的 JavaEE。在某些事件上,我会针对系统中发生的事情触发不同的事件。在我的具体情况下,我触发了两个不同的事件,应该在事务成功完成后执行。

据我所知,没有指定同一事件的执行顺序,但是当事件是不同类型并且一个接一个地触发时,CDI 如何执行这些事件?

所以在我的代码中我会触发(事件),然后在同一个事务中触发(事件)。事件是否在事件之前执行?对此进行了研究,但我找不到答案。

这里说的是同一个事件的执行顺序不是给定的,但不同的事件没有任何关系:http://www.next-presso.com/2014/06/you-think-you-know-everything-about-cdi-events-think-again/

【问题讨论】:

    标签: java ejb cdi


    【解决方案1】:

    直到 CDI 1.2(检查 here,第 10.5 章):

    [触发事件后]调用观察者方法的顺序没有定义,因此可移植应用程序不应依赖于调用观察者的顺序

    事实上,CDI 容器可能会将您触发的事件排入给定列表中,特别是当您将观察者标记为事务性观察者方法时。实现列表可能是有序的(FIFO 或任何其他),但您无法保证。

    从 CDI 2.0 开始(检查 here,第 10.5.2 章),您可以使用 @Priority 注释定义订单并指定一个数字作为其值。具有较小优先级值的观察者首先被调用,没有@Priority 注释的观察者获得默认优先级(Priority.APPLICATION + 500)。与 CDI 1.2 一样,具有相同优先级的观察者没有任何先前定义的顺序,并且可以被 CDI 容器以任何顺序调用。

    CDI 2.0 观察者排序不适用于异步观察者方法(根据规范),因为预计观察者方法会尽快在不同的上下文中被调用。如果你需要在你的用例中进行某种排序,你应该让你的异步观察者触发下一个事件,而不是从你的“main”方法中调用它。

    【讨论】:

    • 所以即使我触发了两个不同的事件对象,也没有指定顺序?
    • 是的。除非您使用 CDI 2 并定义不同的优先级,否则未指定顺序。您必须意识到在这种情况下您可能会“发现”给定实现的顺序,但不建议依赖它,因为同一实现的未来版本可能会在不与规范冲突的情况下更改它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多