如何在事務提交后才執行某個方法
開發過程中經常出現如下場景;
新增一篇文章,然后發一個廣播mq出去;
廣播監聽者監聽到消息然后根據文章id回查文章內容;
但是此時新增文章的方法的事務還沒有提交,根據id回查數據庫的時候查到數據為空。
代碼如下:
@Transactional
public void add文章() {
//insert文章
//sendmq
}
此時我們希望的效果是,等事務提交之后再發mq。
可以改成如下寫法:
public void add文章() {
//insert文章
//sendmq
}
@Transactional
public void insert文章() {
//insert文章
}
但是這樣每次涉及這樣的業務都需要包一層,而且很多時候並不知道調用add文章的外層是否還有@Transactional
注解
我們希望達到的效果是注冊一個mq事件,等事務提交后再出發我們的mq事件
。
TransactionSynchronizationManager
嵌入如下代碼,可以注冊一個事務事件,在事務提交之后才出發我的方法。
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的方法就會在事務提交后才出發。這樣回查的時候就不會空了。