Springboot事件监听

news2025/1/11 2:29:45

Springboot事件监听中主要有以下对象:

1、事件(event)可以封装和传递监听器中要处理的参数,如对象或字符串,并作为监听器中监听的目标。
2、监听器(listener)具体根据事件发生的业务处理模块,这里可以接收处理事件中封装的对象或字符串。
3、事件发布者(publisher)事件发生的触发者

1、事件对象

@Data
public class WorkEvent{


    /**
     * ID
     */
    public Long idNo;
    /**
     * 当前流程状态
     */
    public Integer state;
    /**
     * 申请理由
     */
    public String contents;

}

2、事件

public class WorkApplicationEvent extends ApplicationEvent {
    public WorkApplicationEvent(WorkEvent workEvent) {
        super(workEvent);
    }
}

3、监听器

@Component
public class MsgListener {

    @SneakyThrows // 该注解可以省略代码中一些抛异常或者try catch操作(建议少用,此处写个简单的小demo偷懒)
    @Async // 开启异步监听
    @EventListener(WorkApplicationEvent.class)
    public void sendMsg(WorkApplicationEvent workApplicationEvent) {
        // 具体监听的业务逻辑
        WorkEvent workEvent = (WorkEvent)workApplicationEvent.getSource();
        if (workEvent.getState() == 1) {
            Thread.sleep(1000);
            System.out.println(workEvent.getContents());
        } else {
            throw new RuntimeException("抛出异常,观察后续执行情况");
        }
    }
}

4、事件发布者

@Service
public class TestServiceImpl implements TestService {

    @Autowired
    private ApplicationEventPublisher applicationEventPublisher;

    @Override
    public String testEvent(Integer id) {
        WorkEvent workEvent = new WorkEvent();
        workEvent.setState(id);
        workEvent.setContents("监听事件为:WorkEvent");
        WorkApplicationEvent event = new WorkApplicationEvent(workEvent);
        System.out.println("推送监听事件");
        // 发布事件
        applicationEventPublisher.publishEvent(event); 
        System.out.println("已推送成功");
        return "推送成功";
    }
}

5、Controller

@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @GetMapping("/test/{id}")
    public String getTest(@PathVariable("id") Integer id) {
        return testService.testEvent(id);
    }

}

6、整体项目结构

请添加图片描述

注意,主启动类上需要添加注解:@EnableAsync开启异步

运行效果

执行:http://localhost:8080/test/1

请添加图片描述

执行:http://localhost:8080/test/2

请添加图片描述

不使用异步访问:http://localhost:8080/test/2

请添加图片描述


接下来想聊聊为什么用异步操作

原因有二:

1、因为Springboot的事件监听默认是会在主线程执行的,如果监听业务出现Exception,则会导致整个流程报错阻塞,无法往下继续执行。就好比我本来是想告诉你我今天买彩票赚了10块钱,告诉你这个消息的目的是为了想你听到我的消息之后采取一些措施,比如让你远离博彩(让你也去买一张)。但是我只负责把消息传递给你,而你收到我的消息后做了什么事情我并不关心,这就是异步。但是比如说你收到我的消息后,你也去买了一张彩票结果发现没中奖,于是你把我中来的十块钱抢走了,这就可以理解为非异步。这种设计可能会违背我们这段代码的逻辑导致业务处理出错。

2、监听耗时问题,如果监听业务处理事件非常久,不采用异步处理会阻塞主业务流程。

但是比如说你收到我的消息后,你也去买了一张彩票结果发现没中奖,于是你把我中来的十块钱抢走了,这就可以理解为非异步。这种设计可能会违背我们这段代码的逻辑导致业务处理出错。

2、监听耗时问题,如果监听业务处理事件非常久,不采用异步处理会阻塞主业务流程。

如果不想用异步操作的话,可以去掉@Async注解和启动类的@EnableAsync就可以了。

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

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

相关文章

机器学习 day14 ( 神经网络 )

神经网络的发展 最开始的动机:是通过构建软件来模拟大脑,但今天的神经网络几乎与大脑的学习方式无关 我们依据大脑中的神经网络,来构建人工神经网络模型。左图中:一个神经元可以看作一个处理单元,它有很多的输入/树突…

如何解决企业客户签收回执慢,缩短回款周期?

方案应用领域及行业 本方案适用于快消品行业的供应链管理和财务管理 方案应用背景 由于动产物权的政策变化,物权转移从交付时才开始发生效力。也就是说,新政之前,企业发出商品,开出销售发票,即可申请货物回款&#…

LLM 系列 | 05:ChatGPT Prompt的迭代优化

简介 梅子留酸软齿牙,芭蕉分绿与窗纱。日长睡起无情思,闲看儿童捉柳花。小伙伴们好,我是微信公众号 《小窗幽记机器学习》 的小编:卖冰棍的小男孩。 更多、更新文章欢迎关注微信公众号:小窗幽记机器学习。后续会持续…

Ubuntu的安装教程

文章目录 一、Ubuntu 的安装教程1、Ubuntu的镜像下载2、服务器版的安装教程2.1.1、允许 root 远程登录 3、桌面版的安装教程3.1.1、允许 root 远程登录 一、Ubuntu 的安装教程 1、Ubuntu的镜像下载 ​ 这里我选择阿里云的镜像下载你也可以选择Ubuntu的官网下载 Ubuntu官网 如…

