商品详情-创建线程池异步编排

Posted 程序彤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了商品详情-创建线程池异步编排相关的知识,希望对你有一定的参考价值。

  1. 可将线程池7大参数额外声明写进配置文件

//@EnableConfigurationProperties(ThreadPoolConfigProperties.class)
@Configuration
public class MyThreadConfig 

    @Bean
    public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool) 
        return new ThreadPoolExecutor(pool.getCoreSize(),
                pool.getMaxSize(),
                pool.getKeepAliveTime(),
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(100000),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
    


//可配置在配置文件中
@ConfigurationProperties(prefix = "ershoumall.thread")
@Component
@Data
public class ThreadPoolConfigProperties 
    private Integer coreSize;
    private Integer maxSize;
    private Integer keepAliveTime;


  1. 在具体商品详情业务中,使用CompletableFuture调用多种情况下如何执行任务的方法,完成异步接口调用。

    @Override
    public SkuItemVo item(Long skuId) throws ExecutionException, InterruptedException 
        SkuItemVo skuItemVo  = new SkuItemVo();

        CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> 
            //1、sku基本信息获取  pms_sku_info
            SkuInfoEntity info = getById(skuId);
            skuItemVo.setInfo(info);
            return info;
        , executor);

        CompletableFuture<Void> saleAttrFuture = infoFuture.thenAcceptAsync((res) -> 
            //3、获取spu的销售属性组合。
            List<SkuItemSaleAttrVo> saleAttrVos = skuSaleAttrValueService.getSaleAttrsBySpuId(res.getSpuId());
            skuItemVo.setSaleAttr(saleAttrVos);
        , executor);

        CompletableFuture<Void> descFuture = infoFuture.thenAcceptAsync(res -> 
            //4、获取spu的介绍  pms_spu_info_desc
            SpuInfoDescEntity spuInfoDescEntity = spuInfoDescService.getById(res.getSpuId());
            skuItemVo.setDesp(spuInfoDescEntity);
        , executor);

        CompletableFuture<Void> baseAttrFuture = infoFuture.thenAcceptAsync(res -> 
            //5、获取spu的规格参数信息。

            // 查出spu对应所有属性分组和分组属性对应的值
            List<SpuItemAttrGroupVo> attrGroupVos = attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(), res.getCatalogId());
            skuItemVo.setGroupAttrs(attrGroupVos);
        , executor);



        //2、sku的图片信息  pms_sku_images
        CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> 
            List<SkuImagesEntity> images = imagesService.getImagesBySkuId(skuId);
            skuItemVo.setImages(images);
        , executor);
//
//        //3、查询当前sku是否参与秒杀优惠
//        CompletableFuture<Void> secKillFuture = CompletableFuture.runAsync(() -> 
//            R seckillInfo = seckillFeignService.getSkuSeckillInfo(skuId);
//            if (seckillInfo.getCode() == 0) 
//                SeckillInfoVo seckillInfoVo = seckillInfo.getData(new TypeReference<SeckillInfoVo>() 
//                );
//                skuItemVo.setSeckillInfo(seckillInfoVo);
//            
//        , executor);



        //等到所有任务都完成
        CompletableFuture.allOf(saleAttrFuture,descFuture,baseAttrFuture,imageFuture,secKillFuture).get();


        return skuItemVo;
    

accept只接受值,不返回值。
apply可接受值,可返回提供值。

Either只要其中一个执行完任务即可返回。
After不可接受值不可返回值。

以上是关于商品详情-创建线程池异步编排的主要内容,如果未能解决你的问题,请参考以下文章

商品详情-创建线程池异步编排

CompletableFuture 异步编排

js实现"线程池"限制异步任务数量

线程异步编排串行(CompletableFuture)

线程异步编排串行(CompletableFuture)

从商详页看多线程编排