使用CompletableFuture实现异步编排

public static void main(String[] args) {
    try {
        CompletableFuture<List<ReqDto>> listCompletableFuture = processOrder();
        List<ReqDto> reqDtoList = (List<ReqDto>) listCompletableFuture.get();
        List<Long> longList = reqDtoList.stream().map(ReqDto::getId).collect(Collectors.toList());
        System.out.println(StringUtils.join(longList, "、"));
    } catch (Exception e) {
        e.printStackTrace();
    }

}
public static CompletableFuture<List<ReqDto>> processOrder() {
        List<Long> taskList = Arrays.asList(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L);
        Stream<CompletableFuture<ReqDto>> completableFutureStream = taskList.stream().map(num -> {
            return CompletableFuture.supplyAsync(() -> func(num));
        });
        CompletableFuture[] completableFutures = completableFutureStream.toArray(CompletableFuture[]::new);
//        // 并行启动三个异步任务,分别获取订单信息、用户信息和支付信息
//        CompletableFuture<ReqDto> orderFuture = CompletableFuture.supplyAsync(() -> func(1L));
//        CompletableFuture<ReqDto> userFuture = CompletableFuture.supplyAsync(() -> func(2L));
//        CompletableFuture<ReqDto> paymentFuture = CompletableFuture.supplyAsync(() -> func(3L));

        // 等待所有异步任务完成,并将结果封装到OrderDTO对象中
//        return CompletableFuture.allOf(orderFuture, userFuture, paymentFuture)
        CompletableFuture<List<ReqDto>> listCompletableFuture = CompletableFuture.allOf(completableFutures)
                .thenApply(v -> {
                    List<ReqDto> dtoList = new ArrayList<>();
                    for (CompletableFuture completableFuture : completableFutures) {
                        dtoList.add((ReqDto) completableFuture.join());
                    }
//                    dtoList.add(orderFuture.join());
//                    dtoList.add(userFuture.join());
//                    dtoList.add(paymentFuture.join());
                    return dtoList;
                });
        listCompletableFuture.join();
//        .whenComplete((aBoolean, throwable) -> System.out.println("处理结束"))
        System.out.println("所有都执行完毕");
        return listCompletableFuture;
    }
public static ReqDto func(Long lo) {
        System.out.println("lo=" + lo);
        try {
            if (lo.equals(2L)) {
                throw new BusinessException("出现了2异常");
            } else if (lo.equals(3L)) {
                throw new RuntimeException("出现了3异常");
            }
        } catch (BusinessException e) {

        } catch (RuntimeException e) {

        }
        ReqDto reqDto = new ReqDto();
        reqDto.setId(lo);
        return reqDto;
    }

lo=2
lo=3
lo=1
lo=4
lo=5
lo=6
lo=7
lo=8
lo=9
lo=10
处理结束
1、2、3、4、5、6、7、8、9、10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值