修改多线程优化查询
测试结果为平均100ms
This commit is contained in:
		@@ -8,12 +8,13 @@ import com.yovinchen.xlcs.model.product.Category;
 | 
			
		||||
import com.yovinchen.xlcs.model.product.SkuInfo;
 | 
			
		||||
import com.yovinchen.xlcs.model.search.SkuEs;
 | 
			
		||||
import com.yovinchen.xlcs.vo.user.LeaderAddressVo;
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.concurrent.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClassName: HomeServiceImpl
 | 
			
		||||
@@ -23,6 +24,7 @@ import java.util.Map;
 | 
			
		||||
 * @since 2023/9/25 12:12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
@Slf4j
 | 
			
		||||
public class HomeServiceImpl implements HomeService {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -43,30 +45,105 @@ public class HomeServiceImpl implements HomeService {
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public Map<String, Object> homeData(Long userId) {
 | 
			
		||||
        Map<String, Object> result = new ConcurrentHashMap<>();
 | 
			
		||||
 | 
			
		||||
        Map<String, Object> result = new HashMap<>();
 | 
			
		||||
        //1 根据userId获取当前登录用户提货地址信息
 | 
			
		||||
        // 远程调用service-user模块接口获取需要数据
 | 
			
		||||
        LeaderAddressVo leaderAddressVo = userFeignClient.getUserAddressByUserId(userId);
 | 
			
		||||
        result.put("leaderAddressVo", leaderAddressVo);
 | 
			
		||||
        ExecutorService executorService = Executors.newFixedThreadPool(4);
 | 
			
		||||
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);
 | 
			
		||||
 | 
			
		||||
        //2 获取所有分类
 | 
			
		||||
        // 远程调用service-product模块接口
 | 
			
		||||
        List<Category> categoryList = productFeignClient.findAllCategoryList();
 | 
			
		||||
        result.put("categoryList", categoryList);
 | 
			
		||||
        // 1 根据userId获取当前登录用户地址信息
 | 
			
