Spring ApplicationEvent事件处理

news2024/12/22 20:26:27

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> {

    @Override
    public void onApplicationEvent(@NotNull YdjApplicationEvent event) {
        EventModel eventModel = event.getEventModel();
        // 这里还可以不仅可以根据类来,还可以设置不同code或者做策略
        System.out.println(event.getEventModel());
    }
}
使用@EventListener注解
/**
 * 处理触发消息发送的事件的handler
 *
 * @author Jerry
 */
@Component
@Slf4j
public class MessageSendEventHandler {

    @Autowired
    private 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.coloradmin.cn/o/1352733.html

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

相关文章

南昌找工作用什么APP或者招聘网站

南昌找工作用吉鹿力招聘网 通过吉鹿力招聘网&#xff0c;可以随时查看最新职位&#xff0c;跟踪简历投递动态&#xff0c;与正在进行招聘的CEO、部门负责人、HR在线沟通&#xff0c;查看其他候选人面试该职位后对面试官、公司环境的面试评价等&#xff0c;为求职者提供参考。 …

阿里云2核2G3M服务器能放几个网站?有限制吗?

阿里云2核2g3m服务器可以放几个网站&#xff1f;12个网站&#xff0c;阿里云服务器网的2核2G服务器上安装了12个网站&#xff0c;甚至还可以更多&#xff0c;具体放几个网站取决于网站的访客数量&#xff0c;像阿里云服务器网aliyunfuwuqi.com小编的网站日访问量都很少&#xf…

2023年度最热 AI 应用 TOP 50,除了 ChatGPT 还有这么多宝藏

原文章链接&#xff1a;年度最热 AI 应用 TOP 50&#xff0c;除了 ChatGPT 还有这么多宝藏 - IT之家 更多消息&#xff1a;AI人工智能行业动态&#xff0c;aigc应用领域资讯 在 AI 工具激烈竞争的一年中&#xff0c;尽管ChatGPT在访问量上遥遥领先&#xff0c;但单次使用时长未…

扫码出入库让仓库管理更加智能化

一、扫码出入库管理的概念 扫码出入库管理系统是一种基于条码技术的仓库管理系统。它通过扫描条码的方式&#xff0c;实现货物的自动化入库、存储、打包和出库。条码技术是一种利用光学识别原理对字符进行识别的技术&#xff0c;具有高效、准确、便捷的特点。 二、扫码出入库能…

B端产品经理学习-需求挖掘

B端产品需求挖掘 目录 识别和管理干系人 决策人和负责人需求挖掘 针对用户进行需求挖掘 用户访谈结果整理 B端产品的需求来源是非常复杂的&#xff0c;要考虑多个方面&#xff1b;如果你是一个通用性的产品&#xff0c;要考虑市场、自身优劣势、干系人。而定制型B端产品会…

react useEffect 内存泄漏

componentWillUnmount() {this.setState (state, callback) > {return;};// 清除reactionthis.reaction();}useEffect 使用AbortController useEffect(() > { let abortController new AbortController(); // your async action is here return () > { abortCo…

2024年阿里云优惠券领取及使用教程

阿里云作为国内领先的云计算服务提供商&#xff0c;一直致力于为客户提供优质、高效的服务。为了更好地回馈客户&#xff0c;阿里云经常会推出各种优惠活动&#xff0c;其中就包括阿里云优惠券。本文将详细介绍如何领取及使用阿里云优惠券。 一、阿里云优惠券介绍 阿里云优惠券…

勒索检测能力升级,亚信安全发布《勒索家族和勒索事件监控报告》

评论员简评 近期(12.08-12.14)共发生勒索事件119起&#xff0c;相较之前呈现持平趋势。 与上周相比&#xff0c;本周仍然流行的勒索家族为lockbit3和8base。在涉及的勒索家族中&#xff0c;活跃程度Top5的勒索家族分别是&#xff1a;lockbit3、siegedsec、dragonforce、8base和…

RocketMQ5.0顺序消息设计实现

前言 顺序消息是 RocketMQ 提供的一种高级消息类型&#xff0c;支持消费者按照发送消息的先后顺序获取消息&#xff0c;从而实现业务场景中的顺序处理。 顺序消息的顺序关系通过消息组&#xff08;MessageGroup&#xff09;判定和识别&#xff0c;发送顺序消息时需要为每条消息…

whl is not a supported wheel on this platform.解决办法

1.问题&#xff1a; 安装torch产生 2.解决办法&#xff1a; 使用pip debug --verbose查看 对应的torch版本号 Compatible tags字样&#xff0c;这些就是当前Python版本可以适配的标签。例如&#xff0c;我的Python版本是3.11&#xff0c;可以匹配下面这些文件名&#xff1a;…

YOLOv8改进 更换轻量化模型MobileNetV3

一、MobileNetV3论文 论文地址&#xff1a;1905.02244.pdf (arxiv.org) 二、 MobileNetV3网络结构 MobileNetV3引入了一种新的操作单元&#xff0c;称为"Mobile Inverted Residual Bottleneck"&#xff0c;它由一个1x1卷积层和一个3x3深度可分离卷积层组成。这个操…

简易电子琴

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit P14P1^4; //将P14位定义为P1.4引脚 sbit P15P1^5; //将P15位定义为P1.5引脚 sbit P16P1^6; //将P16位定义为P1.6引脚 sbit P17P1^7; //将P17位定义为P1.7引脚 unsigned char keyval; …

Sam Altman的一天被曝光!每天15小时禁食、服用小剂量安眠药,尽可能避免开会

Sam Altman在经历了几天混乱的管理重组后&#xff0c;重新回到了OpenAI的CEO位置。在日常生活中&#xff0c;奥特曼与许多科技行业高管一样&#xff0c;痴迷于延长自己的寿命。 据报道&#xff0c;他还为应对末日场景&#xff08;致命合成病毒的释放、核战争和人工智能攻击等&…

学习Go语言Web框架Gee总结--前缀树路由Router(三)

学习Go语言Web框架Gee总结--前缀树路由Router router/gee/trie.gorouter/gee/router.gorouter/gee/context.gorouter/main.go 学习网站来源&#xff1a;Gee 项目目录结构&#xff1a; router/gee/trie.go 实现动态路由最常用的数据结构&#xff0c;被称为前缀树(Trie树) 关…

用Audio2Face驱动UE - MetaHuman

新的一年咯&#xff0c;很久没发博客了&#xff0c;就发两篇最近的研究吧。 开始之前说句话&#xff0c;别轻易保存任何内容&#xff0c;尤其是程序员不要轻易Ctrl S 在UE中配置Audio2Face 先检查自身电脑配置看是否满足&#xff0c;按最小配置再带个UE可能会随时崩&#x…

类的生命周期/加载

理一下&#xff0c;java 编译后的字节码文件&#xff0c;我们已经熟悉了 字节码文件长什么样&#xff0c;字节码文件中有哪些内容&#xff0c;那么下一步就是使用类加载器 把字节码文件加载到JVM中 类的生命周期 类的生命周期是 JVM类加载的基础。 加载 所谓加载&#xff0c;…

贝叶斯推断:细谈贝叶斯变分和贝叶斯网络

1. 贝叶斯推断 统计推断这件事大家并不陌生&#xff0c;如果有一些采样数据&#xff0c;我们就可以去建立模型&#xff0c;建立模型之后&#xff0c;我们通过对这个模型的分析会得到一些结论&#xff0c;不管我们得到的结论是什么样的结论&#xff0c;我们都可以称之为是某种推…

【深度学习下载大型数据集】快速下载谷歌云盘数据集

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 跑深度学习的时候,一些数据集比较大,比如60多个G,而且只是训练集. 然后这些数据是由某些实验室组采集的,并不像一些大公司搞的,一般都直接方法一些网盘中. 如果是谷歌网盘,本身通过代理也不麻烦,但是发现即使通过代…

为什么大学c语言课不顺便教一下Linux,Makefile

为什么大学c语言课不顺便教一下Linux&#xff0c;Makefile&#xff0c;git&#xff0c;gdb等配套工具链呢? 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Linux的资料从专业入门到高级教程工具包」&…

【2024.01.03】转行小白-刷css面试题01

总结 1.margin 负值问题 margin-top 和 margin-left 负值&#xff0c;元素向上、向左移动&#xff0c;自己动margin-right 负值&#xff0c;右侧元素左移&#xff0c;自身不受影响&#xff0c;别人动margin-bottom 负值&#xff0c;下方元素上移&#xff0c;自身不受影响 &am…