Spring ApplicationEvent事件处理

Spring的事件

ApplicationEvent以及ListenerSpring为我们提供的一个事件监听、订阅的实现,内部实现原理是观察者设计模式,设计初衷也是为了系统业务逻辑之间的解耦,提高可扩展性以及可维护性。

  • ApplicationEvent就是Spring的事件接口
  • ApplicationListener就是Spring的事件监听器接口,所有的监听器都实现该接口
  • ApplicationEventPublisherSpring的事件发布接口,ApplicationContext实现了该接口

 自定义事件

 定义监控基础业务类

/*** @author Jerry* 监听基础类*/
public class EventModel {
}

定义更新代办接口参数


/*** 更新待办接口* @author Jerry*/
@Data
public class LettersVisitsUpdateTodo extends EventModel {/*** 添加待办记录时返回的待办记录 id*/private String prtcpt_id;/*** 待办记录的标题* 注意:若有传递此字段,且传递值为非空字符串,则会更新覆盖原记录该字段的值*/private String title;/*** 待办事项的状态,枚举值:* "1":处理中* "2":待评价* "3":已完成*   注意:若有传递此字段,且传递值为非空字符串,则会更新覆盖原记录该字段的值*/private String prtcpt_stat;/*** 用户提交待办的时间,即用户创建该待办记录的时间。形式为 yyyy-MM-dd HH:mm:ss ,比如 2018-01-01 12:00:00*  注意:若有传递此字段,且传递值为非空字符串,则会更新覆盖原记录该字段的值*/private String submt_tm;/*** 详情页面链接,仅支持h5跳转和内部小程序页面跳转*  注意:若有传递此字段,且传递值为非空字符串,则会更新覆盖原记录该字段的值*/private String dtl_jump_lnk;
}

定义添加代办接口参数

/*** 添加待办接口参数* @author Jerry*/
@Data
public class LettersVisitsAddTodoDto extends EventModel {/*** 用户身份证号码或其他可登录小程序的证件号码*/private String cert_num;/*** 用户证件号类型,枚举值:* "10":身份证* "14":港澳居民来往内地通行证* "15":台湾居民来往大陆通行证4:问卷调查* "20":护照* "22":港澳台居民居住证* "23":外国人永久居留身份证* "40":其他有效个人身份证件*/private String cert_typ;/*** 即开放平台appid*/private String frgn_id;/*** 业务系统的待办流水号,长度不允许超过64。*  注意:frgn_serial_id 不为空并且重复了,就会增加失败,返回之前的已经插入的待办记录ID*/private String frgn_serial_id;/*** 待办记录的标题*/private String title;/*** 待办记录的业务类型,枚举值* "1":我有话对代表说* "2":基层立法联系点留言* "3":意见征集* "4":问卷调查* "5":人大信访*/private String prtcpt_typ;/*** 待办记录的状态,枚举值*  1":处理中* "2":待评价* "3":已完成*/private String prtcpt_stat;/*** 户提交待办的时间,即用户创建该待办记录的时间。形式为 yyyy-MM-dd HH:mm:ss ,比如 2018-01-01 12:00:00*/private String submt_tm;/*** 详情页面链接,仅支持h5跳转和内部小程序页面跳转*/private String dtl_jump_lnk;
}

定义事件

/*** 专用监听器** @author Jerry*/
@Getter
@Setter
public class YdjApplicationEvent extends ApplicationEvent {private EventModel eventModel;public YdjApplicationEvent(Object source) {super(source);}public YdjApplicationEvent(Object source, EventModel eventModel) {super(source);this.eventModel = eventModel;}
}

事件监听三种方式