【Set集合案例】成绩排序和不重复的随机数

Set集合案例:成绩排序和不重复的随机数 1.成绩排序 需求:用TreeSet集合存储多个学生信息(姓名,语文成绩,数学成绩),并遍历该集合 ​ 要求:按照总分从高到底出现 思路:…

都2023年了,Python 和Java 哪个更适合做自动化测试?

大家好。从事软件测试很多年了,从各个大厂一路摸爬滚打,现在我有幸供职于字节跳动。个人也是从功能测试慢慢爬到了自动化测试这条路上。所以针对这个问题,我还有点发言权。 记得我一开始从功能准备转型到自动化测试,和很多“涉事…

Qt QPushButton背景图片

一、问题 使用控件显示图片缩略图,当点击控件时,弹出窗口显示完整的图片 二、分析 应该用按钮控件,用信号槽连接。按钮控件是有参数icon,但是只能显示控件中,不能覆盖在整个控件上。 三、方法一:使用st…

线段树算法(C++/C)

目录​​​​​​​ 一、线段树算法的概念 二、为什么需要线段树 三、线段树算法的实现 (1)建树 (2)查询 (3)修改 (4)综合代码,求区间和 (5&#xff…

从“互联网+”到“互联网医疗+”,免费互联网医院开创新格局

随着互联网的发展,各行各业都在积极探索“互联网”时代下的创新模式。其中,医疗领域也开始了自己的变革之路,从传统的医疗模式转向了“互联网医疗”的新型格局。免费互联网医院的出现,则更是为这一变革注入了新的活力。 所谓“互联…

【嵌入式系统应用开发】FPGA——基于HC-SR04超声波测距

文章目录 前言环境目标结果 1 实验原理1.1 超声波原理1.2 硬件模块时序图1.3 模块说明 2 设计文件2.1 时钟分频2.2 超声波测距2.3 超声波驱动 3 实验验证3.1 编译3.3 硬件测试 总结 前言 环境 硬件 DE2-115 HC-SR04超声波传感器软件 Quartus 18.1 目标结果 使用DE2-115开发…

【Linux驱动】认识驱动(驱动的概念、驱动分类)

目录 1、什么是驱动? 2、应用程序调用驱动基本流程 3、file_operations 结构体 4、驱动的分类 1、什么是驱动? 驱动就是一段程序,能够获取外设或者传感器数据、控制外设。驱动获取到的数据会提交给应用程序。 在 Linux 中一切皆为文件&…

【实用篇】Elasticsearch02

文章目录 分布式搜索引擎021.DSL查询文档1.1.DSL查询分类1.2.全文检索查询1.2.1.使用场景1.2.2.基本语法1.2.3.示例1.2.4.总结 1.3.精准查询1.3.1.term查询1.3.2.range查询1.3.3.总结 1.4.地理坐标查询1.4.1.矩形范围查询1.4.2.附近查询 1.5.复合查询1.5.1.相关性算分1.5.2.算分…

Linux开机rc.local不自启动执行脚本问题的排查思路及问题解决

Linux开机rc.local不自启动执行脚本问题的排查思路及问题解决 问题 Linux系统中,在rc.local里面配置的启动命令等不能能够在开机的时候进行自启动 问题解决 解决问题排查中最大的麻烦,需要进行reboot重启 查看rc-local的运行状态 systemctl status r…

clickhouse简介与实战

文章目录 1:简介1.1:CH是什么?1.2:CH优缺点1.2.1:优势1.2.2:缺点 1.3:架构设计 2:CH接口3:CH引擎1:数据库引擎3.1.1:mysql引擎 2:表引擎3.2.1&…

路径规划算法:基于模拟退火优化的路径规划算法- 附代码

路径规划算法:基于模拟退火优化的路径规划算法- 附代码 文章目录 路径规划算法:基于模拟退火优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

基于flask的web应用开发——访问漂亮的html页面以及页面跳转

目录 0. 前言1. html基本知识2. 编写html文本3. 在Flask中设置访问html4. 实现点击跳转 0. 前言 本节学习如何在flask应用程序下让用户访问你提前制作好的html页面 操作系统:Windows10 专业版 开发环境:Pycahrm Comunity 2022.3 Python解释器版本&am…

(学习日记)2023.04.27

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

防火墙之IPSec VPN实验

防火墙IPSec VPN实验 原理概述: 指采用IPSec协议来实现远程接入的一种VPN技术,IPSec全称为Internet Protocol Security,是由Internet Engineering Task Force (IETF) 定义的安全标准框架,在公网上为两个私有网络提供安全通信通道,通过加密通道…

【数据结构】单调栈

目录 1.概述2.代码框架2.1.单调递增栈2.2.单调递减栈 3.应用3.1.应用一3.2.应用二 1.概述 (1)单调栈是一种特殊的栈,它在普通栈的基础上要求从栈顶到栈底的元素是单调的,如果栈中的元素从栈顶到栈底是单调递增的,那么…

Linux CGroup 原理

Linux CGroup 原理 1、CGroup简介 cgroups是Linux下控制一个(或一组)进程的资源限制机制,全称是control groups,可以对cpu、内存等资源做精细化控制。 开发者可以直接基于cgroups来进行进程资源控制,比如8核的机器上…