spring的事件推送

本质上是设计模式中的观察者模式。

一、什么是观察者模式

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。

二、什么是spring的事件推送

在 Spring 的事件机制中,我们可以令一个事件类继承 ApplicationEvent 类,然后将实现了 ApplicationListener 的 Bean 注册到 spring 容器,最后向 ApplicationEventPublisher 推送事件对象即可令所有订阅者收到事件。在 4.2 以后,甚至不需要实现 ApplicationListener 接口,仅需在 Bean 中方法标记 @EventListener 注解即可。

event、listener、publisher

publisher是整个系统公用的。

监听者和事件是配套的

public class LogEventListener implements ApplicationListener

原理

事件的推送
1、将事件推送到上下文
2、将事件推送到广播器

Spring 中的事件发布接口是 ApplicationEventMulticaster,这个接口只有一个干活的类就是 SimpleApplicationEventMulticaster,在 Spring 容器初始化的 refresh 方法中,会调用到 initApplicationEventMulticaster 方法,这个方法就是用来初始化事件广播器的。

1、传入一个事件,判断是applicationEvent还是普通的java对象,普通的需要封装一下再赋值给applicationEvent。
2、判断eventType,并且调用广播器去广播事件。
3、匹配合适的listener:遍历之前收集到的所有listener,判断是否支持当前事件,先将支持的listener缓存,再遍历listenerBeans,也是判断是否支持当前事件,支持就获取bean,存入过滤listener集合中。就获取到符合条件的listener。

事件推送系统是异步的吗?

Spring 中的事件默认情况下是同步的,发布者线程会进入阻塞状态,直到所有的监听器处理完事件。如果想让事件监听异步执行,需要在监听器上添加@Async, 同时主启动类上添加@EnableAsync注解

是否安全

不推荐在重要业务使用,像日志这种可以丢失的,可以用简单的事件推送 异步执行。
一方面是代码解耦,把日志相关的逻辑从主流程中去掉
另一方面是把日志改成异步的,防止影响主线程,原先日志是同步的,在执行完主流程了最后会执行日志的拼接逻辑,但是日志如果报错,会影响接口的响应和返回。并且原先在日志逻辑里也是没有加try catch的

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

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

相关文章

使用Python批量将PDF转Word

简述 以下全部代码无法完美对图片、表格等非文字形式的内容转化。要较好的效果需要使用光学字符分析等方法进行转化 我懒,不想将代码模块拆分出来写注释 除代码1中有详细注释外,剩下的代码仅在关键部分进行注释 代码1:小规模文件的转换 代码…

TikTok如何矩阵养号?TK防关联引流系统助力TK账号安全运营

TK是 TikTok旗下的短视频社交媒体,平台目前是全球最火的短视频平台,目前全球活跃用户已经超过8亿。其中 TikTok的用户已经达到8亿。TK这款短视频社交媒体平台在海外的发展潜力非常大,也是国内很多人的创业目标,很多人都想从 TK这个…

如何将arping以及所有依赖打包安装到另外一台离线ubuntu机器

ubuntu系统下可以使用arping命令检测局域网内一些ip是否冲突,使用方式为: arping xx.xx.xx.xx 在线情况下,可以使用下面命令下载arping,然后使用即可 apt install arping 但是有些情况下机器可能不能上网,这时就需要将…

文件上传阿里云OSS准备工作及入门程序(保姆级手把手教你)

使用阿里云作为第三方,来存储文件。 登录阿里云官网,开通对象存储OSS 这样就开通成功了。点击 管理控制台 ,出现下面页面。 不过我们也可以不充值购买,先叉掉,它有30天试用的。 创建Bucket 点这个创建Bucket。 创建存…

[论文笔记] Pai-megatron Qwen1.5-14B-CT 后预训练 踩坑记录

1. 模型权重转换报错 hf2mcore_1.5_v2.py 报错为: /mnt/cpfs/kexin/dlc_code/qwen1.5/PAI-Megatron-Patch/toolkits/model_checkpoints_convertor/qwen/hf2mcore_1.5_v2.py 正确文件替换如下,更改了477行,删除了 args.hidden_size 这个维度,在tp>1时也支持转换: eli…

TCM SRAM等五块内存的使用和动态分配