实现 ApplicationListener 接口
/*** @author Jerry*/
@Component
public class YdjApplicationListener implements ApplicationListener<YdjApplicationEvent> {@Overridepublic void onApplicationEvent(@NotNull YdjApplicationEvent event) {EventModel eventModel = event.getEventModel();// 这里还可以不仅可以根据类来,还可以设置不同code或者做策略System.out.println(event.getEventModel());}
}
使用@EventListener注解
/*** 处理触发消息发送的事件的handler** @author Jerry*/
@Component
@Slf4j
public class MessageSendEventHandler {@Autowiredprivate YdjApplicationEventServiceImpl ydjApplicationEventService;/***  专用监听器的方法** @param ydjApplicationEvent*/@EventListener(YdjApplicationEvent.class)public void handleYdjApplicationEvent(YdjApplicationEvent ydjApplicationEvent) {EventModel eventModel = ydjApplicationEvent.getEventModel();// 添加待办记录if (eventModel instanceof LettersVisitsAddTodoDto) {ydjApplicationEventService.lettersVisitsAddTodo((LettersVisitsAddTodoDto) eventModel);}// 更新待办记录if (eventModel instanceof LettersVisitsUpdateTodo) {ydjApplicationEventService.lettersVisitsUpdateTodo((LettersVisitsUpdateTodo) eventModel);}}
}
  使用@TransactionalEventListener注解

使用@TransactionalEventListener注解来定义一个监听器

@EventListener@TransactionalEventListener 都是 Spring Framework 提供的注解,用于处理应用程序事件。它们的主要区别在于它们处理事件的时间和事务的关联性。

  • @EventListener:这个注解可以应用于任何方法,使得该方法成为一个事件监听器。当一个事件被发布时,所有标记为 @EventListener 的方法都会被调用,无论当前是否存在一个活动的事务。这意味着 @EventListener 注解的方法可能在事务提交之前或之后被调用。
  • @TransactionalEventListener:这个注解是 @EventListener 的一个特化版本,它允许更精细地控制事件监听器在事务处理过程中的执行时机。@TransactionalEventListener 默认在当前事务提交后才处理事件(TransactionPhase.AFTER_COMMIT),这可以确保事件处理器只在事务成功提交后才被调用。也可以通过 phase 属性来改变事件处理的时机,例如在事务开始前、事务提交前、事务提交后或者事务回滚

注意:此注解需要spring-tx的依赖;

/*** @author Jerry* @date 2024-01-02 15:25*/
@Component
public class DemoListener {@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, value = {YdjApplicationEvent.class})public void messageListener(YdjApplicationEvent event) {EventModel eventModel = event.getEventModel();System.out.println("DemoListener获取到了监听消息:" + eventModel);}
}

 

 

