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

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

异步处理编排

  我们可以在商品详细信息查询的位置实现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 {@Beanpublic ThreadPoolExecutor threadPoolExecutor(){return new ThreadPoolExecutor(20,200,10, TimeUnit.SECONDS,new LinkedBlockingQueue(10000), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());}
}

具体的编排处理

//注入线程配置类的线程池  用于服务方法接口的线程创建所需
@AutowiredThreadPoolExecutor threadPoolExecutor;@Overridepublic SpuItemVO item(Long skuId) throws ExecutionException, InterruptedException {SpuItemVO vo = new SpuItemVO();CompletableFuture<SkuInfoEntity> skuInfoFuture = CompletableFuture.supplyAsync(() -> {// 1.sku的基本信息 pms_sku_infoSkuInfoEntity 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_imagesList<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;}

相关文章:

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

异步处理编排 我们可以在商品详细信息查询的位置实现CompletableFuture的异步编排处理。 根据业务分析&#xff1a;3.4.5数据接口的入参信息需要来源于1数据接口的返回信息&#xff0c;也就是skuid 所以可以设计 1 3 4 5 串行线程 &#xff0c;而 3 4 5依赖1 &#xff0c;需要等…...

哈希的应用——位图

文章目录 前言1. 面试题思考2. 位图2.1 位图的概念2.2 思路讲解及代码实现结构定义构造函数set和reset接口实现set和reset测试观察test接口实现test接口测试思考 3. 位图的应用习题1习题2习题3 4. 总结5. 源码5.1 bitset.h5.2 Test.c 前言 前面的文章里我们学习了哈希表&#x…...

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书对外经济贸易大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书对外经济贸易大学图书馆...

合并两个有序链表(每日一题)

“路虽远&#xff0c;行则将至” ❤️主页&#xff1a;小赛毛 ☕今日份刷题&#xff1a;合并两个有序链表 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1&#xff1a; 输入&#xff1a;l1 …...

React Hooks总览

总览 hooks 功能分类具体 hooks具体功能React v18新特性跨端支持数据更新驱动useState定义要在页面中渲染的数据❌✔useReducer定义要在页面中渲染的数据&#xff0c;且这个数据有多种处理逻辑❌✔useSyncExternalStoreconcurrent 模式下&#xff0c;订阅外部 store 的行为&am…...

风向变了!智能汽车何以「降本」

随着软件定义汽车的概念逐步落地&#xff0c;以及底盘、动力、座舱、智驾、车身等不同域&#xff08;分布式或者混合式&#xff09;的功能更新迭代和融合&#xff0c;汽车行业正在意识到&#xff1a;底层硬件架构重构的迫切性。 事实上&#xff0c;早在2016年&#xff0c;作为传…...

后端面试话术集锦第 十五 篇:java线程面试话术

这是后端面试集锦第十五篇博文——java线程面试话术❗❗❗ 1. 创建线程的方式 首先呢,Thread类本质上是实现了Runnable接口,代表一个线程的实例。 所以,我们可以编写一个类,继承Thread类,或者直接实现Runnable接口。然后,再重写下~run方法就行了。启动线程的方式就是调…...

cocos creator配置终端调试

在launch.json里添加"preLaunchTask":“CocosCreator compile” 在cocos creator里选择开发者&#xff0c;visual studio code工作流&#xff0c;选择添加编译任务。 添加 settings.json {"files.exclude":{"**/.git": true,"**/.DS_Sto…...

达梦类型转换问题-float转换为varchar

表结构 CREATE TABLE "SYSDBA"."TABLE_2" ( "COLUMN_1" FLOAT, "COLUMN_2" NUMERIC(22,6)) STORAGE(ON "MAIN", CLUSTERBTR) ; 表数据&#xff1a; 查询&#xff0c;将numeric转换为float&#xff0c;再转换为varchar&…...

怎么用postman连接websocket

点击右侧栏的Collections&#xff0c;然后点击旁边的New&#xff0c;然后点击其中的WebSocket Request,然后输入Url&#xff0c;点击Connection&#xff0c;这里需要注意的是Url不能加上http://&#xff0c;因为这个不是http协议。...

需求分析入门

认识管理软件 什么是管理软件 管理软件就是用来辅助企业进行管理的软件&#xff0c;既包括对企业“人、财、物”相关的资产信息的管理&#xff0c;也包括对企业“供、产、销”相关的业务活动信息的管理。管理软件的重点在于管理信息的收集、流转&#xff0c;资源的共享、集成…...

攻防世界-php_rce

原题 解题思路 thinkPHP.0有漏洞&#xff0c;ThinkPHP5.x rec 漏洞分析与复现。本题就是利用漏洞查找。格式是&#xff1a; ?sindex/\think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]命令。 ls查看文件没什么东西&#xff0c;r…...

最小生成树Kruskal、Prim算法C++

什么是最小生成树 连通图&#xff1a; 在无向图中&#xff0c;若从顶点v1到顶点v2有路径&#xff0c;则称顶点v1和顶点v2是连通的。如果图中任意一对顶点都是连通的&#xff0c;则称此图为连通图。 生成树&#xff1a; 一个连通图的最小连通子图称作为图的生成树。有n个顶点的…...

系统架构设计师-计算机系统基础知识(2)

目录 一、存储管理 1、页式存储 2、段式存储 3、段页式存储 二、磁盘管理 1、先来先服务FCFS 2、最短寻道时间优先SSTF 三、文件系统 1、文件基本概念 2、文件的类型&#xff1a; 3、索引文件结构 4、位示图 四、性能指标 五、性能设计 1、阿姆达尔定律 六、性能评估 1、…...

二叉树的介绍

写在前面&#xff1a; 二叉树是数据结构课程中非常重要的内容&#xff0c;我们针对二叉树的概念、性质以及类型展开详细介绍。 一、概念 二叉树&#xff08;Binary Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集合&#xff0c;该集合或者空集&#xff0…...

数据结构与算法复杂度介绍

目录 一、基本概念 二、时间复杂度 【2.1】时间复杂度概念 【2.2】大O的渐进表示法 【2.3】举例时间复杂度计算 三、空间复杂度 一、基本概念 数据结构&#xff1a;相互之间存在一种或者多种特定关系的数据元素的集合。在逻辑上可以分为线性结构&#xff0c;散列结构、树…...

CentOS 安装蒲公英

官方教程链接&#xff1a; https://service.oray.com/question/5063.html 教程使用的是2.3版本&#xff0c;官网下载的最新版是2.4&#xff0c;所以命令会有所不同 安装成功后&#xff0c; 任意路径下执行pgyvisitor&#xff0c;调出交互界面pgyvisitor login&#xff0c;登录…...

英语语法基础--思维导图

思维导图通常用于可视化和整理信息&#xff0c;而英文语法非常广泛且复杂&#xff0c;无法在一个简单的思维导图中完整表示。然而&#xff0c;我可以提供一个简化版本的英文语法思维导图&#xff0c;列出一些主要的语法概念和部分示例。 请注意&#xff0c;这只是一个基本的概…...

Android泛型详解

参考文献&#xff1a;https://pingfangx.github.io/java-tutorials/java/generics/types.html 1&#xff0c;什么是泛型&#xff1f; Java泛型(generics)是JDK5中引入的一个新特性&#xff0c;泛型提供了 编译时类型安全检测机制&#xff0c; 该机制允许程序员在编译时检测到…...

C++信息学奥赛1178:成绩排序

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int arr[n]; // 创建大小为 n 的整型数组 arrstring brr[n]; // 创建大小为 n 的字符串数组 brrfor(int i0;i<n;i) cin>>brr[i]>>ar…...

StructBERT在嵌入式Linux设备上的轻量化部署方案

StructBERT在嵌入式Linux设备上的轻量化部署方案 1. 为什么要在树莓派上跑StructBERT 你可能已经试过在笔记本或服务器上运行大模型&#xff0c;但有没有想过让AI在树莓派这样的小设备上工作&#xff1f;不是为了炫技&#xff0c;而是因为很多实际场景根本用不上那么大的机器…...

Magma智能剪辑系统:视频自动生成实战

Magma智能剪辑系统&#xff1a;视频自动生成实战 1. 引言 想象一下这样的场景&#xff1a;你有一个精彩的视频创意&#xff0c;写好了详细的脚本&#xff0c;但面对一堆零散的素材片段却无从下手。传统的视频剪辑需要逐帧挑选、拼接、添加转场&#xff0c;一个几分钟的视频可…...

Python MCP服务端框架源码剖析(2024最新LTS版内核解密)

第一章&#xff1a;Python MCP服务端框架源码剖析&#xff08;2024最新LTS版内核解密&#xff09;Python MCP&#xff08;Modular Control Protocol&#xff09;服务端框架2024 LTS版标志着其架构从单体调度向轻量级异步模块总线的重大演进。该版本基于 Python 3.11 构建&#…...

避坑指南:lidar_align标定IMU外参时,loader.cpp源码修改与运动轨迹设计的那些关键细节

避坑指南&#xff1a;lidar_align标定IMU外参的核心细节与实战优化 在自动驾驶和机器人定位领域&#xff0c;激光雷达与IMU的联合标定是系统搭建的关键环节。许多开发者在初次使用lidar_align工具时会遇到各种问题——从源码适配的困惑到标定结果的不可靠。本文将深入剖析两个最…...

ReplaceItems.jsx:基于智能匹配引擎的Illustrator对象替换解决方案

ReplaceItems.jsx&#xff1a;基于智能匹配引擎的Illustrator对象替换解决方案 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 副标题&#xff1a;面向专业设计师的批量元素管理工具…...

DeepSeek-OCR-2效果展示:OCR结果直接生成可编辑Word/PDF双格式

DeepSeek-OCR-2效果展示&#xff1a;OCR结果直接生成可编辑Word/PDF双格式 本文展示DeepSeek-OCR-2模型的强大OCR能力&#xff0c;重点演示如何将扫描文档直接转换为可编辑的Word和PDF格式&#xff0c;让文档数字化变得简单高效。 1. 核心能力概览 DeepSeek-OCR-2是2026年1月发…...

当仿真与FPGA打架时,你该信谁?

该文章同步至公众号OneChan 一、一个真实的故事&#xff1a;比特翻转的“罗生门” 去年&#xff0c;我们在做一款通信芯片的嵌入式固件开发。在仿真环境中&#xff0c;我们精心编写的DMA驱动完美无缺&#xff0c;数据传输的CRC校验次次通过。我们信心满满地把比特流下载到FPG…...

百川2-13B模型实战:Python爬虫数据的智能分析与摘要生成

百川2-13B模型实战&#xff1a;Python爬虫数据的智能分析与摘要生成 每天&#xff0c;互联网上都会产生海量的文本信息&#xff0c;新闻、论坛帖子、社交媒体动态……对于市场分析师、舆情监控人员或者内容运营者来说&#xff0c;如何从这些信息海洋中快速提炼出有价值的内容&…...

Hunyuan-MT-7B-WEBUI新手必看:5分钟搞定部署,开启多语言翻译之旅

Hunyuan-MT-7B-WEBUI新手必看&#xff1a;5分钟搞定部署&#xff0c;开启多语言翻译之旅 1. 为什么选择Hunyuan-MT-7B-WEBUI 在全球化交流日益频繁的今天&#xff0c;语言障碍成为许多个人和团队面临的实际问题。Hunyuan-MT-7B-WEBUI作为腾讯混元开源系列中的翻译专用模型&am…...

千问3.5-2B镜像免配置优势解析:supervisor自恢复+健康检查+7860端口标准化

千问3.5-2B镜像免配置优势解析&#xff1a;supervisor自恢复健康检查7860端口标准化 1. 千问3.5-2B镜像核心价值 千问3.5-2B是Qwen系列的小型视觉语言模型&#xff0c;专为图片理解与文本生成任务优化设计。这个开箱即用的镜像解决了传统AI模型部署中最让人头疼的三个问题&am…...