乐趣区

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

一、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. 所有操作胜利后,将订单号返回
    每个步骤都是各自独立不相互影响,前期引入音讯队列,对代码的改变也是很少,只需将事件公布和事件监听的代码换成音讯队列的音讯发送和音讯监听即可。

最初贴一下实战我的项目地址 newbeemall

退出移动版