线程池回滚
This commit is contained in:
		@@ -28,7 +28,6 @@ import com.yovinchen.xlcs.order.service.OrderItemService;
 | 
				
			|||||||
import com.yovinchen.xlcs.vo.order.*;
 | 
					import com.yovinchen.xlcs.vo.order.*;
 | 
				
			||||||
import com.yovinchen.xlcs.vo.product.SkuStockLockVo;
 | 
					import com.yovinchen.xlcs.vo.product.SkuStockLockVo;
 | 
				
			||||||
import com.yovinchen.xlcs.vo.user.LeaderAddressVo;
 | 
					import com.yovinchen.xlcs.vo.user.LeaderAddressVo;
 | 
				
			||||||
import lombok.extern.slf4j.Slf4j;
 | 
					 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.data.redis.core.BoundHashOperations;
 | 
					import org.springframework.data.redis.core.BoundHashOperations;
 | 
				
			||||||
import org.springframework.data.redis.core.RedisTemplate;
 | 
					import org.springframework.data.redis.core.RedisTemplate;
 | 
				
			||||||
@@ -40,7 +39,7 @@ import org.springframework.util.StringUtils;
 | 
				
			|||||||
import java.math.BigDecimal;
 | 
					import java.math.BigDecimal;
 | 
				
			||||||
import java.math.RoundingMode;
 | 
					import java.math.RoundingMode;
 | 
				
			||||||
import java.util.*;
 | 
					import java.util.*;
 | 
				
			||||||
import java.util.concurrent.*;
 | 
					import java.util.concurrent.TimeUnit;
 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -52,7 +51,6 @@ import java.util.stream.Collectors;
 | 
				
			|||||||
 * @since 2023-10-12
 | 
					 * @since 2023-10-12
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@Service
 | 
					@Service
 | 
				
			||||||
@Slf4j
 | 
					 | 
				
			||||||
