最近做項目碰到一個問題,就是要在某些事務提交以后然后再去執(zhí)行某些操作,有一種方法是手動開啟事務,然后手動提交,提交完畢之后再去執(zhí)行另外的方法,但是這樣太麻煩,springboot 2.0以上提供了一個便捷的方法,那就是Event事件,配合ApplicationEventPublisher、事務監(jiān)聽器,完成以上操作。
具體操作如下,
一個普通的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 主線程做新增邏輯
//完成之后調(diào)用
applicationEventPublisher.publishEvent(new ChangeObjEvent(obj));
return false;
}
}
ChangeObjEvent,自定義事件,這里的構(gòu)造方法參數(shù)的Object,就是一個方法參數(shù),在監(jiān)聽器里可以獲取的,不用糾結(jié)是不是一定得傳Object,實際上傳什么都行
/**
* @title: ChangeObjEvent
* @projectName test
* @description: 修改信息事件
* @author zhy
* @date 2020/4/2415:40
*/
public class ChangeObjEvent extends ApplicationEvent {
public ChangeObjEvent(Object source) {
super(source);
}
}
事件監(jiān)聽器,具體執(zhí)行額外的操作,監(jiān)聽器可以監(jiān)聽很多種事務狀態(tài),詳情可以打開注解中的TransactionPhase類去看看
/**
* @title: ChangeObjListener
* @projectName test
* @description: 修改信息事務監(jiān)聽器
* @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) {
//獲取參數(shù)
Object source = changeObjEvent.getSource();
//TODO 編寫邏輯
}
}