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

news2025/2/26 22:11:18

文章目录

  • 前言
    • @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;
    }

    @Override
    public 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.coloradmin.cn/o/1027342.html

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

相关文章

【100天精通Python】Day67:Python可视化_Matplotlib 3D绘图,绘制3D曲面图、3D填充图,3D极坐标图,示例+代码

目录 1 绘制曲面图 2 绘制3D填充图 3 绘制极坐标图 1 绘制曲面图 当绘制3D曲面图时&#xff0c;mpl_toolkits.mplot3d 模块中的 Axes3D 对象提供了多种方法来呈现不同类型的曲面图。以下是一些常见的3D曲面图类型以及示例&#xff1a; 曲面图&#xff1a;使用 plot_surface …

19.组合模式(Composite)

意图&#xff1a;将对象组成树状结构以表示“部分&#xff0d;整体”的层次结构&#xff0c;使得Client对单个对象和组合对象的使用具有一致性。 上下文&#xff1a;在树型结构的问题中&#xff0c;Client必须以不同的方式处理单个对象和组合对象。能否提供一种封装&#xff0c…

R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据...

全文链接&#xff1a;http://tecdat.cn/?p24492 此分析的目的是构建一个过程&#xff0c;以在给定时变波动性的情况下正确估计风险价值。风险价值被广泛用于衡量金融机构的市场风险。我们的时间序列数据包括 1258 天的股票收益&#xff08;点击文末“阅读原文”获取完整代码数…

huggingface连接不上的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

北斗导航 | RTD、RTK完好性之B值、VPL与HPL计算(附B值计算matlab源代码)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 1、S矩阵获取 为第i颗卫星测距标准差:

ChatGLM Embedding+LangChain构建行业知识库

写在前面 私有AI知识库的价值巨大。不管是个人、企业或者行业,都可以用它来打造定制化的垂直智库。基于AI大模型的能力,知识的检索和应用将变得异常简单。目前很多行业都在探索落地,比如AI客服、AI导诊、AI法律助手等。 在上两篇文章中,介绍了如何利用白嫖阿里云服务器,D…

Facebook最佳聊单工具--SaleSmartly,智能回复+控评+群控分流

关于SaleSmartlySaleSmartly--全渠道客户沟通平台,它可以帮助企业实现聊天自动化、智能化&#xff0c;提高员工效率&#xff0c;降低人工成本&#xff0c;提升客服质量。 在管理facebook时&#xff0c;你遇到的痛点&#xff1a; &#xff08;1&#xff09;FB聊单如何实现业务最…

黄金代理前景如何,有得搞吗?

现货黄金代理这个职业时常都听人说过了&#xff0c;随着近期现货黄金走势不断出现行情&#xff0c;尤其是美国通胀严重&#xff0c;地缘政治局势频发&#xff0c;黄金走势不断获得支撑而走高。在这样的背景下&#xff0c;现货黄金代理这个职业的前景如何呢&#xff1f; 其实对于…

[python 刷题] 128 Longest Consecutive Sequence

[python 刷题] 128 Longest Consecutive Sequence 题目&#xff1a; Given an unsorted array of integers nums, return the length of the longest consecutive elements sequence. You must write an algorithm that runs in O(n) time. 这题给了一个没有排序的数组&#x…

xyhcms getshell

下载xyhcms3.6.2021版本并用phpstudy搭建 function get_cookie($name, $key ) {if (!isset($_COOKIE[$name])) {return null;}$key empty($key) ? C(CFG_COOKIE_ENCODE) : $key;$value $_COOKIE[$name];$key md5($key);$sc new \Common\Lib\SysCrypt($key);$value $sc-…

php函数usort使用方法

在 PHP 中&#xff0c;usort() 函数用于对数组进行排序&#xff0c;它允许你使用自定义的比较函数来确定元素的顺序。以下是 usort() 函数的使用方法&#xff1a; usort(array &$array, callable $cmp_function): bool参数说明&#xff1a; $array&#xff1a;要排序的数…

增强企业的网络防御:从哪里开始

在当今的数字环境中&#xff0c;网络安全事件已经变得异常普遍&#xff0c;影响着各种规模和行业的企业。中小型企业 (SME) 不再局限于知名组织&#xff0c;由于其潜在的漏洞和应对复杂威胁的资源有限&#xff0c;越来越多地成为网络犯罪分子的目标。 2023 年第一季度&#xf…

Wi-Fi7将带来前所未有的快捷、稳定的互联网,更快的传输速度

随着科技的飞速发展&#xff0c;无线连接技术也日渐成熟与先进。Wi-Fi&#xff0c;作为我们日常生活和工作中不可或缺的一部分&#xff0c;也正在迎来技术的革新。我们将有机会见识到新一代的Wi-Fi技术&#xff0d;&#xff0d;Wi-Fi 7&#xff0c;它将带来前所未有的快捷、稳定…

DES算法子密钥的生成过程

DES算法的一次执行中将进行16轮迭代加密&#xff1b; 从原始的56位密钥中得到16个轮密钥k&#xff0c;每个轮密钥ki是48位&#xff1b; 轮密钥也叫子密钥&#xff1b; 下面看一下子密钥的生成过程&#xff1b; 大体过程是这样&#xff1b;看下图&#xff0c; 此图来自 34.《…

『贪吃蛇』AI 算法简易实现(中秋特别版)

前言 一年一度的中秋节就快到了&#xff0c;平台也有各种各样的中秋发文活动&#xff0c;正在翻阅时偶然间我看到了这篇文章&#xff1a;《兔饼大作战》&#xff1a;吃月饼、见月亮&#xff0c;还能咬自己&#xff1f;| 欢庆中秋特制版 - 掘金 (juejin.cn) 大家肯定比较熟悉了…

XML文件序列化读取

原始XML文件 <?xml version"1.0" encoding"utf-8" ?> <School headmaster"王校长"><Grade grade"12" teacher"张老师"><Student name"小米" age"18"/><Student name&quo…

重装系统(配置环境)

这里写目录标题 0.重装系统1.python1.1 anaconda1.2 pycharm1.3 深度学习环境配置 2.java2.1.安装JDK2.2.配置JDK环境变量2.3IDEA2.4 Maven 3.大数据3.1 虚拟机3.2 Hadoop平台3.3 存储3.4 采集3.5 计算3.6 查询3.7 可视化 0.重装系统 // An highlighted block var foo bar;1.…

Python爬虫(二十一)_Selenium与PhantomJS

本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据&#xff0c;更多内容请参考&#xff1a;Python学习指南 Selenium Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;最初是为网站自动化测试而开发的&#xff0c;类型像我…

数据包络分析(DEA)——CCR模型

写在前面&#xff1a; 博主本人大学期间参加数学建模竞赛十多余次&#xff0c;获奖等级均在二等奖以上。为了让更多学生在数学建模这条路上少走弯路&#xff0c;故将数学建模常用数学模型算法汇聚于此专栏&#xff0c;希望能够对要参加数学建模比赛的同学们有所帮助。 目录 1. …

单元测试spring-boot-starter-test

参考博客&#xff1a; https://www.cnblogs.com/mzc1997/p/14306538.html 配置pom junit-vintage-engine junit4 junit-jupiter-engine junit5 排除junit4使用junit5,两者在切换时要特别注意 <dependency><groupId>org.springframework.boot</groupId><…