商品详情-创建线程池异步编排
Posted 程序彤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了商品详情-创建线程池异步编排相关的知识,希望对你有一定的参考价值。
- 可将线程池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;
- 在具体商品详情业务中,使用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不可接受值不可返回值。
以上是关于商品详情-创建线程池异步编排的主要内容,如果未能解决你的问题,请参考以下文章