当前位置: 首页 > 后端技术 > Java

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

时间:2023-04-02 00:49:16 Java

订单流程解耦新方案——Spring事件监听机制你知道吗?自定义订单事件publicclassOrderEventextendsApplicationEvent{...}//2.定义订单监听器@ComponentpublicclassOrderListenerimplementsApplicationListener{@OverridepublicvoidonApplicationEvent(OrderEventevent){//生成订单,删除购物车,扣除inventory...}}//3.通过applicationEventPublisher发布事件@ResourceprivateApplicationEventPublisherapplicationEventPublisher;privatevoidsaveOrder(MallUserVOmallUserVO,LongcouponUserId,ListshopcatVOList,StringorderNo){//订单查询...//生成订单numberStringorderNo=NumberUtil.genOrderNo();//发布订单事件,在事件监听器中处理订单逻辑applicationEventPublisher.publishEvent(newOrderEvent(orderNo,mallUserVO,couponUserId,shopcatVOList));//所有操作成功后,返回订单号returnorderNo;}上面代码已经将订单保存逻辑从订单接口解耦到订单监听器,但是Spring使用默认的SimpleApplicationEventMulticaster事件监听器将类发布为同步notificationeventlistener有,下单的主线程会阻塞在这里,会影响界面的响应时间。2、使用异步事件监听和发布类由于默认的SimpleApplicationEventMulticaster类是同步调用的,所以这里可以从两个方面入手:从事件监听器:将事件监听器的事件触发方式改成异步执行,比如添加会生成订单,删除购物车,扣除库存逻辑进入线程池,或者在onApplicationEvent中添加@Async注解,表示该方法异步执行。通过修改默认事件监听发布类的taskExecutor属性,可以利用已有的事件监听发布类来优化相关逻辑/***系统启动时执行*/@ComponentpublicclassSpringBeanStartupRunnerimplementsApplicationRunner{@Overridepublicvoidrun(ApplicationArgumentsargs)throwsException{//设置spring的默认事件监听器异步执行SimpleApplicationEventMulticastermulticaster=SpringContextUtil.getBean(SimpleApplicationEventMulticaster.class);ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor(5,10,60L,TimeUnit.lockMILLISECONDS,newLinked),newCustomizableThreadFactory("newbee—event-task"),newThreadPoolExecutor.CallerRunsPolicy());multicaster.setTaskExecutor(threadPoolExecutor);}}在系统启动时反射修改SimpleApplicationEventMulticaster类的taskExecutor属性,使SimpleApplicationEventMulticaster类支持异步事件通知3.事件监听机制的代码思考通过事件监听机制,我们将顺序逻辑拆分为以下步骤:订单查询,生成订单号,发布订单事件,在事件监控中处理订单保存逻辑操作成功后,返回订单号的每一步都是独立的,互不影响。消息队列后面介绍,代码改动很少。只需要将事件发布和事件监听的代码替换成消息发送和监听消息即可,最后贴出实战项目newbeemall的地址