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