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

本文介绍了一个简单的线程池配置方法,并通过Spring Boot实现可配置化。此外,还展示了如何利用CompletableFuture结合线程池进行异步任务处理,以提高应用的响应速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.配置线程池

一般的应用整一个线程池就够了,有可能根据业务还是啥的整俩三个,这里我们整一个,直接bean注入使其可配置

package com.atguigu.gulimall.product.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author rengang
 * @version 1.0
 * @date 2021/4/20 15:00
 */

@Configuration
public class MyThreadConfig {

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

}

ThreadPoolConfigProperties 申明可配置属性 ,记得一定要加@Data注解,我刚开始没加配置文件的值就没设置进去

还有加@Component注解后,使用该注解对象的地方就能直接作为参数传入,就不需要加@EnableConfigurationProperties

package com.atguigu.gulimall.product.config;

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

/**
 * @author rengang
 * @version 1.0
 * @date 2021/4/20 15:14
 */
@ConfigurationProperties(prefix = "gulimall.thread")
@Component
@Data
public class ThreadPoolConfigProperties {

    private Integer coreSize;

    private Integer maxSize;

    private Integer keepAliveTime;

}

 

2.使用测试

SkuInfoServiceImpl

根据需求来异步编排,这里我的1,2步互不影响,然后3,4,5步必须要获取第一步的返回值后才能执行,然后方法需要在这5个任务都完成之后才返回值

    @Autowired
    ThreadPoolExecutor myThreadPoolExecutor;
  
  @Override
    public ItemVo queryItemById(Long skuId) throws ExecutionException, InterruptedException {

        ItemVo itemVo = new ItemVo();

        CompletableFuture<ItemVo> skuInfoFuture = CompletableFuture.supplyAsync(() -> {
            //1.sku基本信息
            SkuInfoEntity skuInfoEntity = getById(skuId);
            itemVo.setInfo(skuInfoEntity);
            return itemVo;
        },myThreadPoolExecutor);

        CompletableFuture<Void> imageFuture = CompletableFuture.runAsync(() -> {
            //2.sku的图片信息
            List<SkuImagesEntity> skuImagesEntitys = skuImagesService.getImagesBySkuId(skuId);
            itemVo.setSkuImagesEntitys(skuImagesEntitys);
        },myThreadPoolExecutor);

        CompletableFuture<Void> saleAttrFuture = skuInfoFuture.thenAcceptAsync((skuInfo) -> {
            //3.sku的销售属性
            List<SkuItemSaleAttrVo> skuItemSaleAttrVos = skuSaleAttrValueService.getSaleAttrvaluesBySpuId(skuInfo.getInfo().getSpuId());
            itemVo.setSkuItemSaleAttrVos(skuItemSaleAttrVos);
        },myThreadPoolExecutor);

        CompletableFuture<Void> descFuture = skuInfoFuture.thenAcceptAsync((skuInfo) -> {
            //4.spu的介绍
            SpuInfoDescEntity spuInfoDescEntity = SpuInfoDescService.getById(skuInfo.getInfo().getSpuId());
            itemVo.setSpuInfoDescEntity(spuInfoDescEntity);
        },myThreadPoolExecutor);

        CompletableFuture<Void> groupAttrFuture = skuInfoFuture.thenAcceptAsync((skuInfo) -> {
            //5.spu的规格参数信息(基本属性)
            List<SpuItemAttrGroupVo> spuItemAttrGroupVos = attrGroupService.getAttrGroupWithAttrsByCatIdAndSpuId(skuInfo.getInfo().getSpuId(),
                    skuInfo.getInfo().getCatalogId());

        },myThreadPoolExecutor);
        CompletableFuture.allOf(imageFuture,saleAttrFuture,descFuture,groupAttrFuture).get();
        return itemVo;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我才是真的封不觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值