TCM SRAM等五块内存的使用和动态分配 配置sct文件内存使用动态内存分配rtx_lib.hrtx_memory.cmain.c 配置sct文件 LR_IROM1 0x08000000 0x00200000 { ; load region size_regionER_IROM1 0x08000000 0x00200000 { ; load address execution address*.o (RESET, First)*(InRoo…

Spring Boot 学习(4)——开发环境升级与项目 jdk 升级

各种版本都比较老,用起来也是常出各样的问题,终于找到一个看来不错的新教程,是原先那个教程的升级。遂决定升级一下开发环境,在升级遇到一些问题,摸索将其解决,得些体会记录备查。 最终确定开发环境约束如下…

蓝桥杯基础18——第13届省赛真题与代码详解

目录 0.心得体会 1.题目如下 2.代码实现的思路 键值扫描 数码管窗口切换 数码管的动态扫描 继电器工作时L3闪烁,整点时刻L1灯光亮5秒 3.变量列表 定义的常量和数组 功能控制和状态变量 定时器和计数变量 4.代码参考 4.1 头文件 onewire.h ds1302.h 4…

gpu服务器与cpu服务器的区别在哪?

GPU服务器与CPU服务器的区别主要体现在处理能力、应用场景、能源消耗和成本等方面。 处理能力:CPU(中央处理器)是计算机的“大脑”,负责执行指令和处理数据,它的设计注重于逻辑运算和串行处理能力。而GPU(…

全球媒体发稿:海外发稿数字期刊Digital Journal

全球媒体发稿:海外发稿数字期刊Digital Journal ​官网: digitaljournal.com 数字期刊,加拿大知名门户,月访量超过30万。 是一个全球媒体平台和内容合作伙伴,通过捕捉和报道第一,提升新闻周期中的声…

FTP超大文件下载入库--断点续传发

我的需求是将ftp上面的文件进行下载入库,文件大概有两万多个文本,大概是36G,六张表总共2亿数据量。 过程中遇到的错误 Connection closed without indication. 错误1 421 Could not create socket . 错误2 原因:应该是下载文…

文件上传【2】--靶场通关

1.前端禁用js绕过 上传文件,进行抓包,没有抓到,说明这里的验证是前端js验证跳出的弹窗 禁用js后,php文件上传成功。 2.文件上传.htaccess 上传png木马后连接不上 代码中存在.htaccess,判断此时应该就是需要用到.htac…

【通信原理笔记】【三】——3.7 频分复用

文章目录 前言一、时分复用(TDM)二、频分复用(FDM)总结 前言 现在我们学习了几种调制模拟基带信号的方法,这些调制方法可以将基带信号搬移到频带进行传输。那么如果采用不同的载波频率把多个基带信号搬移到不同的频带…

机器学习-09-图像处理02-PIL+numpy+OpenCV实践

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中图像处理技术。 参考 【人工智能】PythonOpenCV图像处理(一篇全) 一文讲解方向梯度直方图(hog) 【杂谈】计算机视觉在人脸图像领域的十几个大的应用方向&…

【LeetCode】1.两数之和

HashMap class Solution {public int[] twoSum(int[] nums, int target) {int a 0, b 0; // 返回两个索引HashMap<Integer, Integer> hm new HashMap<>(); // key是值&#xff0c;value是索引for (int i 0; i < nums.length; i) {if (!hm.containsKey(nums[…

基于SpringBoot的“汉服文化平台网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“汉服文化平台网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统功能界面图 用户登录、用…

gpt4free报错集锦

一天装了nodriver之后&#xff0c;报错&#xff1a;could not find a valid chrome browser binary An error occured: OpenaiChat: FileNotFoundError: could not find a valid chrome browser binary. please make sure chrome is installed.or use the keyword argument br…

力扣第15题三数之和

解题思路&#xff1a; 首先这题也可以用set来做但是去重麻烦&#xff0c;很难快速搞定&#xff0c;&#xff08;用sort排序一遍先&#xff09;所以我采用双指针来解决这道题&#xff0c;定义i,left,right&#xff0c;分别指向遍历头&#xff0c;和头的下一位以及最后一位。然后…

论文阅读:Polyp-PVT: Polyp Segmentation with PyramidVision Transformers

这篇论文提出了一种名为Polyp-PVT的新型息肉分割框架&#xff0c;该框架采用金字塔视觉变换器&#xff08;Pyramid Vision Transformer, PVT&#xff09;作为编码器&#xff0c;以显式提取更强大的特征。本模型中使用到的关键技术有三个&#xff1a;渐进式特征融合、通道和空间…

C#:求三个整数的最大值

任务描述 本关任务&#xff1a;编写一个程序&#xff0c;实现从键盘输入的三个整数&#xff0c;输出三个整数的最大值。 编程要求 根据提示&#xff0c;在右侧编辑器补充代码&#xff0c;计算并输出从键盘输入的三个数的最大值。 测试说明 平台会对你编写的代码进行测试&…