事务监听器
事务也是有监听器的,可以试想一下几个场景
- 事务执行成功,提交之后,通知特定的组件发送成功的消息
- 事务执行失败,回滚完事务之后,记录失败的日志
- 无论事务执行成功还是失败,只要事务执行完成,就记录事务执行的日志
可以发现一个特点,这些事务执行之后的动作,大多都不是主干业务逻辑中的内容,而是不太重要的、可能还比较耗时(譬如发短信、发邮件等)。这种动作一般不会耦合进 Service 的业务逻辑中,而是使用 AOP 增强,或者使用监听器 + 事件更为合适。
事务监听器的设计
事务的监听器,是基于 SpringFramework 的监听器扩展的,它来自 SpringFramework 4.2
事务事件监听器的核心注解:@TransactionalEventListener :
@EventListener
public @interface TransactionalEventListener {
TransactionPhase phase() default TransactionPhase.AFTER_COMMIT;
boolean fallbackExecution() default false;
@AliasFor(annotation = EventListener.class, attribute = "classes")
Class<?>[] value() default {};
@AliasFor(annotation = EventListener.class, attribute = "classes")
Class<?>[] classes() default {};
String condition() default "";
}
可以发现,其实事务事件监听器的本质,还是一个普通的注解式事件监听器而已,只是它里面设计的字段与 @EventListener 不同罢了。
但是在 @TransactionalEventLister 注解中有一个最最关键的属性:phase,它代表的是事务在那个阶段触发监听,默认值是 AFTER_COMMIT,代表提交之后触发。phase 的属性定义在 TransactionPhase
枚举类中,这个枚举中定义了 4 种可选范围:
public enum TransactionPhase {
BEFORE_COMMIT,
AFTER_COMMIT,
AFTER_ROLLBACK,
AFTER_COMPLETION
}
- BEFORE_COMMIT:事务提交之前触发监听
- AFTER_COMMIT:事务提交之后触发监听
- AFTER_TOLLBACK:事务回滚之后触发监听
- AFTER_COMPLETION:事务完成之后触发监听(无论提交还是失败)