如何在事務(wù)提交后才執(zhí)行某個方法
開發(fā)過程中經(jīng)常出現(xiàn)如下場景;
新增一篇文章,然后發(fā)一個廣播mq出去;
廣播監(jiān)聽者監(jiān)聽到消息然后根據(jù)文章id回查文章內(nèi)容;
但是此時新增文章的方法的事務(wù)還沒有提交,根據(jù)id回查數(shù)據(jù)庫的時候查到數(shù)據(jù)為空。
代碼如下:
@Transactional
public void add文章() {
//insert文章
//sendmq
}
此時我們希望的效果是,等事務(wù)提交之后再發(fā)mq。
可以改成如下寫法:
public void add文章() {
//insert文章
//sendmq
}
@Transactional
public void insert文章() {
//insert文章
}
但是這樣每次涉及這樣的業(yè)務(wù)都需要包一層,而且很多時候并不知道調(diào)用add文章的外層是否還有@Transactional注解
我們希望達(dá)到的效果是注冊一個mq事件,等事務(wù)提交后再出發(fā)我們的mq事件。
TransactionSynchronizationManager
嵌入如下代碼,可以注冊一個事務(wù)事件,在事務(wù)提交之后才出發(fā)我的方法。
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
System.out.println("a");
}
});
總的寫法如下:
@Transactional
public void add文章() {
//insert文章
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
//sendmq
}
});
}
這樣mq的方法就會在事務(wù)提交后才出發(fā)。這樣回查的時候就不會空了。