springboot 监听事务,执行另外的任务

2020-04-24  本文已影响0人  zhy0324

最近做项目碰到一个问题,就是要在某些事务提交以后然后再去执行某些操作,有一种方法是手动开启事务,然后手动提交,提交完毕之后再去执行另外的方法,但是这样太麻烦,springboot 2.0以上提供了一个便捷的方法,那就是Event事件,配合ApplicationEventPublisher、事务监听器,完成以上操作。
具体操作如下,
一个普通的service:

/**
 * @title: TestServiceImpl
 * @projectName test
 * @description: 测试
 * @author zhy
 * @date 2020/4/2415:35
 */
public class TestServiceImpl implements TestService {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    /**
     * 新增方法
     * @param obj
     * @throws
     * @return boolean
     * @author zhy
     * @date 2020/4/24 15:37
     */
    @Override
    @Transactional(rollbackFor = Exception.class)//一定要开启事务,不然会失效
    public boolean insert(Object obj) {
        //TODO 主线程做新增逻辑

        //完成之后调用
        applicationEventPublisher.publishEvent(new ChangeObjEvent(obj));
        return false;
    }


}

ChangeObjEvent,自定义事件,这里的构造方法参数的Object,就是一个方法参数,在监听器里可以获取的,不用纠结是不是一定得传Object,实际上传什么都行

/**
 * @title: ChangeObjEvent
 * @projectName test
 * @description: 修改信息事件
 * @author zhy
 * @date 2020/4/2415:40
 */
public class ChangeObjEvent extends ApplicationEvent {
    public ChangeObjEvent(Object source) {
        super(source);
    }
}

事件监听器,具体执行额外的操作,监听器可以监听很多种事务状态,详情可以打开注解中的TransactionPhase类去看看

/**
 * @title: ChangeObjListener
 * @projectName test
 * @description: 修改信息事务监听器
 * @author zhy
 * @date 2020/4/2415:41
 */
@Component
public class ChangeObjListener {

    /**
      * 在事务提交之后所需进行的额外操作,写在这里
      * @param changeObjEvent
      * @throws
      * @return void
      * @author zhy
      * @date 2020/4/24 15:41
      */
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void hanldeChangeCarSpaceEvent(ChangeObjEvent changeObjEvent) {
        //获取参数
        Object source = changeObjEvent.getSource();

        //TODO 编写逻辑
    }

}
上一篇 下一篇

猜你喜欢

热点阅读