SpringBoot 事件监听处理(五十一)

news/2024/11/8 15:01:26/

当死亡笼罩在脑海,请用生的信念打败它

上一章简单介绍了Retry重试机制(五十), 如果没有看过,请观看上一章

参考文章: https://blog.csdn.net/qq_37758497/article/details/118863308

一. Spring 事件监听

Spring的事件监听(也叫事件驱动)是观察者模式的一种实现,只要是观察者模式,就含有主题(针对该主题的事件),发布者(发布主题或事件),

订阅者(监听主题的人)。有三个部分组成,事件(ApplicationEvent)、监听器(ApplicationListener)和事件发布操作

作用:

使用事件机制我们可以将相互耦合的代码解耦,从而方便功能拓展和调整。

image-20230609090902855

关于观察者的用法, 可以看老蝴蝶写的 设计模式 系列文章

二. Spring 事件监听

二.一 依赖处理

SpringBoot 相应的依赖已经包含 context 依赖了, 不需要在 pom.xml 文件中单独添加。

image-20230609091205783

二.二 定义事件实体, 继承 ApplicationEvent

如定义一个订单 Order 事件, 里面有一个 message 属性

/*** 事件** @author yuejianli* @date 2022-08-22*/
public class OrderEvent extends ApplicationEvent {private String message;public OrderEvent(Object source, String message) {super(source);this.message = message;}public OrderEvent(Object source) {super(source);}public String getMessage() {return message;}
}

二.三 定义一个事件监听, 实现 ApplicationListener 接口

@Slf4j
@Component
public class OrderListener implements ApplicationListener<OrderEvent> {@Overridepublic void onApplicationEvent(OrderEvent event) {//执行操作log.info(">>> 执行事件监听开始,调用参数是:{}", event.getMessage());try {//执行具体的业务处理逻辑TimeUnit.SECONDS.sleep(3);log.info(">>> 执行具体的任务完成");} catch (Exception e) {e.printStackTrace();}log.info(">>>>>>执行事件监听结束");}
}

二.四 发布任务处理

通过 ApplicationContext .publishEvent 发布任务

@Service
@Slf4j
public class OrderEventService {@Resourceprivate ApplicationContext applicationContext;/*** 处理事件*/public void handlerOrder(String message) {log.info(">>>>开始处理订单,订单信息是:{}", message);applicationContext.publishEvent(new OrderEvent(this, message));log.info(">>>> 调用订单程序成功,任务结束");}
}

二.五 测试验证

@SpringBootTest
@RunWith(SpringRunner.class)
public class OrderEventTest {@Resourceprivate OrderEventService orderEventService;@Testpublic void syncTest() {orderEventService.handlerOrder("岳泽霖购买护肤品");}
}

查看控制台, 会发现,事件发布是成功的.

image-20230609100933206

三. 异步事件发布处理

定义一个 订单成功后 发布邮件的功能, 希望订单和邮件是个异步的操作。

三.一 发布主体 MailMessageEvent

public class MailMessageEvent extends ApplicationEvent {private String message;public MailMessageEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}
}

三.二 邮件Listener

@Component
@Slf4j
public class MailListener implements ApplicationListener<MailMessageEvent> {@Overridepublic void onApplicationEvent(MailMessageEvent mailMessageEvent) {log.info(">>>>执行发送邮件事件监听的操作,{}", mailMessageEvent.getMessage());try {TimeUnit.SECONDS.sleep(4);log.info(">>>>> 邮件发送成功");} catch (Exception e) {e.printStackTrace();}log.info(">>>邮件事件监听结束");}
}

三.三 调用发布

