使用 Spring 的 事件发布和监听机制,结合异步执行 的功能达到方法异步执行

news/2025/1/8 1:13:50/

设计思路
定义事件类:首先,我们需要定义一个事件类,该类将传递必要的参数(例如,null, “API”, Trade.getId())。

异步事件监听器:使用 Spring 的 @Async 注解将监听器设置为异步运行,从而实现异步执行的需求。

事件发布:在调用 init.tradeComparison() 方法之前,发布一个事件,事件会被异步监听器接收并执行。
定义事件类,必须继承ApplicationEvent 类:

java">
public class OrderEvent extends ApplicationEvent {private final String source;private final String type;private final String Id;private final String Flag;public OrderEvent(Object source, String type, String Id,String Flag) {super(source);this.source = type;this.type = type;this.Id = Id;this.Flag = Flag;}public String getFlag() {return Flag;}public String getSource() {return source;}public String getType() {return type;}public String getId() {return Id;}
}

异步事件监听器,有两种实现方法,这里只展示其中一种,必须实现ApplicationListener的onApplicationEvent方法,在这里处理业务逻辑,从event 中获取执行业务所需的数据:

java">
@Component 
OrderEventListener implements ApplicationListener<OrderEvent> {@Autowiredprivate InitOut init;@Async@Overridepublic void onApplicationEvent(OrderEvent event) {// 这里执行异步操作logger.debug("异步执行 tradeComparisonOrder 方法...");// 获取事件中的数据String type = event.getType();String id = event.gettId();String flag = event.getFlag();// 调用实际的业务逻辑方法init.tradeComparison(flag,id);logger.debug("异步执行结束...");}
}

事件发布类,类名和方法名其实是随意的,主要是调用eventPublisher的publishEvent方法发布事件,当监听器监听到事件发布了,就会去执行,当有多个监听器时,会根据publishEvent传入的参数选择合适的类去执行:

java">
@Component
public class OrderPublisher {@Autowiredpublic  ApplicationEventPublisher eventPublisher;public void OrderEvent( String type, String id,String flag) {// 创建事件OrderEvent event = new OrderEvent( this, type, id,flag);// 发布事件eventPublisher.publishEvent(event);}
}

其他地方调用,直接依赖注入后调用即可:

java">@AutowiredTradeComparisonOrderPublisher publisher;public void do(){publisher.OrderEvent(null, String.valueOf(trade.Id()),"API");}

http://www.ppmy.cn/news/1561420.html

相关文章

6 网络编程

基本概念扫盲 为什么需要计算机网络 如下图所示,A、B、C三个不同地域的主机要想进行通信不是凭空就可以通信的,而是需要基于互联网进行互相连接、通信。 为什么需要协议 如下图所示,红和蓝是联合攻打绿,它们以烽火为信号出动攻打绿,那么这时候就需要一个约定,比如红先…

【C++数据结构——图】最短路径(头歌教学实验平台习题) 【合集】

目录&#x1f60b; 任务描述 相关知识 带权有向图 Dijkstra算法 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;利用Dijkstra算法&#xff0c;实现带权有向图的最短路径。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#x…

(五)善用背景设定,让 ChatGPT 回答更精准

&#x1f4e2;&#x1f4e2;&#x1f4e2; 大家好&#xff0c;我是云楼Yunlord&#xff0c;CSDN博客之星人工智能领域前三名&#xff0c;多年人工智能学习工作经验&#xff0c;一位兴趣稀奇古怪的【人工智能领域博主】&#xff01;&#xff01;&#xff01;&#x1f61c;&#…

最新MySQL面试题(2025超详细版)

2025最新超详细MySQL面试题 文章目录 2025最新超详细MySQL面试题[toc]一、 SQL 和基本操作1. SQL的执行顺序2. 如何优化MySQL查询3. 常用的聚合函数4. 数据库事务5. 事务的四大特性(ACID)6. 视图7. MySQL中使用LIMIT子句进行分页8. MySQL中使用变量和用户定义的函数9. MySQL中的…

Flink系列知识讲解之:深入了解 Flink 的网络协议栈

Flink系列知识之&#xff1a;深入了解 Flink 的网络协议栈 Flink 的网络协议栈是组成 flink-runtime 模块的核心组件之一&#xff0c;也是每个 Flink 任务的核心。它连接着来自所有任务管理器的各个工作单元&#xff08;子任务&#xff09;。这是流数据流过的地方&#xff0c;…

ThreadLocal` 的工作原理

ThreadLocal 的工作原理&#xff1a; ThreadLocal 是 Java 提供的一个类&#xff0c;它用于为每个线程提供独立的变量副本。也就是说&#xff0c;多个线程访问同一个 ThreadLocal 变量时&#xff0c;每个线程看到的值都是不同的&#xff0c;相互隔离&#xff0c;互不干扰。 T…

【华为OD-E卷 - 观看文艺汇演问题 100分(python、java、c++、js、c)】

【华为OD-E卷 - 观看文艺汇演问题 100分&#xff08;python、java、c、js、c&#xff09;】 题目 为了庆祝中国共产党成立 100 周年&#xff0c;某公园将举行多场文艺表演&#xff0c;很多演出都是同时进行。 一个人只能同时观看一场演出&#xff0c;且不能迟到早退。 由于演…

《小型支付商城系统》项目(一)DDD架构入门

目录 1.DDD架构 1.1充血模型 1.2领域模型 1.2.1实体 1.2.2值对象 1.2.3聚合 1.2.4领域服务 1.2.5工厂 1.2.6仓储&#xff08;Repository&#xff09; 2.DDD建模 3.DDD工程模型 项目介绍&#xff1a;知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff…