【业务功能篇93】微服务-springcloud-多线程-异步处理-异步编排-CompletableFutrue-实战运用

news2024/11/14 3:48:01

异步处理编排

  我们可以在商品详细信息查询的位置实现CompletableFuture的异步编排处理。

根据业务分析:3.4.5数据接口的入参信息需要来源于1数据接口的返回信息,也就是skuid 所以可以设计 1 3 4 5 串行线程 ,而 3 4 5依赖1 ,需要等1 执行完成
2接口数据没有关系,所以就与上面的线程是并行关系
所以就是 1 2 接口数据是并行执行 而3 4 5与1 是串行执行 进行异步编排设计,提高接口访问效率
这样处理后,原本5个接口 假如每个接口都需要2s,那么一共就是要10s了,现在就是缩减了,因为1与2接口是并行执行,而3 4 5也是并行的。所以时间上肯定是能较大程度缩减的
image.png

先定义线程池

 // 第一种获取的方式
 //ExecutorService service = Executors.newFixedThreadPool(10);
 // Executors.newCachedThreadPool()
 // Executors.newScheduledThreadPool() 定时任务的线程池
 // Executors.newSingleThreadExecutor(); // 线程池中永远只有一个线程去处理,并发的情况下会被变为同步的处理

 // 第二种方式: 直接new ThreadPoolExecutor()对象,并且手动的指定对应的参数
 // corePoolSize:线程池的核心线程数量 线程池创建出来后就会 new Thread() 5个
 // maximumPoolSize:最大的线程数量,线程池支持的最大的线程数
 // keepAliveTime:存活时间,当线程数大于核心线程,空闲的线程的存活时间 8-5=3
 // unit:存活时间的单位
 // BlockingQueue<Runnable> workQueue:阻塞队列 当线程数超过了核心线程数据,那么新的请求到来的时候会加入到阻塞的队列中
 // new LinkedBlockingQueue<>() 默认队列的长度是 Integer.MAX 那这个就太大了,所以我们需要指定队列的长度
 // threadFactory:创建线程的工厂对象
 // RejectedExecutionHandler handler:当线程数大于最大线程数的时候会执行的淘汰策略
@Configuration
public class MyThreadPoolConfig {

    @Bean
    public ThreadPoolExecutor threadPoolExecutor()
    {
        return new ThreadPoolExecutor(20
                ,200
                ,10
                , TimeUnit.SECONDS
                ,new LinkedBlockingQueue(10000)
                , Executors.defaultThreadFactory()
                ,new ThreadPoolExecutor.AbortPolicy()
        );
    }
}

具体的编排处理

//注入线程配置类的线程池  用于服务方法接口的线程创建所需
@Autowired
    ThreadPoolExecutor threadPoolExecutor;

@Override
    public SpuItemVO item(Long skuId) throws ExecutionException, InterruptedException {
        SpuItemVO vo = new SpuItemVO();
        CompletableFuture<SkuInfoEntity> skuInfoFuture = CompletableFuture.supplyAsync(() -> {
            // 1.sku的基本信息 pms_sku_info
            SkuInfoEntity skuInfoEntity = getById(skuId);
            vo.setInfo(skuInfoEntity);

            return skuInfoEntity;
        }, threadPoolExecutor);

        //thenAcceptAsync 等待前面的异步任务完成后 获取其返回值做相应的业务处理,该任务没返回值,因为主要是获取前面的sku信息做入参 不需要有返回值
        CompletableFuture<Void> saleFuture = skuInfoFuture.thenAcceptAsync((res) -> {
            // 3.获取spu中的销售属性的组合
            List<SkuItemSaleAttrVo> saleAttrs = skuSaleAttrValueService
                    .getSkuSaleAttrValueBySpuId(res.getSpuId());
            vo.setSaleAttrs(saleAttrs);
        }, threadPoolExecutor);

        CompletableFuture<Void> spuFuture = skuInfoFuture.thenAcceptAsync((res) -> {
            // 4.获取SPU的介绍
            SpuInfoDescEntity spuInfoDescEntity = spuInfoDescService.getById(res.getSpuId());
            vo.setDesc(spuInfoDescEntity);
        }, threadPoolExecutor);


        CompletableFuture<Void> groupFuture = skuInfoFuture.thenAcceptAsync((res) -> {
            // 5.获取SPU的规格参数
            List<SpuItemGroupAttrVo> groupAttrVo = attrGroupService
                    .getAttrgroupWithSpuId(res.getSpuId(), res.getCatalogId());
            vo.setBaseAttrs(groupAttrVo);
        }, threadPoolExecutor);

        //runAsync 异步任务无需返回值
        CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> {
            // 2.sku的图片信息pms_sku_images
            List<SkuImagesEntity> images = skuImagesService.getImagesBySkuId(skuId);
            vo.setImages(images);
        }, threadPoolExecutor);

        CompletableFuture<Void> seckillFuture = CompletableFuture.runAsync(() -> {
            // 查询商品的秒杀活动
            R r = seckillFeignService.getSeckillSessionBySkuId(skuId);
            if(r.getCode() == 0){
                SeckillVO seckillVO = JSON.parseObject(r.get("data").toString(),SeckillVO.class);
                vo.setSeckillVO(seckillVO);
            }
        }, threadPoolExecutor);


        //最后  allOF等待阻塞上面的异步任务完成后再返回值,由于3 4 5是依赖于 1skuInfoFuture异步任务完成,所以无需将1写入也可以
        CompletableFuture.allOf(saleFuture,spuFuture,imageFuture,groupFuture,seckillFuture).get();
        return vo;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/958647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023下半年深圳软考信息系统项目管理师认证开班中,快来报名