		||||
        CompletableFuture<Void> getAddressFuture = CompletableFuture.runAsync(() -> {
 | 
			
		||||
            try {
 | 
			
		||||
                LeaderAddressVo leaderAddressVo = userFeignClient.getUserAddressByUserId(userId);
 | 
			
		||||
                if (leaderAddressVo != null) {
 | 
			
		||||
                    result.put("leaderAddressVo", leaderAddressVo);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                log.error("获取地址信息任务出错: {}", e.getMessage(), e);
 | 
			
		||||
            }
 | 
			
		||||
        }, executorService);
 | 
			
		||||
 | 
			
		||||
        //3 获取新人专享商品
 | 
			
		||||
        // 远程调用service-product模块接口
 | 
			
		||||
        List<SkuInfo> newPersonSkuInfoList = productFeignClient.findNewPersonSkuInfoList();
 | 
			
		||||
        result.put("newPersonSkuInfoList", newPersonSkuInfoList);
 | 
			
		||||
        // 设置获取地址信息任务的超时
 | 
			
		||||
        scheduler.schedule(() -> {
 | 
			
		||||
            if (!getAddressFuture.isDone()) {
 | 
			
		||||
                getAddressFuture.complete(null);
 | 
			
		||||
                log.info("获取地址信息任务超时");
 | 
			
		||||
            }
 | 
			
		||||
        }, 1, TimeUnit.SECONDS);
 | 
			
		||||
 | 
			
		||||
        //4 获取爆款商品
 | 
			
		||||
        // 远程调用service-search模块接口
 | 
			
		||||
        // hotscore 热门评分降序排序
 | 
			
		||||
        List<SkuEs> hotSkuList = skuFeignClient.findHotSkuList();
 | 
			
		||||
        result.put("hotSkuList", hotSkuList);
 | 
			
		||||
        // 2 获取所有分类
 | 
			
		||||
        CompletableFuture<Void> getCategoryFuture = CompletableFuture.runAsync(() -> {
 | 
			
		||||
            try {
 | 
			
		||||
                List<Category> categoryList = productFeignClient.findAllCategoryList();
 | 
			
		||||
                if (categoryList != null) {
 | 
			
		||||
                    result.put("categoryList", categoryList);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                log.error("获取所有分类任务出错: {}", e.getMessage(), e);
 | 
			
		||||
            }
 | 
			
		||||
        }, executorService);
 | 
			
		||||
 | 
			
		||||
        // 设置获取所有分类任务的超时
 | 
			
		||||
        scheduler.schedule(() -> {
 | 
			
		||||
            if (!getCategoryFuture.isDone()) {
 | 
			
		||||
                getCategoryFuture.complete(null);
 | 
			
		||||
                log.info("获取所有分类任务超时");
 | 
			
		||||
            }
 | 
			
		||||
        }, 1, TimeUnit.SECONDS);
 | 
			
		||||
 | 
			
		||||
        // 3 获取新人专享商品
 | 
			
		||||
        CompletableFuture<Void> getNewPersonSkuInfoFuture = CompletableFuture.runAsync(() -> {
 | 
			
		||||
            try {
 | 
			
		||||
                List<SkuInfo> newPersonSkuInfoList = productFeignClient.findNewPersonSkuInfoList();
 | 
			
		||||
                if (newPersonSkuInfoList != null) {
 | 
			
		||||
                    result.put("newPersonSkuInfoList", newPersonSkuInfoList);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                log.error("获取新人专享商品任务出错: {}", e.getMessage(), e);
 | 
			
		||||
            }
 | 
			
		||||
        }, executorService);
 | 
			
		||||
 | 
			
		||||
        // 设置获取新人专享商品任务的超时
 | 
			
		||||
        scheduler.schedule(() -> {
 | 
			
		||||
            if (!getNewPersonSkuInfoFuture.isDone()) {
 | 
			
		||||
                getNewPersonSkuInfoFuture.complete(null);
 | 
			
		||||
                log.info("获取新人专享商品任务超时");
 | 
			
		||||
            }
 | 
			
		||||
        }, 1, TimeUnit.SECONDS);
 | 
			
		||||
 | 
			
		||||
        // 4 获取爆款商品
 | 
			
		||||
        CompletableFuture<Void> getHotSkuFuture = CompletableFuture.runAsync(() -> {
 | 
			
		||||
            try {
 | 
			
		||||
                List<SkuEs> hotSkuList = skuFeignClient.findHotSkuList();
 | 
			
		||||
                if (hotSkuList != null) {
 | 
			
		||||
                    result.put("hotSkuList", hotSkuList);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                log.error("获取爆款商品任务出错: {}", e.getMessage(), e);
 | 
			
		||||
            }
 | 
			
		||||
        }, executorService);
 | 
			
		||||
 | 
			
		||||
        // 设置获取爆款商品任务的超时
 | 
			
		||||
        scheduler.schedule(() -> {
 | 
			
		||||
            if (!getHotSkuFuture.isDone()) {
 | 
			
		||||
                getHotSkuFuture.complete(null);
 | 
			
		||||
                log.info("获取爆款商品任务超时");
 | 
			
		||||
            }
 | 
			
		||||
        }, 1, TimeUnit.SECONDS);
 | 
			
		||||
 | 
			
		||||
        // 等待所有任务完成
 | 
			
		||||
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(getAddressFuture, getCategoryFuture, getNewPersonSkuInfoFuture, getHotSkuFuture);
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            allFutures.get(); // 等待所有任务完成
 | 
			
		||||
        } catch (InterruptedException | ExecutionException e) {
 | 
			
		||||
            log.error("任务执行出错: {}", e.getMessage(), e);
 | 
			
		||||
        } finally {
 | 
			
		||||
            executorService.shutdown(); // 关闭线程池
 | 
			
		||||
            scheduler.shutdown(); // 关闭调度器
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //5 封装获取数据到map集合,返回
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user