@EventListener 监听事件 ,在同一个虚拟机中如何保证顺序执行

文章目录

  • 前言
    • @EventListener 监听事件 ,在同一个虚拟机中如何保证顺序执行
      • 1. 设计原理
      • 2. 具体编码
        • 2.1. 编码事件监听器
        • 2.2. 制作一个生成序号方法
        • 2.3. 制作测试代码
        • 2.4. 测试结果

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


@EventListener 监听事件 ,在同一个虚拟机中如何保证顺序执行

1. 设计原理

使用有序事件监听器:@EventListener注解可以接受一个org.springframework.core.Ordered接口来指示监听器的执行顺序。通过设置相应的顺序值,来控制事件监听器的执行顺序。

2. 具体编码

2.1. 编码事件监听器

编码事件监听器:

    @Async@EventListener(classes = ThreeEvent.class)public void threeEventEventHandler(ThreeEvent event) {log.info("=====================ThreeEvent===================:name:{},order:{}",event.getName(),event.getOrder());}

编码监听事件VO并继承Ordered:

@Getter
@Setter
@ToString
public class ThreeEvent extends ApplicationEvent implements Ordered {private int order;private String  name;public ThreeEvent(int order) {super("ThreeEvent async message");this.order = order;}//======================================================public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic int getOrder() {return order;}
}

2.2. 制作一个生成序号方法

此方法当天调用获得的值为9999999 至 0:

public class NumUtil {public static Integer getNum(String type){StringRedisTemplate template = (StringRedisTemplate) SpringContextUtil.getApplicationContext().getBean("stringRedisStdTemplate");String today = DateUtils.format(new Date(), "yyyyMMdd");String key = StringUtils.join(type,"_", today);String numMax = "9999999";if (template.hasKey(key)) {Long decrement = template.opsForValue().decrement(key, 1L);return decrement.intValue();}template.opsForValue().set(key,numMax);template.expire(key, 24 * 60 * 60, TimeUnit.SECONDS);return Integer.valueOf(numMax);}
}

2.3. 制作测试代码

首先定义一个线程池:

@Configuration
@EnableAsync
public class ThreadPoolTaskExecutorConfig {@Bean("yzyThreadPoolExecutor")public ThreadPoolExecutor taskExecutor() {int threads = Math.min(Runtime.getRuntime().availableProcessors() * 2, 20);return new ThreadPoolExecutor(threads, threads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(100),new NamedThreadFactory("jobThreadPoolExecutor-", false));}
}

编写要用线程池执行的方法:

    @Async("yzyThreadPoolExecutor")public void test(){ThreeEvent event1 = new ThreeEvent(NumUtil.getNum(EVENT_NUM));event1.setName("eiuyriuw");SpringContextUtil.getApplicationContext().publishEvent(event1);}

制作执行逻辑:

    @ApiOperation(value = "测试", notes = "测试")@CommonLog(methodName = "测试",className = "TestController#event1")@RequestMapping(value = "/v1/event1", method = RequestMethod.POST)public void event1(){for (int i = 0 ;i<100;i++) {test();i++;}}

2.4. 测试结果

在这里插入图片描述
可以看到在并发环境下,事件监听的执行顺序也可以得到保证。

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

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

相关文章

如何在 Excel 中进行加,减,乘,除

在本教程中&#xff0c;我们将执行基本的算术运算&#xff0c;即加法&#xff0c;减法&#xff0c;除法和乘法。 下表显示了我们将使用的数据以及预期的结果。 | **S / N** | **算术运算符** | **第一个号码** | **第二个号码** | **结果** | | 1 | 加法&#xff08;&#xff…

mysql报错You do not have the SUPER privilege and binary logging is enabled

创建触发器,显示You do not have the SUPER privilege and binary logging is enabled CREATE TRIGGER delete_lottery_template AFTER DELETE ON lottery_info FOR EACH ROW BEGINDELETE FROM lottery_template WHERE lottery_template_id old.lottery_template_id; END; …

C#,《小白学程序》第二十六课:大数乘法(BigInteger Multiply)的Toom-Cook 3算法及源程序

凑数的&#xff0c;仅供参考。 1 文本格式 /// <summary> /// 《小白学程序》第二十六课&#xff1a;大数&#xff08;BigInteger&#xff09;的Toom-Cook 3乘法 /// Toom-Cook 3-Way Multiplication /// </summary> /// <param name"a"></par…

【AI视野·今日NLP 自然语言处理论文速览 第三十五期】Mon, 18 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 18 Sep 2023 Totally 51 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers "Merge Conflicts!" Exploring the Impacts of External Distractors to Parametric Knowledge Gra…

6.1、Flink数据写入到文件

1、前言 Flink API 提供了FileSink连接器&#xff0c;来帮助我们将数据写出到文件系统中去 版本说明&#xff1a;java1.8、flink1.17 官网链接&#xff1a;官网 2、Format Types - 指定文件格式 FileSink 支持 Row-encoded 、Bulk-encoded 两种格式写入文件系统 Row-encode…

Vulnhub实战-DC9

