同一交易中不同CDI Events的执行顺序

Execution order of different CDI Events in same transaction

在我的软件解决方案中,我将 JavaEE 与 EJB 结合使用。在某些事件中,我会针对系统中发生的事情触发不同的事件。在我的具体情况下,我触发了两个不同的事件,它们应该在交易成功完成后执行。

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

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

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

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

The order in which observer methods are called [after firing an event] is not defined, and so portable applications should not rely upon the order in which observers are called.

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

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

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