OrderEventService 类中:

	public void handlerEmail(String message) {log.info(">>>>开始处理订单,订单信息是:{}", message);//处理具体的业务信息handlerOrder(message);//发送邮件程序applicationContext.publishEvent(new MailMessageEvent(this, "发送邮件"));log.info(">>>> 调用订单程序成功,任务结束");}

三.四 测试验证

@Testpublic void asyncTest() {orderEventService.handlerEmail("岳泽霖购买护肤品");try {TimeUnit.SECONDS.sleep(12);} catch (Exception e) {}}

订单是3 s, 邮件是 4s

image-20230609101814858

可以观察到, 共花费了 7s 的时长。 先执行了订单(3s), 再执行邮件发送 (4s)

三.五 异步调用

三.五.一 启动类上添加 @EnableAsync 注解

image-20230609101929285

三.五.二 监听器 方法上添加 @Async 注解

image-20230609102228358

image-20230609102009621

执行验证, 共使用了 4s , 异步是成功的.

image-20230609102250976


本章节的代码放置在 github 上:

https://github.com/yuejianli/Function/tree/develop/SpringEvent


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!


http://www.ppmy.cn/news/292654.html

相关文章

皕杰报表中的图表钻取

皕杰报表中图表的钻取是通过超链接实现的&#xff0c;其实质就是通过超链接打开了一张的新表&#xff0c;而把原表中的条件通过参数传递给新表&#xff0c;从而得到我们所需的明细数据。 超链接的地址在单元格的超链接地址属性里添加属性值&#xff0c;如果超链接字符串不需要动…

当在浏览器截屏过曝时,应该采取的措施

一、问题来源 屏幕打开了HDR模式后&#xff0c;浏览器在截图的一瞬间出现色彩错误 正常情况如下&#xff1a; HDR截图过曝后如下&#xff1a; 二、解决方法 1. 关闭屏幕HDR模式 桌面右键显示设置关闭HDR选项 2. 修改浏览器选项 地址栏输入 edge://flags&#xff08;Edg…

案例精述丨Fortinet SASE 护航跨国公司中国区网络安全升级

在全球数字化转型大潮下&#xff0c;跨国公司的机构、设施、人员等全球分布式特性&#xff0c;不但带来了广域网建设的网络复杂性&#xff0c;也带来了更加严峻的安全挑战。某全球知名跨国公司&#xff0c;在中国区进行网络安全升级改造的过程中&#xff0c;采用国内某IDC运营商…

【轨迹跟踪】基于自适应跟踪(EAT)方法的无人机/移动机器人轨迹跟踪(MatlabSimulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MyBatis Plus 拦截器实现数据权限控制(完整版)

一、说明 变化&#xff1a;相比于之前写的数据权限拦截器&#xff0c;新增了白名单功能&#xff0c;通过注解的方式让哪些SQL不进行数据权限拦截&#xff0c;之前的文章地址 思路&#xff1a;通过MyBatisPlus的拦截器对每个要执行的SQL进行拦截&#xff0c;然后判断其是否为查询…

ETC人车关系查询-ETC人车关系查询api接口

接口地址&#xff1a; https://登录后显示/api/189/363(支持:http/https)) 接口页面&#xff1a;https://www.wapi.cn/api_detail/189/363.html 网站地址&#xff1a;https://www.wapi.cn 接口简介&#xff1a;核验指定人员/企业是否是指定车辆的 ETC 开户人、车辆所有人或 E…

移植蓝牙芯片后,PCM 无声音问题记录

背景:投影仪项目上的蓝牙模组本地已经验证ok,送到客户那里发现HFP打电话没声音。 1. 客户平台是3566,android 11的环境, 该环境下其他的模组是可以的 2. 在3566上安装QQ, 波通VOIP电话后, 无阴影, 3. 通过示波器接收pcm 无波形输出, 问题分析查证 1.查看HCI log ,…

word如何转化为pdf格式?分享四个方法给大家!

在工作和学习中&#xff0c;经常需要对文档进行转换&#xff0c;其中将Word文档转换为PDF是最常见的格式转换之一。下面介绍几种常用的转换方法&#xff0c;包括使用记灵在线工具。 方法一&#xff1a;使用Word软件直接转换 如果你使用的是电脑上的Word软件&#xff0c;可以直…