Java EE 6 CDI事件是事务性的吗?

Bri*_*hem 13 transactions cdi java-ee-6

Java EE 6 CDI事件是事务性的吗?

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

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

如果我尝试从事件监听器内部回滚异常,那么它是否回滚触发事件的事务?

Bri*_*hem 16

从CDI 1.0规范的事件章节,可以通过指定正在观察的TransactionPhase将事件定义为"事务性",其中TransactionPhase是以下之一:

  • 进行中,
  • BEFORE_COMPLETION,
  • AFTER_COMPLETION,
  • AFTER_FAILURE,
  • AFTER_SUCCESS

这样的声明如下:

void onDocumentUpdate(@Observes(during=AFTER_SUCCESS) @Updated Document doc) { ... }
Run Code Online (Sandbox Code Playgroud)

如果未将观察者声明为"事务性",则容器立即调用观察者,否则它将使用JTA同步在事务完成阶段注册观察者方法以便稍后调用.

然而:

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

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

因此,为了实现我正在寻找的行为,我相信我会将我的观察者注册为"事务性",并指定BEFORE_COMPLETION TransactionPhase.如果我想回滚发起事件的事务,我会调用setRollbackOnly().