首页 > 其他分享 >73、商城业务---商品详情---异步化编排优化

73、商城业务---商品详情---异步化编排优化

时间:2023-02-08 19:34:14浏览次数:40  
标签:异步 res --- itemVo 73 future01 executor CompletableFuture

我们的业务逻辑如下:

1和2的先后次序无关,但是1必须先于3、4、5执行

1、编写线程池的配置

@Configuration
public class MyThreadConfig {

    @Bean
    public ThreadPoolExecutor threadPoolExecutor(){
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                20,
                200,
                10,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(100000),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());

        return threadPoolExecutor;
    }
}

但是我们希望核心线程数、最大线程数、线程等待时间都是可配置的(在配置文件中可配置),所以进行如下修改
2、编写与配置文件绑定的配置类

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties(prefix = "gulimall.thread")
@Component
@Data
public class ThreadPoolConfigProperties {
    private Integer coreSize;
    private Integer maxSize;
    private Integer keepAliveTime;
}

3、在配置文件中进行配置

4、修改代码
因为我们将ThreadPoolConfigProperties类作为一个组件加入容器了,所以我们在MyThreadConfig类中可以直接使用
如果没有将ThreadPoolConfigProperties类加入容器,可以在MyThreadConfig添加注解来开启属性配置@EnableConfigurationProperties(ThreadPoolConfigProperties.class)

5、使用异步编写业务

    /**
     * 商品详情信息
     * @param skuId
     * @return
     */
    @Override
    public SkuItemVo info(Long skuId) throws ExecutionException, InterruptedException {
        SkuItemVo itemVo = new SkuItemVo();

        CompletableFuture<SkuInfoEntity> future01 = CompletableFuture.supplyAsync(() ->{
            //1、sku基本信息获取  pms_sku_info
            SkuInfoEntity skuInfoEntity = this.getById(skuId);
            itemVo.setInfo(skuInfoEntity);
            return skuInfoEntity;
        }, executor);

        CompletableFuture<Void> future02 = future01.thenAcceptAsync((res) -> {
            //3、获取spu的销售属性组合
            List<SkuItemSaleAttrVo> saleAttr = skuSaleAttrValueService.getSaleAttrsBySpuId(res.getSpuId());
            itemVo.setSaleAttr(saleAttr);
        }, executor);

        CompletableFuture<Void> future03 = future01.thenAcceptAsync((res) -> {
            //4、获取spu的介绍
            SpuInfoDescEntity spuInfoDesc = spuInfoDescService.getById(res.getSpuId());
            itemVo.setDesp(spuInfoDesc);
        }, executor);

        CompletableFuture<Void> future04 = future01.thenAcceptAsync((res) -> {
            //5、获取spu的规格参数信息
            List<SpuItemAttrGroupVo> groupAttrs = attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(), res.getCatalogId());
            itemVo.setGroupAttrs(groupAttrs);
        }, executor);

        //重新开启一个异步
        CompletableFuture<Void> future05 = CompletableFuture.runAsync(() -> {
            //2、sku的图片信息 pms_sku_images
            List<SkuImagesEntity> imagesEntities = skuImagesService.getImagesBySkuId(skuId);
            itemVo.setImages(imagesEntities);
        }, executor);

        //必须所有异步都完成才能返回
        CompletableFuture<Void> allOf = CompletableFuture.allOf(future01, future02, future03, future04, future05);
        allOf.get();

        return itemVo;
    }

标签:异步,res,---,itemVo,73,future01,executor,CompletableFuture
From: https://www.cnblogs.com/morehair/p/17103057.html

相关文章

  • 数据库基础操作 - 4
    6、事物6.1、什么是事物要么都成功,要么都失败一一一一一1、SQL执行A给B转账A1000-->200B2002、SQL执行B收到A的钱A800B400一一一一一将一组SQL放......
  • 在Vivado下如何判断芯片是多die芯片-关于SSI的多方面解答
    1.什么是SSI芯片?SSI是StackedSiliconInterconnect的缩写。SSI芯片其实就是我们通常所说的多die芯片。其基本结构如下图所示。可以看到SSI芯片的基本单元是SLR(SuperLogi......
  • 温习日志-14
    温习日志——2023年2月8日下午学习内容事件冒泡练习通过点击事件中函数参数的e.target就是所点击的具体元素,最终会一直向上传递,通过e.currentTarget获取最终的元素......
  • lC116-填充每一个节点的右节点
    //leetcodesubmitregionbegin(Prohibitmodificationanddeletion)/*//DefinitionforaNode.classNode{publicintval;publicNodeleft;publicNode......
  • AIML教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介AIML<that>标签-从简单和简单的步骤学习AIML,从基本到高级概念,包括简介,环境设置,第一个应用程序,基本标签,<star>等。标签,<srai>标签,<随意>标记,<set>标记,<get>......
  • Python__25--模块
    1创建模块.py文件,文件名不与python自带的标准模块名相同,见名知意2导入模块2.1import模块名称[as别名]导入该模块所有内容使用时需要:模块名称.函数名不会出现函......
  • Vue动态绑定内联样式( v-bind:style )
    <button@click="change"type="button">改变Box大小data(){return{imgStyle:{}}},computed:{imgStyle(){retur......
  • Docker-harbor私有仓库的部署与管理
    一、Harbor概述1、Harbor的概念•Harbor是VMware公司开源的企业级DockerRegistry项目,其目标是帮助用户迅速搭建一个企业级的DockerRegistry服务•Harbor以Docker......
  • Go 工程化 - 使用 expvar 监控接口状态
    expvar 包为程序中的公共变量提供了一个标准化的接口,如服务中的访问计数器。包提供了HTTP接口并以JSON格式输出这些变量,接口的URL路由是 /debug/vars 。最重要的......
  • Spring30 - Resource资源读取
    资源操作:Resources8.1、SpringResources概述Java的标准java.net.URL类和各种URL前缀的标准处理程序无法满足所有对low-level资源的访问,比如:没有标准化的URL实现可用......