最近做项目碰到一个问题,就是要在某些事务提交以后然后再去执行某些操作,有一种方法是手动开启事务,然后手动提交,提交完毕之后再去执行另外的方法,但是这样太麻烦,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 编写逻辑
}
}