前言 本次的实验靶场是Vulnhub上面的DC-9&#xff0c;其中的渗透测试过程比较多&#xff0c;最终的目的是要找到其中的flag。 一、信息收集 对目标网络进行扫描 arp-scan -l 对目标进行端口扫描 nmap -sC -sV -oA dc-9 192.168.1.131 扫描出目标开放了22和80两个端口&a…

GFS分布式文件系统

目录 1、GFS理论 1.1、概述 1.2、GFS的基本概念和架构&#xff1a; 1.2.1. 基本概念 1.2.2. 架构&#xff1a; 1.3、GFS的基本组成部分包括&#xff1a; 1.4、GFS具有以下几个关键特点&#xff1a; 1.5、GlusterFS特点 1.6、GFS的术语 1.7、GlusterFS 采用模块化、堆…

【C++】STL简介 | string类的常用接口

目录 STL简介 学string类前的铺垫 概念 为什么要学string类 string类的底层&#xff08;了解&#xff09; 编码表的故事 string类的常用接口与应用 3个必掌握的构造 赋值 访问字符operator[] 初识迭代器&#xff08;iterator&#xff09; 反向迭代器 用范围for遍历…

【微信小程序】swiper的使用

1.swiper的基本使用 <jxz-header></jxz-header> <view class"banner"><swiperprevious-margin"30rpx"autoplayinterval"2000"indicator-dotsindicator-color"rgba(0,0,0,0.3)"indicator-active-color"#bda…

每日一题 337. 打家劫舍 III

难度&#xff1a;中等 整体思路相当于是前两天的方法倒过来&#xff0c;毕竟二叉树最常用的解法就是递归倒推 对于每一颗子树&#xff0c;他必定有一种最大的盗取方法&#xff0c;但是只有它的 root 的盗取情况才会影响到 root 的父节点&#xff0c;即如果收益最大的盗取方法…

虚拟线上发布会带来颠覆性新体验,3D虚拟场景直播迸发品牌新动能

虚拟线上发布会是近年来在数字化营销领域备受关注的形式&#xff0c;而随着虚拟现实技术的不断进步&#xff0c;3D虚拟场景直播更成为了品牌宣传、推广的新选择。可以说&#xff0c;虚拟线上发布会正在以其颠覆性的新体验&#xff0c;为品牌带来全新的活力。 1.突破时空限制&am…

竞赛选题 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

文章目录 0 前言1 课题描述2 实现效果3 算法实现原理3.1 数据集3.2 深度学习识别算法3.3 特征提取主干网络3.4 总体实现流程 4 具体实现4.1 预训练数据格式4.2 部分实现代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计…

09MyBatisX插件

MyBatisX插件 在真正开发过程中对于一些复杂的SQL和多表联查就需要我们自己去编写代码和SQL语句,这个时候可以使用MyBatisX插件帮助我们简化开发 安装MyBatisX插件: File -> Settings -> Plugins -> 搜索MyBatisx插件搜索安装然后重启IDEA 跳转文件功能 由于一个项…

计算机竞赛 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…

Unity Bolt 实现UI拖拽功能

最近在学习使用Bolt插件实现五代码对UGUI Image元素实现拖拽。先看效果 录制_2023_09_15_17_50_45_29 下面是实现方式介绍&#xff1a; 1&#xff1a;注册RectTransformUtility 在使用Bolt插件实现UI拖拽的功能&#xff0c;需要使用 RectTransformUtility.ScreenPointToLoca…

操作系统基本概念

目录 一、基本概述 二、操作系统的特点 &#xff08;一&#xff09;并发性&#xff08;实质是微观的串行、宏观的并行&#xff09; 1. 对比看&#xff1a;并行性 2. 单核CPU和多核CPU &#xff08;二&#xff09;共享性 &#xff08;三&#xff09;虚拟性 &#xff08;…

自动化和数字化在 ERP 系统中意味着什么?

毋庸置疑&#xff0c;ERP系统的作用是让工作更轻松。它可以集成流程&#xff0c;提供关键分析&#xff0c;确保你的企业高效运营。这些信息可以提高你的运营效率&#xff0c;并将有限的人力资本重新部署到更有效、更重要的需求上。事实上&#xff0c;自动化和数字化是ERP系统最…

【Unity程序技巧】Unity中的单例模式的运用

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

爬虫 — 验证码反爬

目录 一、超级鹰二、图片验证模拟登录1、页面分析1.1、模拟用户正常登录流程1.2、识别图片里面的文字 2、代码实现 三、滑块模拟登录1、页面分析2、代码实现&#xff08;通过对比像素获取缺口位置&#xff09; 四、openCV1、简介2、代码3、案例 五、selenium 反爬六、百度智能云…

【QT】day2

1.完善登录框 点击登录按钮后&#xff0c;判断账号&#xff08;admin&#xff09;和密码&#xff08;123456&#xff09;是否一致&#xff0c;如果匹配失败&#xff0c;则弹出错误对话框&#xff0c;文本内容“账号密码不匹配&#xff0c;是否重新登录”&#xff0c;给定两个按…