Spring Boot中使用SpringEvent组件

Spring的事件机制是基于观察者模式的实现,主要由以下三个部分组成:

事件(Event):事件是应用中发生的重要事情,通常是一个继承自ApplicationEvent的类。

事件发布器(Publisher):发布事件的对象,通常是Spring的应用上下文(ApplicationContext)。

事件监听器(Listener):监听并处理事件的对象,通常是实现了ApplicationListener接口的类。

  • 同步方法
  1. 创建自定义事件,自定义事件需要继承ApplicationEvent类,并添加相应的属性和构造方法
package com.ssdl.baize.pub;import org.springframework.context.ApplicationEvent;public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message = message;}public String getMessage() {return message;}
}
  1. 创建事件监听器,用于监听和处理自定义事件。事件监听器需要实现ApplicationListener接口,并覆盖onApplicationEvent方法。
package com.ssdl.baize.pub;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {try {Thread.sleep(5000L);} catch (InterruptedException e) {e.printStackTrace();}log.info("休眠5秒");log.info("Received custom event - {}" , event.getMessage());}
}

3.发布事件,要在某个组件中注入ApplicationEventPublisher,并调用其publishEvent方法。

package com.ssdl.baize.pub;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;@Component
public class CustomEventPublisher {@Autowiredprivate ApplicationEventPublisher applicationEventPublisher;public void publishEvent(String message) {CustomEvent customEvent = new CustomEvent(this, message);applicationEventPublisher.publishEvent(customEvent);}
}

4.测试

	@Autowiredprivate CustomEventPublisher customEventPublisher;@GetMapping(path = "/pub")@ApiOperation(value = "发布订阅")public String pub(@RequestParam("message") String message) {log.info("start");customEventPublisher.publishEvent(message);log.info("发送完成!!!");return "OK";}

5.结果
在这里插入图片描述

  • 异步方法
    说明:创建自定义事件、发布事件、测试这三个如同步方法一样,只需要更改创建事件监听器即可
package com.ssdl.baize.pub;import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;@Configuration
@EnableAsync
public class AsyncConfig {
}
package com.ssdl.baize.pub;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;@Component
@Slf4j
public class AsyncCustomEventListener {@Async@EventListener(condition = "#event.message.startsWith('filter')")public void handleCustomEvent(CustomEvent event) {try {Thread.sleep(5000L);} catch (InterruptedException e) {e.printStackTrace();}log.info("休眠5秒");log.info("Async received custom event - {}" , event.getMessage());}
}

注:condition 限制只接收filter开头的消息

结果:
在这里插入图片描述

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

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

相关文章

go——Swagger使用

一. 为什么后端需要配置Swagger 在前后端分离的项目中&#xff0c;后端配置swagger可以很好的帮助前端人员了解后端接口参数和数据传输。 Swagger是一个用于设计&#xff0c;构建和文档化API的开源框架。在Go语言中&#xff0c;Swagger可以帮助后端开发人员快速创建和定义RESTf…

君子签区块链+AI,驱动组织实现高效合同管理、精准风险控制

在传统合同签署的过程中&#xff0c;企业、组织、机构都面临着合同签署与管理的诸多问题和挑战&#xff1a;合同种类繁多、数量庞大导致起草效率低下&#xff1b;管理流程繁琐、权限分散使得审批周期冗长且效率低下&#xff1b;合同签订版本难以精准复核&#xff0c;风险防控更…

用Vue3和Plotly.js绘制交互式3D烛形图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Plotly.js实现交互式K线图 应用场景 K线图广泛应用于金融领域&#xff0c;用于展示股票、外汇等金融产品的价格走势。它直观地呈现了开盘价、收盘价、最高价和最低价等信息&#xff0c;帮助投资者分析市场趋势…

克隆gitee仓库,在vs2022创建文件夹开发项目操作步骤

git网站 git知识大全 git教程&#xff1a;廖雪峰的官方网站 git菜鸟教程 gitee之创建项目步骤 同步源仓库 2. 克隆命令 3. 右击git Bash Here>粘贴命令行 4. 选中项目文件夹》创建本人文件夹&#xff08;ZYY&#xff09; 5. 打开vs2022》新建项目》选择Framework》下…

新特性之C++17

目录 u8字符字面量 noexcept作为类型系统的一部分 Lambda表达式捕获*this constexpr新特性 编译期的if constexpr语句 constexpr的Lambda表达式 变量新特性 inline变量 结构化绑定 if和switch语句中的初始化器 强制的复制省略&#xff08;返回值优化&#xff09; 临时物质化 模…

第二届计算机、视觉与智能技术国际会议(ICCVIT 2024)

随着科技的飞速发展&#xff0c;计算机、视觉与智能技术已成为推动现代社会进步的重要力量。为了汇聚全球顶尖专家学者&#xff0c;共同探讨这一领域的最新研究成果和前沿技术&#xff0c;第二届计算机、视觉与智能技术国际会议&#xff08;ICCVIT 2024&#xff09;将于2024年1…

【Unity navmeshaggent 组件】

【Unity navmeshaggent 组件】 组件概述&#xff1a; NavMeshAgent是Unity AI系统中的一个组件&#xff0c;它允许游戏对象&#xff08;通常是一个角色或AI&#xff09;在导航网格&#xff08;NavMesh&#xff09;上自动寻路。 组件属性&#xff1a; Radius&#xff1a;导航…

