Transactions JavaEE6CDI事件是事务性的吗?

Transactions JavaEE6CDI事件是事务性的吗?,transactions,java-ee-6,cdi,Transactions,Java Ee 6,Cdi,JavaEE6CDI事件是事务性的吗 如果我在事务中触发一个事件,然后回滚该事务,那么事件侦听器的效果是否也会回滚 这种行为是否依赖于支持事务的事件侦听器本身 如果我尝试从then event listener中回滚异常,它会回滚触发事件的事务吗?根据CDI 1.0规范的定义,可以通过指定TransactionPhase one正在观察的事务来定义“事务性”事件,其中TransactionPhase是: 正在进行中 在完成之前 完成后 失败后, 成功后 这样的声明看起来像: void onD

JavaEE6CDI事件是事务性的吗

如果我在事务中触发一个事件,然后回滚该事务,那么事件侦听器的效果是否也会回滚

这种行为是否依赖于支持事务的事件侦听器本身

如果我尝试从then event listener中回滚异常,它会回滚触发事件的事务吗?

根据CDI 1.0规范的定义,可以通过指定TransactionPhase one正在观察的事务来定义“事务性”事件,其中TransactionPhase是:

  • 正在进行中
  • 在完成之前
  • 完成后
  • 失败后,
  • 成功后
这样的声明看起来像:

void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
如果观察者未声明为“事务性”,则容器会立即调用观察者,否则它会注册观察者方法,以便在事务完成阶段使用JTA同步进行后续调用

然而:

在事务完成之前调用的任何观察者方法都可以调用setRollbackOnly()来强制事务回滚。观察者方法不能直接启动、提交或回滚JTA事务

如果观察者方法抛出异常(并且本身不是“事务性的”),异常将中止事件的处理


因此,为了实现我想要的行为,我相信我会将我的观察者注册为“事务性”,并指定完成前的TransactionPhase。如果我想回滚启动事件的事务,我将调用setRollbackOnly()。

CDI事件生成器和侦听器的简明代码示例可在以下位置获得: