發(fā)布訂閱 - 確保用戶注冊成功發(fā)送短信通知

Spring事務(wù)監(jiān)聽機(jī)制—使用@TransactionalEventListener處理數(shù)據(jù)庫事務(wù)提交成功后再執(zhí)行操作

  • 為什么使用  
      在項(xiàng)目中,往往需要執(zhí)行數(shù)據(jù)庫操作后,發(fā)送消息或事件來異步調(diào)** * 用其他組件執(zhí)行相應(yīng)的操作,例如:
      用戶注冊后發(fā)送激活碼;
      配置修改后發(fā)送更新事件等。
      但是,數(shù)據(jù)庫的操作如果還未完成,此時(shí)異步調(diào)用的方法查詢數(shù)據(jù)庫發(fā)現(xiàn)沒有數(shù)據(jù),這就會出現(xiàn)問題。
  • 為了解決上述問題,Spring為我們提供了兩種方式:
      (1) @TransactionalEventListener注解
      (2) 事務(wù)同步管理器TransactionSynchronizationManager
      以便我們可以在事務(wù)提交后再觸發(fā)某一事件。
    1、定義被監(jiān)聽的元素
/**
 * 定義個(gè)被監(jiān)聽的元素
 * @author jarfly
 */
@Data
@AllArgsConstructor
public class UserEvent {
    /**
     * 用戶信息
     */
    private final User user;

}

2、定義監(jiān)聽事件

@Component
public class UserEventListener {

 @Async
 @TransactionalEventListener(classes = SaveUserEvent.class,phase = TransactionPhase.AFTER_COMMIT )
void onSaveUserEvent(SaveUserEvent event) {
    Integer id = event.getEventData();
    User u = userDao.getUserById(id);
    String phone = u.getPhoneNumber();
    MessageUtils.sendMessage(phone);
}

}

3、發(fā)布事件

@Service
public class UserServiceImpl  implements UseService {
 @Autowired
 private ApplicationContext applicationContext;

@Transaction
void saveUser(User u) {
    //保存用戶信息
    userDao.save(u);
    //觸發(fā)保存用戶事件
    applicationContext.publishEvent(new SaveUserEvent(u.getId()));
   }
}

更詳細(xì)的介紹
https://blog.csdn.net/qq_41378597/article/details/105748703

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容