使用场景
常见于 业务处理完之后 (推送、邮件、钉钉、短信) 等通知, 也可用于业务解耦
例如: A表
为主表 BCD表
为附属表
那么 A表
数据进行删除, 一般做法是 A表
导入BCD表
的Service进行关联删除
那么我们可以用事件通知 进行解耦操纵
A表
删除后发布 主表删除事件
, BCD监听到删除事件, 各自处理各自的删除逻辑
这样 A表
无需关心 BCD表
如何进行删除, BCD表
也只需要处理自己的删除逻辑即可
有些人可能担心事务问题, 这里可以说明 (经过验证) 事件都是在同一个线程进行的
只要在 A表
删除的方法上增加事务注解即可
发布事件
首先定义事件实体类
/**
* 事件实体
*
* @author Lion Li
*/
@Data
public class MyEvent {
private String eventId;
}
编写测试Controller接口
/**
* 测试接口
*
* @author Lion Li
*/
@RestController
public class TestDemoController {
@Autowired
private ApplicationContext context;
@GetMapping("/test")
public String test(String eventId) {
MyEvent event = new MyEvent();
event.setEventId(eventId);
context.publishEvent(event);
return "success";
}
}
监听事件
/**
* 监听事件
*
* @author Lion Li
*/
@Component
public class TestEventListener {
@EventListener
public void listener1(MyEvent event) {
System.out.println(event.getEventId());
}
/**
* 异步需要在主方法添加 @EnableAsync 注解
*/
@Async
@EventListener
public void listener2(MyEvent event) {
System.out.println(event.getEventId());
}
}
基于事务发布事件
@TransactionalEventListener
注解可以监听事务的动态决定是否处理事件
作用域如下:
TransactionPhase.BEFORE_COMMIT
在提交前(默认)
TransactionPhase.AFTER_COMMIT
在提交后
TransactionPhase.AFTER_ROLLBACK
在回滚后
TransactionPhase.AFTER_COMPLETION
在事务完成后
此注解是无法保证原子性的 属于在事务之外
原文始发于微信公众号(狮子领域 程序圈):SpringBoot 事件机制使用方式与特性讲解
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/215092.html