SpringBoot 事件机制使用方式与特性讲解
创始人
2024-03-27 19:22:10
0

使用场景

常见于 业务处理完之后 (推送、邮件、钉钉、短信) 等通知, 也可用于业务解耦
例如: 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 {@Autowiredprivate 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 {@EventListenerpublic void listener1(MyEvent event) {System.out.println(event.getEventId());}/*** 异步需要在主方法添加 @EnableAsync 注解*/@Async@EventListenerpublic void listener2(MyEvent event) {System.out.println(event.getEventId());}
}

基于事务发布事件

@TransactionalEventListener 注解可以监听事务的动态决定是否处理事件

作用域如下:
TransactionPhase.BEFORE_COMMIT 在提交前(默认)
TransactionPhase.AFTER_COMMIT 在提交后
TransactionPhase.AFTER_ROLLBACK 在回滚后
TransactionPhase.AFTER_COMPLETION 在事务完成后

此注解是无法保证原子性的 属于在事务之外

相关内容

热门资讯

css样式穿透(/deep/和... css样式穿透(/deep/深度选择器)场景复现样式穿透stylus的样...
网络技术展开型介绍(超详细) ♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,疫情之下&#x...
Git__本地分支与远程分支的... 文章目录前言1. 用git checkout命令关联2.用 git push命令关联3.用 git ...
LocalDateTime 的... 与 Date 相比 LocalDateTime 线程安全,因为所有字段都用了 fina...
C++ Primer笔记——l... 目录 一.lambda介绍 (一).总体介绍 (二...
Mac上安装和测试Kafka 1. 安装 默认会把zookeeper一起安装好 brew install kafka 安装日志&#...
@计算矩阵的特征值与特征向量 @计算矩阵的特征值与特征向量 文章目录 我们经常遇到一个问题就是如何计算一个矩阵的特征值和特征向...
Shell脚本编写 1 入门 1.1 脚本格式 脚本以#!/bin/bash开头(指定bash解析器&#x...
C/C++KTV点歌系统 C/C++KTV点歌系统 KTV点歌系统(版本1) 1 ...
重学c/c++之预处理 预定义符号 这些定义符号都是语言内置的 printf("%s\n",__FILE__);//绝对路...