ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

下单流程解耦新方案-你知道Spring事件监听机制吗

2022-04-17 01:35:23  阅读:180  来源: 互联网

标签:耦新 监听器 Spring 订单 SimpleApplicationEventMulticaster 事件 下单 new 监听


一、Spring事件监听介绍

Spring对事件监听是通过事件类型、事件类型监听和事件发布器3个部分来完成的

// 1. 自定义订单事件
public class OrderEvent extends ApplicationEvent {
...
}
// 2. 定义订单监听器
@Component
public class OrderListener implements ApplicationListener<OrderEvent> {
    @Override
    public void onApplicationEvent(OrderEvent event) {
    // 生成订单、删除购物车、扣减库存
    ```
    }
}
// 3. 通过applicationEventPublisher发布事件
@Resource
private ApplicationEventPublisher applicationEventPublisher;
private void saveOrder(MallUserVO mallUserVO, Long couponUserId, List<ShopCatVO> shopcatVOList, String orderNo) {
    // 订单检查
    ```
    // 生成订单号
    String orderNo = NumberUtil.genOrderNo();
    // 发布订单事件,在事件监听中处理下单逻辑
    applicationEventPublisher.publishEvent(new OrderEvent(orderNo, mallUserVO, couponUserId, shopcatVOList));
    // 所有操作成功后,将订单号返回
    return orderNo;
    ```
}

上面的代码已经是将订单的保存逻辑从下单接口解耦到订单监听器中了,但是Spring使用默认自带的SimpleApplicationEventMulticaster事件监听发布类是同步通知事件监听器的,这里会阻塞下单主线程,影响接口响应时长。

二、使用异步的事件监听发布类

由于默认的SimpleApplicationEventMulticaster类是同步调用,这里可以从2个方面入手:

  1. 从事件监听器:将事件监听器的事件触发方法改为异步执行,例如加入将生成订单、删除购物车、扣减库存逻辑放入线程池,或者是在onApplicationEvent放上上加上@Async注解,表示该方法异步执行。
  2. 通过修改默认事件监听发布类的taskExecutor属性,这样可以使用已有的件监听发布类来优化相关逻辑
/**
 * 系统启动时執行
 */
@Component
public class SpringBeanStartupRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 设置spring默认的事件监听为异步执行
        SimpleApplicationEventMulticaster multicaster = SpringContextUtil.getBean(SimpleApplicationEventMulticaster.class);
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5,
                10,
                60L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(500),
                new CustomizableThreadFactory("newbee—event-task"),
                new ThreadPoolExecutor.CallerRunsPolicy()
        );
        multicaster.setTaskExecutor(threadPoolExecutor);
    }
}

在系统启动时反射修改SimpleApplicationEventMulticaster类的taskExecutor属性,从而让SimpleApplicationEventMulticaster类支持异步事件通知

三、事件监听机制的代码思考

通过事件监听机制,我们将下单逻辑拆分成如下步骤:

  1. 订单检查
  2. 生成订单号
  3. 发布订单事件,在事件监听中处理订单保存逻辑
  4. 所有操作成功后,将订单号返回
    每个步骤都是各自独立不互相影响,后期引入消息队列,对代码的改动也是很少,只需将事件发布和事件监听的代码换成消息队列的消息发送和消息监听即可。

标签:耦新,监听器,Spring,订单,SimpleApplicationEventMulticaster,事件,下单,new,监听
来源: https://www.cnblogs.com/wayn111/p/16154844.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有