当前位置: 首页 > news >正文

@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.lryc.cn/news/167735.html

相关文章:

  • 数据结构入门 — 树的概念与结构
  • linux驱动开发day6--(epoll实现IO多路复用、信号驱动IO、设备树以及节点和属性解析相关API使用)
  • 9月15日作业
  • 关于Java多线程的那些事
  • 信息化项目验收的依据、内容和验收测评报告
  • 解决IntelliJ IDEA执行maven打包,执行java -jar命令提示jar中没有主清单属性
  • Python--文件和异常
  • IDEFICS 简介: 最先进视觉语言模型的开源复现
  • 玩转Mysql系列 - 第20篇:异常捕获及处理详解
  • 一些工具类
  • 20230916后台面经整理
  • 如何通过快解析测试接口内外网?本地内网ip让外网访问连接
  • 用c++实现五子棋小游戏
  • Android 12.0 SystemUI下拉状态栏定制化之隐藏下拉通知栏布局功能实现(二)
  • 通过finalshell快速在ubuntu上安装jdk1.8
  • 【Linux从入门到精通】多线程 | 线程互斥(互斥锁)
  • Echarts 散点图的详细配置过程
  • Nginx详解 五:反向代理
  • 【PDF密码】PDF文件打开之后不能打印,怎么解决?
  • 深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数
  • Azure + React + ASP.NET Core 项目笔记一:项目环境搭建(二)
  • Vmware通过VMware tools设置共享文件夹
  • RPA机器人流程自动化专题培训大纲 (针对大学生的版本)
  • 数据在内存中的存储——练习4
  • Python 06 之面向对象基础
  • 去除pdf/word的水印艺术字
  • 【Linux】使用 Alist 实现阿里云盘4K播放
  • Gof23设计模式之状态模式
  • 如何免费下载RunWayML产生的视频文件
  • 9.14 C++作业