 这个注解取值有:BEFORE_COMMIT(指定目标方法在事务commit之前执行)AFTER_COMMIT(指定目标方法在事务commit之后执行)、AFTER_ROLLBACK(指定目标方法在事务rollback之后执行)AFTER_COMPLETION(指定目标方法在事务完成时执行,这里的完成是指无论事务是成功提交还是事务回滚了)各个值都代表什么意思表达什么功能,非常清晰需要注意的是:AFTER_COMMIT + AFTER_COMPLETION是可以同时生效的AFTER_ROLLBACK + AFTER_COMPLETION是可以同时生效的

事件发布类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/317565.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌推出创新SynCLR技术:借助AI生成的数据实现高效图像建模,开启自我训练新纪元!

谷歌推出了一种创新性的合成图像框架&#xff0c;这一框架独特之处在于它完全不依赖真实数据。这个框架首先从合成的图像标题开始&#xff0c;然后基于这些标题生成相应的图像。接下来&#xff0c;通过对比学习的技术进行深度学习&#xff0c;从而训练出能够精准识别和理解这些…

leetcode:1464. 数组中两元素的最大乘积(python3解法)

难度&#xff1a;简单 给你一个整数数组 nums&#xff0c;请你选择数组的两个不同下标 i 和 j&#xff0c;使 (nums[i]-1)*(nums[j]-1) 取得最大值。 请你计算并返回该式的最大值。 示例 1&#xff1a; 输入&#xff1a;nums [3,4,5,2] 输出&#xff1a;12 解释&#xff1a;如…

海外静态IP和动态IP有什么区别?推荐哪种?

什么是静态ip、动态ip&#xff0c;二者有什么区别&#xff1f;哪种好&#xff1f;关于这个问题&#xff0c;不难发现&#xff0c;在知道、知乎上面的解释有很多&#xff0c;但据小编的发现&#xff0c;这些回答都是关于静态ip和动态ip的专业术语解释&#xff0c;普通非专业人事…

一、初识Redis与分布式系统

目录 一、Redis应用 二、实现方式 三、Redis应用 四、分布式系统 五、分布式系统实现 1、应用服务和数据库服务分离 2、引入负载均衡&#xff0c;应用服务器集群&#xff08;解决高并发&#xff09; 3、引入读写分离&#xff0c;数据库主从结构&#xff08;解决高并发&a…

CentOS 7 实战指南:文本处理命令详解

前言 在Linux系统中&#xff0c;文本处理是非常基础却又必不可少的一项技能。如果你正在使用CentOS系统&#xff0c;那么学会如何利用文本操作命令来高效地处理文本文件无疑将会是一个强有力的工具。 本篇文章将介绍一些最常用和最实用的文本操作命令&#xff0c;并通过详尽的…

为什么要用扫码出入库?

一、什么是扫码出入库管理系统 传统的仓库管理模式存在很多问题&#xff0c;如&#xff1a;货物积压、过期、丢失等。这些问题不仅影响了企业的正常运营&#xff0c;还给企业带来了经济损失。为了解决这些问题&#xff0c;扫码出入库管理系统应运而生。该系统采用先进的二维码…

利用蚁剑钓鱼上线CS

前言 ​ 中国蚁剑使用Electron构建客户端软件&#xff0c;Electron实现上用的是Node.js&#xff0c;并且Node.js能执行系统命令&#xff0c;故可以利用蚁剑的webshell页面嵌入js来直接执行命令&#xff0c;进而钓鱼来上线CS。&#xff08;类似Goby&#xff0c;Goby也是使用Ele…

MCMC:Metropolis-Hastings抽样

马尔可夫链有两个要素&#xff1a; 一步转移概率矩阵&#xff1a;初始分布&#xff1a; 如果这两个要素都确定了&#xff0c;这个链的转移行为就被完全确定下来了。我们就可以求得极限分布 &#xff0c;只需解下面这个方程即可。 但是MCMC试图解决的问题刚好是反过来。即已知…

JOSEF约瑟 断电延时继电器 SRTD-220VDC-2H2D 导轨安装

系列型号&#xff1a; SRTD-24VDC-1H1D断电延时继电器&#xff1b;SRTD-110VDC-1H1D断电延时继电器&#xff1b; SRTD-220VDC-1H1D断电延时继电器&#xff1b;SRTD-110VAC-1H1D断电延时继电器&#xff1b; SRTD-220VAC-1H1D断电延时继电器&#xff1b;SRTD-24VDC-2H断电延时继电…

rime中州韵小狼毫 中英互绎 滤镜

英文在日常生活中已经随处可见&#xff0c;我们一般中英互译需要使用专业的翻译软件来实现。但如果我们在输入法中&#xff0c;在输入中文的时候&#xff0c;可以顺便瞟一眼对应的英文词汇&#xff0c;或者在输入英文的时候可以顺便了解对应的中文词汇&#xff0c;那将为我们的…

Python+Selenium实现网站滑块拖动操作

实现效果 示例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 import time from selenium impo…

c++基础(对c的扩展)

文章目录 命令空间引用基本本质引用作为参数引用的使用场景 内联函数引出基本概念 函数补充默认参数函数重载c中函数重载定义条件函数重载的原理 命令空间 定义 namespace是单独的作用域 两者不会相互干涉 namespace 名字 { //变量 函数 等等 }eg namespace nameA {int num;v…