信息系统项目管理师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资…

运营超5000万公里,再签700辆订单,嬴彻卡车NOA引领商用车自动驾驶商业化

从主动安全到智能驾驶&#xff0c;商用车自动驾驶商业化进程已经明显提速。 8月29日&#xff0c;嬴彻科技举办以“奔跑吧 卡车NOA”为主题的第二届嬴彻科技日&#xff0c;宣布嬴彻卡车NOA&#xff08;导航辅助驾驶&#xff09;已经突破5000万公里&#xff0c;并实现安全运营零…

骨传导耳机有副作用吗?骨感耳机有什么弊端?

骨传导耳机是通过振动骨骼传达声音信号到内耳而非通过耳道传输的&#xff0c;因此相较于传统耳机&#xff0c;其对耳道和鼓膜的刺激较小&#xff0c;可以说骨传导耳机在使用中是没有副作用的。 不过&#xff0c;任何产品都不是十全十美的&#xff0c;那么骨传导耳机有什么弊端…

python 笔记(3)——request

目录 1、使用requests发送http请求 1-1&#xff09;发送get请求 1-2&#xff09;发送 post 请求 1-3&#xff09;发送 get 请求下载网络图片 1-4&#xff09;使用 post 上传文件 1-5&#xff09;自动维护 session 的方式 2、使用 os.popen 执行cmd命令 3、基于 beautif…

Git学习——细节补充

Git学习——细节补充 1. git diff2. git log3. git reset4. git reflog5. 提交撤销5.1 当你改乱了工作区某个文件的内容&#xff0c;想直接丢弃工作区的修改时5.2 当提交到了stage区后&#xff0c;想要退回 6. git remote7. git pull origin master --no-rebase8. 分支管理9. g…

【100天精通python】Day46:python网络编程_网络编程基础与入门

目录 专栏导读 1 网络编程的基础 2. 基本概念和协议 2.1 计算机网络基础 2.2 网络协议、IP地址、端口号 2.3 常见网络协议 3. 套接字编程 3.1 套接字的基本概念 3.2 套接字的基本操作 3.3 套接字通信模型和方法&#xff1a;send、recv 3.3.1 TCP通信模型 3.3.2 U…

linux-samba-window登不上

登不上查了很久发现是防火墙导致的 sudo firewall-cmd --list-all //查看所有的防火墙信息sudo firewall-cmd --permanent --zonepublic --add-servicesamba //service里添加sambafirewall-cmd --reload //重启 便可以登录了,小问题

VirtualBox7+Ubuntu22集群规划

1. 目的: 新入手了一台小主机&#xff08;8核 / Intel(R) Xeon(R) W-10885M CPU 2.40GHz 2.40 GHz, 16vCpu / 64G RAM / 系统类型 64 位操作系统, 基于 x64 的处理器&#xff09;&#xff0c;原装了一套Win11专业版&#xff0c;打算用VirtualBox 虚拟一个集群。 2. …

