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

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

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

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

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


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 中获取执行业务所需的数据:


@Component 
OrderEventListener implements ApplicationListener<OrderEvent> {

    @Autowired
    private InitOut init;


    @Async
    @Override
    public 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传入的参数选择合适的类去执行:


@Component
public class OrderPublisher {
    @Autowired
    public  ApplicationEventPublisher eventPublisher;


    public void OrderEvent( String type, String id,String flag) {
        // 创建事件
        OrderEvent event = new OrderEvent( this, type, id,flag);

        // 发布事件
        eventPublisher.publishEvent(event);
    }
}

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

@Autowired
 TradeComparisonOrderPublisher publisher;
 
public void do(){

 publisher.OrderEvent(null, String.valueOf(trade.Id()),"API");
 
 }

http://www.kler.cn/a/471411.html

相关文章:

  • <style lang=“scss“ scoped>: 这是更常见的写法,也是官方文档中推荐的写法
  • 如何在读博过程中缓解压力
  • 广东省乡镇界arcgis格式shp数据乡镇名称和编码下载内容测评
  • 全局变量(PHP)(小迪网络安全笔记~
  • 【信息系统项目管理师】第15章:项目风险管理过程详解
  • 【网络协议】静态路由详解
  • WebLogic安全基线
  • fail api scope is not declared in the privacy agreement微信小程序uniapp 解决录音无法播放、授权
  • OpenAI CEO 奥特曼发长文《反思》
  • arr.length 和 string.length()
  • Android NDK开发入门3之基本语法
  • 简单的jmeter数据请求学习
  • MYSQL--------事务控制和锁定语句
  • 显示技术进化征程上,海信RGB-Mini LED何以成为“关键力量”?
  • PHP语言的数据库交互
  • selenium合集
  • 基于STM32设计的仓库环境监测与预警系统
  • Python----Python爬虫(selenium的使用,处理弹窗,拖拽元素,调用js方法,等待元素,参数使用)
  • python实战(十三)——基于Bert+HDBSCAN的微博热搜数据挖掘
  • 二叉树的二叉链表和三叉链表