发布订阅 - 确保用户注册成功发送短信通知

Spring事务监听机制—使用@TransactionalEventListener处理数据库事务提交成功后再执行操作

  • 为什么使用  
      在项目中,往往需要执行数据库操作后,发送消息或事件来异步调** * 用其他组件执行相应的操作,例如:
      用户注册后发送激活码;
      配置修改后发送更新事件等。
      但是,数据库的操作如果还未完成,此时异步调用的方法查询数据库发现没有数据,这就会出现问题。
  • 为了解决上述问题,Spring为我们提供了两种方式:
      (1) @TransactionalEventListener注解
      (2) 事务同步管理器TransactionSynchronizationManager
      以便我们可以在事务提交后再触发某一事件。
    1、定义被监听的元素
/**
 * 定义个被监听的元素
 * @author jarfly
 */
@Data
@AllArgsConstructor
public class UserEvent {
    /**
     * 用户信息
     */
    private final User user;

}

2、定义监听事件

@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、发布事件

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

@Transaction
void saveUser(User u) {
    //保存用户信息
    userDao.save(u);
    //触发保存用户事件
    applicationContext.publishEvent(new SaveUserEvent(u.getId()));
   }
}

更详细的介绍
https://blog.csdn.net/qq_41378597/article/details/105748703

你可能感兴趣的:(发布订阅 - 确保用户注册成功发送短信通知)