public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo> implements OrderInfoService {
 | 
					public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo> implements OrderInfoService {
 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private UserFeignClient userFeignClient;
 | 
					    private UserFeignClient userFeignClient;
 | 
				
			||||||
@@ -85,66 +83,29 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public OrderConfirmVo confirmOrder() {
 | 
					    public OrderConfirmVo confirmOrder() {
 | 
				
			||||||
        // 创建一个线程池
 | 
					        //获取用户id
 | 
				
			||||||
        ExecutorService executorService = Executors.newFixedThreadPool(4);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // 创建一个ScheduledExecutorService用于处理超时
 | 
					 | 
				
			||||||
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // 使用CompletableFuture进行多线程异步处理,并设置超时时间为1秒
 | 
					 | 
				
			||||||
        CompletableFuture<LeaderAddressVo> leaderAddressFuture = CompletableFuture.supplyAsync(() -> {
 | 
					 | 
				
			||||||
            // 获取用户id
 | 
					 | 
				
			||||||
        Long userId = AuthContextHolder.getUserId();
 | 
					        Long userId = AuthContextHolder.getUserId();
 | 
				
			||||||
            // 获取用户对应配送员信息
 | 
					 | 
				
			||||||
            return userFeignClient.getUserAddressByUserId(userId);
 | 
					 | 
				
			||||||
        }, executorService);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        CompletableFuture<List<CartInfo>> cartInfoFuture = CompletableFuture.supplyAsync(() -> {
 | 
					        //获取用户对应配送员信息
 | 
				
			||||||
            // 获取用户id
 | 
					        LeaderAddressVo leaderAddressVo = userFeignClient.getUserAddressByUserId(userId);
 | 
				
			||||||
            Long userId = AuthContextHolder.getUserId();
 | 
					 | 
				
			||||||
            // 获取购物车里面选中的商品
 | 
					 | 
				
			||||||
            return cartFeignClient.getCartCheckedList(userId);
 | 
					 | 
				
			||||||
        }, executorService);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 使用ScheduledExecutorService设置超时
 | 
					        //获取购物车里面选中的商品
 | 
				
			||||||
        scheduler.schedule(() -> {
 | 
					        List<CartInfo> cartInfoList = cartFeignClient.getCartCheckedList(userId);
 | 
				
			||||||
            leaderAddressFuture.complete(null);
 | 
					 | 
				
			||||||
            log.info("获取地址信息任务超时");
 | 
					 | 
				
			||||||
        }, 1, TimeUnit.SECONDS);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        scheduler.schedule(() -> {
 | 
					        //唯一标识订单
 | 
				
			||||||
            cartInfoFuture.complete(null);
 | 
					 | 
				
			||||||
            log.info("获取购物车选中商品任务超时");
 | 
					 | 
				
			||||||
        }, 1, TimeUnit.SECONDS);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // 等待上述所有异步任务完成
 | 
					 | 
				
			||||||
        CompletableFuture<Void> allFutures = CompletableFuture.allOf(leaderAddressFuture, cartInfoFuture);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            allFutures.get(); // 等待所有任务完成
 | 
					 | 
				
			||||||
        } catch (InterruptedException | ExecutionException e) {
 | 
					 | 
				
			||||||
            e.printStackTrace();
 | 
					 | 
				
			||||||
        } finally {
 | 
					 | 
				
			||||||
            executorService.shutdown(); // 关闭线程池
 | 
					 | 
				
			||||||
            scheduler.shutdown(); // 关闭调度器
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // 唯一标识订单
 | 
					 | 
				
			||||||
        String orderNo = System.currentTimeMillis() + "";
 | 
					        String orderNo = System.currentTimeMillis() + "";
 | 
				
			||||||
        redisTemplate.opsForValue()
 | 
					        redisTemplate.opsForValue()
 | 
				
			||||||
                .set(RedisConst.ORDER_REPEAT + orderNo, orderNo, 24, TimeUnit.HOURS);
 | 
					                .set(RedisConst.ORDER_REPEAT + orderNo, orderNo, 24, TimeUnit.HOURS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 获取购物车满足条件活动和优惠卷信息
 | 
					        //获取购物车满足条件活动和优惠卷信息
 | 
				
			||||||
        OrderConfirmVo orderConfirmVo = activityFeignClient.findCartActivityAndCoupon(cartInfoFuture.join(), AuthContextHolder.getUserId());
 | 
					        OrderConfirmVo orderConfirmVo = activityFeignClient.findCartActivityAndCoupon(cartInfoList, userId);
 | 
				
			||||||
 | 
					        //封装其他值
 | 
				
			||||||
        // 封装其他值
 | 
					        orderConfirmVo.setLeaderAddressVo(leaderAddressVo);
 | 
				
			||||||
        orderConfirmVo.setLeaderAddressVo(leaderAddressFuture.join());
 | 
					 | 
				
			||||||
        orderConfirmVo.setOrderNo(orderNo);
 | 
					        orderConfirmVo.setOrderNo(orderNo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return orderConfirmVo;
 | 
					        return orderConfirmVo;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 生成订单
 | 
					     * 生成订单
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
@@ -410,14 +371,16 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public IPage<OrderInfo> getOrderInfoByUserIdPage(Page<OrderInfo> pageParam, OrderUserQueryVo orderUserQueryVo) {
 | 
					    public IPage<OrderInfo> getOrderInfoByUserIdPage(Page<OrderInfo> pageParam, OrderUserQueryVo orderUserQueryVo) {
 | 
				
			||||||
        IPage<OrderInfo> pageModel = baseMapper.selectPage(pageParam, new LambdaQueryWrapper<OrderInfo>().eq(OrderInfo::getUserId, orderUserQueryVo.getUserId())
 | 
					        IPage<OrderInfo> pageModel = baseMapper.selectPage(pageParam, new LambdaQueryWrapper<OrderInfo>()
 | 
				
			||||||
 | 
					                .eq(OrderInfo::getUserId, orderUserQueryVo.getUserId())
 | 
				
			||||||
                .eq(OrderInfo::getOrderStatus, orderUserQueryVo.getOrderStatus()));
 | 
					                .eq(OrderInfo::getOrderStatus, orderUserQueryVo.getOrderStatus()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        //获取每个订单,把每个订单里面订单项查询封装
 | 
					        //获取每个订单,把每个订单里面订单项查询封装
 | 
				
			||||||
        List<OrderInfo> orderInfoList = pageModel.getRecords();
 | 
					        List<OrderInfo> orderInfoList = pageModel.getRecords();
 | 
				
			||||||
        for (OrderInfo orderInfo : orderInfoList) {
 | 
					        for (OrderInfo orderInfo : orderInfoList) {
 | 
				
			||||||
            //根据订单id查询里面所有订单项列表
 | 
					            //根据订单id查询里面所有订单项列表
 | 
				
			||||||
            List<OrderItem> orderItemList = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderId, orderInfo.getId()));
 | 
					            List<OrderItem> orderItemList = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>()
 | 
				
			||||||
 | 
					                    .eq(OrderItem::getOrderId, orderInfo.getId()));
 | 
				
			||||||
            //把订单项集合封装到每个订单里面
 | 
					            //把订单项集合封装到每个订单里面
 | 
				
			||||||
            orderInfo.setOrderItemList(orderItemList);
 | 
					            orderInfo.setOrderItemList(orderItemList);
 | 
				
			||||||
            //封装订单状态名称
 | 
					            //封装订单状态名称
 | 
				
			||||||
@@ -464,7 +427,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
 | 
				
			|||||||
        List<OrderInfo> orderInfoList = pageModel.getRecords();
 | 
					        List<OrderInfo> orderInfoList = pageModel.getRecords();
 | 
				
			||||||
        for (OrderInfo orderInfo : orderInfoList) {
 | 
					        for (OrderInfo orderInfo : orderInfoList) {
 | 
				
			||||||
            //根据订单id查询里面所有订单项列表
 | 
					            //根据订单id查询里面所有订单项列表
 | 
				
			||||||
            List<OrderItem> orderItemList = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderId, orderInfo.getId()));
 | 
					            List<OrderItem> orderItemList = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>()
 | 
				
			||||||
 | 
					                    .eq(OrderItem::getOrderId, orderInfo.getId()));
 | 
				
			||||||
            //把订单项集合封装到每个订单里面
 | 
					            //把订单项集合封装到每个订单里面
 | 
				
			||||||
            orderInfo.setOrderItemList(orderItemList);
 | 
					            orderInfo.setOrderItemList(orderItemList);
 | 
				
			||||||
            //封装订单状态名称
 | 
					            //封装订单状态名称
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user