电脑可以上网,微信都可以用,但浏览器打不开网页

可以试试设置DNS&#xff08;其他windows版本步骤&#xff09;&#xff1a; 1.打开控制面板 2.网络和Internet 3.查看网络计算机和设备 4.按照下图步骤&#xff1a; 5.按下图进行

深度学习论文分享(九)Unifying Motion Deblurring and Frame Interpolation with Events

深度学习论文分享&#xff08;九&#xff09;Unifying Motion Deblurring and Frame Interpolation with Events 前言Abstract1. Introduction2. Related Work2.1. Frame Interpolation2.2. Motion Deblurring2.3. Joint Deblurring and Interpolation 3. Problem Statement4. …

BL122:钡铼技术驱动,实现无缝Modbus到Profinet转换

钡铼技术BL122协议转换网关是一款专业的设备&#xff0c;用于将Modbus协议转换为Profinet协议。BL122采用了先进的嵌入式ARM MCU和基于Linux OS系统的开发&#xff0c;具备出色的性能和高度的稳定性。 BL122支持多种下行采集方式&#xff0c;包括Modbus RTU、Modbus TCP和Modbu…

Playwright for Python:安装及初步使用

文章目录 一、Playwright介绍1.1 简单介绍1.2 支持的平台1.3 支持语言1.4 官方文档&#xff08;python&#xff09; 二、开始2.1 安装要求2.2 安装2.3 脚本录制2.4 代码示例 一、Playwright介绍 1.1 简单介绍 Playwright是微软推出来的一款自动化测试工具&#xff0c;是专门为…

机器视觉工程师,没有错误

记住&#xff0c;在生活中&#xff0c;自己要会享受。在工作&#xff0c;做到一丝不苟。在技术上&#xff0c;追求精益。 人生不是那么一帆风顺&#xff0c;更不是坎坎坷坷&#xff0c;希望你们是曲折上升的&#xff0c;虽不能大富大贵&#xff0c;只要自己努力完全可以小康。…

华为OD机试 - 符合要求的元组的个数 - 回溯(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 一、题目描述 给定一个整数数组nums、一个数字k&#xff0c;一个整数目标值target&#xff0c;请问nums中…

pdf加密如何解除?这样解除加密很简单

pdf加密如何解除&#xff1f;有时&#xff0c;我们可能会收到一些加密的PDF文件&#xff0c;它们不允许我们对其进行编辑或打印。这时&#xff0c;我们需要使用PDF解密工具&#xff0c;以便能够轻松地解除PDF加密并对其进行编辑。那么接下来就给大家介绍一下pdf加密解除的方法。…

Vue基础2:传值方法

Description 传值就是为了联动&#xff0c;能够及时准确传值获取值才是王道。 Valuation Methods props和$emit props是父传子&#xff0c;$emit是子传父。 props的使用 父组件传出值 <tableList ref"table" :options"options" :header-data"C…

GE MRP680489 IS200VTCCH1CBB印刷电路板

信号处理&#xff1a; 这个印刷电路板通常用于信号处理和数据传输&#xff0c;可以与其他设备或模块进行通信&#xff0c;如传感器、执行器或控制器。 通信接口&#xff1a; IS200VTCCH1CBB 可能具有多种通信接口&#xff0c;用于与其他设备和系统进行数据交换&#xff0c;包括…

通过「内网穿透」技术,实现出差期间远程访问企业局域网中的象过河ERP系统

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻&#xff0c;不管是财务、生产、销售还是采购&#xff0c;都需要用到ERP系统来协助。…

8月31日-9月 第六章 案例:MySQL主从复制与读写分离(面试重点,必记)

本章结构 案例概述 案例前置知识点 详细图示 1、什么是读写分离&#xff1f; 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导…

基于Python的IOS自动化测试环境搭建

文章目录 一、测试架构介绍1.1 WebDriverAgent原理分析1.2 tidevice原理分析二、环境安装2.1 iOS 设备安装 WebDriverAgent2.2 安装iTunes2.3 安装tidevice2.4 安装facebook-wda自动化三、操作流程一、测试架构介绍 以下为测试架构原理图 手机端的WDA Runner(WebDriverAgent…