华为机试HJ11数字颠倒

华为机试HJ11数字颠倒 题目&#xff1a; 输入一个整数&#xff0c;将这个整数以字符串的形式逆序输出 程序不考虑负数的情况&#xff0c;若数字含有0&#xff0c;则逆序形式也含有0&#xff0c;如输入为100&#xff0c;则输出为001 想法&#xff1a; 遍历输出倒叙输出 inp…

NeoVim在VSCode上进行多行编辑

多行编辑可以工作在可视行模式和可视块模式&#xff0c;插入模式下还没有实现出来 在可视行或者块模式下&#xff0c;选择需要编辑的行&#xff0c;然后按ma/mA或者mi/mI进入编辑模式&#xff0c;组合键之间时间尽量短&#xff0c;不同的组合键影响如下&#xff1a; 对于可视…

浏览器向客户端提供文件下载(Java实现)

场景&#xff1a; 某一系统需上传黑白名单时&#xff0c;需向用户提供导入模板&#xff0c;这时候需要为客户端提供文件模板下载&#xff0c;用户按照该模板格式填写内容。 package com.wyw.learn.upOrdownload.service;import lombok.RequiredArgsConstructor; import org.spr…

springboot课堂考勤系统-计算机毕业设计源码94408

目 录 1 绪论 1.1 选题背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 课堂考勤系统系统分析 2.1 可行性分析 2.1.1技术可行性分析 2.1.2 操作可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.3 系统用例分析 2.4 系统流程分析 2.…

免费的鼠标连点器哪个好用?5款2024年最新鼠标连点器分享

鼠标连点器是电脑网络游戏爱好者并不陌生的游戏辅助工具&#xff0c;他在FPS、RTS、moba等游戏种类中发挥着重要作用。可以帮助玩家的鼠标完成各种简单点击动作。轻松实现游戏刷机升级。让你游戏升级不再“肝”&#xff0c;轻松刷图升级&#xff0c;秒表大佬不是梦&#xff01;…

使用getline()从文件中读取一行字符串

我们知道&#xff0c;getline() 方法定义在 istream 类中&#xff0c;而 fstream 和 ifstream 类继承自 istream 类&#xff0c;因此 fstream 和 ifstream 的类对象可以调用 getline() 成员方法。 当文件流对象调用 getline() 方法时&#xff0c;该方法的功能就变成了从指定文件…

电传动无杆飞机牵引车交付用户

自2019年起&#xff0c;我们计划做电传动控制&#xff0c;先后做了电传动水泥搅拌罐车罐体控制&#xff08;国内首创&#xff09;&#xff0c;初步理解了电机控制的特点。 20-21年接着做了10t飞机牵引车控制&#xff0c;还是电液控制联合的&#xff0c;把越野叉车的行驶控制方…

Blender渲染慢?那是你还不知道这5个技巧

Blender是一款功能强大且用途广泛的软件&#xff0c;可帮助 3D 艺术家和动画师创作出色的视觉内容。如果您使用过 Blender&#xff0c;您就会知道渲染可能非常耗时。渲染时间过长可能会令人烦恼并限制创造力。 在这篇文章中&#xff0c;我们将提供一些专家提示和想法以加快 Bl…

一文搞懂MySsql的Buffer Pool

Buffer Pool是什么 Buffer Pool是MySQL数据库中一个非常关键的组件。数据库中的数据最终都是存放在磁盘文件上的。但是在对数据库执行增删改查操作时&#xff0c;不可能直接更新磁盘上的数据。因为如果直接对磁盘进行随机读写操作&#xff0c;那速度是相当的慢的。随便一个大磁…

软考(高项)系统分析师--论文写作技巧

文章目录 前言一、论文的结构和要求&#xff1a;1.1 论文的结构&#xff1a;1.2 论文的要求&#xff1a; 二、论文每段的写法&#xff1a;2.1 解题&#xff1a;2.2 摘要&#xff1a;2.2.1 第一段&#xff1a;2.2.2 第二段&#xff1a; 2.3 正文&#xff1a;2.3.1 项目背景&…

TikTok美区日销二十万美金爆款黑马!胸贴赛道成功起飞!

从去年开始&#xff0c;一项名为“No bra”&#xff08;无胸罩&#xff09;的挑战就长期刷屏TikTok。随着平台内各大博主和明星站台发声&#xff0c;越来越多用户也参与其中&#xff0c;话题的热度逐渐走向高潮。截止到目前&#xff0c; TikTok上相关话题累计播放量已高达8.3亿…

Eureka从入门到精通面试题及答案参考

什么是Eureka?它在微服务架构中扮演什么角色? Eureka是Netflix开源的一款基于REST的服务发现组件,它主要应用于构建分布式系统中的服务注册与发现。在微服务架构中,Eureka扮演着至关重要的角色,它让微服务架构中的各个服务实例能够互相发现、相互调用,从而实现了服务之间…

ubuntu 22.04配置国内镜像源-2024.7月最新版

Ubuntu 22.04 LTS这是一个长期支持版本&#xff0c;它将被支持五年&#xff0c;直到2027年4月。已发布的LTS版本带来了一些新的功能 国内有很多Ubuntu 22.04的镜像源&#xff0c;包括阿里、网易&#xff0c;还有很多教育网的镜像源&#xff0c;比如清华源、中科大源。 在教程中…