一、创建线程池
:::success 创建线程池,最好自定义 :::
// 创建的方法@Configurationpublic class MyThreadConfig {@Beanpublic ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool){return new ThreadPoolExecutor(pool.getCoreSize(),pool.getMaxSize(),pool.getKeepAliveTime(),TimeUnit.SECONDS,new LinkedBlockingQueue(100000),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());}}// 参数类-方便使用属性文件配置@ConfigurationProperties(prefix = "ermiaomail.thread")@Component@Datapublic class ThreadPoolConfigProperties {private Integer coreSize;private Integer maxSize;private Integer keepAliveTime;}
二、使用异步编排
:::success
CompletableFutrue
CSDN文档:异步编排文档
:::

:::danger
使用 CompletableFuture 编写代码时,异常处理很重要
详细文档:异步编排异常捕获文档
:::
| | handle() | whenComplete() | exceptionly() |
| —- | —- | —- | —- |
| 访问成功 | Yes | Yes | No |
| 访问失败 | Yes | Yes | Yes |
| 能从失败中恢复 | Yes | No | Yes |
| 能转换结果从T 到 U | Yes | No | No |
| 成功时触发 | Yes | Yes | No |
| 失败时触发 | Yes | Yes | Yes |
| 有异步版本 | Yes | Yes | Yes(12版本) |
| 方法名 | 是否需要return | |
|---|---|---|
| runAsync | 否 | |
| supplyAsync | 是 |
@AutowiredThreadPoolExecutor poolExecutor;@Overridepublic SkuItemVo item(Long skuId) {SkuItemVo item = new SkuItemVo();// 1、sku基本信息 pms_sku_infoCompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {SkuInfoEntity sku = getSkuById(skuId);item.setInfo(sku);return sku;}, poolExecutor);// 3、异步获取spu的销售属性组合CompletableFuture<Void> saleAttrFutrue = infoFuture.thenAcceptAsync((res) -> {List<SkuItemSaleAttrVo> saleAttrs = skuSaleAttrValueService.getSaleAttrBySpuId(res.getSpuId());item.setSaleAttr(saleAttrs);}, poolExecutor);// 4、异步获取spu的介绍CompletableFuture<Void> descFutrue = infoFuture.thenAcceptAsync((res) -> {SpuInfoDescEntity spuDesc = descService.getById(res.getSpuId());item.setDesp(spuDesc);}, poolExecutor);// 5、获取spu的规格参数信息CompletableFuture<Void> baseAttrFutrue = infoFuture.thenAcceptAsync((res) -> {List<SpuItemGroupAttrVo> groupAttrs = attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(), res.getCatalogId());item.setGroupAttrs(groupAttrs);}, poolExecutor);//Long catalogId = sku.getCatalogId();// 2、sku的图片信息 pms_sku_imgesCompletableFuture<Void> imageFutrue = CompletableFuture.runAsync(() -> {List<SkuImagesEntity> imgList = imagesService.getImagesBySkuId(skuId);item.setImages(imgList);}, poolExecutor);try {CompletableFuture.allOf(saleAttrFutrue,descFutrue,baseAttrFutrue,imageFutrue).get();} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}return item;}
