参考地址:https://www.jianshu.com/p/6f3ee90ab7d3

示例:

public static void main(String[] args) throws InterruptedException, ExecutionException {

        CompletableFuture<String>  cf1 = new CompletableFuture<>();
        new Thread(() -> {
            // 模拟执行耗时任务
            System.out.println("task doing...");
            try {
                Thread.sleep(3000);
            } catch (Exception e) {
                cf1.completeExceptionally(e);
            }
            // 告诉completableFuture任务已经完成
            cf1.complete("3");
        }).start();


        CompletableFuture<String> cf2 = new CompletableFuture<>();
        new Thread(() -> {
            // 模拟执行耗时任务
            System.out.println("task doing...");
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                cf2.completeExceptionally(e);
            }
            // 告诉completableFuture任务已经完成
            cf2.complete("1");
        }).start();



        System.out.println(cf1.get());
        System.out.println(cf2.get());




    }

 

在spring cloud微服务中调用分别几个其他微服务中的服务接口,放置单线程进行调用,导致接口超时的问题,应用Completablefuture 解决:

@RestController
public class TenTenementApiImpl implements ITenTenementApi{

    @Autowired
    private SysTenementService sysTenementService;

    @Autowired
    private SysTenementConfigService sysTenementConfigService;

    @Autowired
    FeignTenBrandClient brandClient;

    @Autowired
    FeignTenDealerClient tenDealerClient;

    @Autowired
    FeignTenMemberClient tenMemberClient;

    @Autowired
    TenSecurityCodeCountClient tenSecurityCodeCountClient;


    /**
     * 租户首页 统计
     * 企业概况
     *
     * @return
     */
    @Override
    public AjaxResult<TenStatisticalBean> tenStatistical() {

        AjaxResult<TenStatisticalBean> res = new AjaxResult<>();
        TenementUser tenementUser = RequestData.TENEMENT_USER.get();

        //获取租户的企业参数  获取 租户生成码 展示 内码/外码
        SysTenementConfig sysTenementConfig = sysTenementConfigService.findByTenementId(tenementUser.getTenementId());
        if (sysTenementConfig != null){

            String tenJson = JSON.toJSONString(tenementUser);
            TenStatisticalBean bean = new TenStatisticalBean();
            bean.setTid(tenementUser.getTenementId());
            try {

                //商品统计,调用ms-goods服务
                CompletableFuture<Integer> cf1 = new CompletableFuture<>();
                new Thread(() -> {

                    System.out.println("异步商品统计---->");
                    Integer goodsCount = 0;
                    try {
                        AjaxResult<Integer> goodsRes = brandClient.countGoodsByTid(tenJson);
                        if (goodsRes.isSuccess()){
                            goodsCount = goodsRes.getObj();
                        }
                    } catch (Exception e) {
                        goodsCount = null;
                    }
                    // 告诉completableFuture任务已经完成
                    cf1.complete(goodsCount);
                }).start();


                //经销商统计,调用ms-dealer服务
                CompletableFuture<Integer> cf2 = new CompletableFuture<>();
                new Thread(() -> {

                    System.out.println("异步经销商统计---->");
                    Integer dealerCount = 0;
                    try {
                        AjaxResult<Integer> dealerRes = tenDealerClient.countDealerByTid(tenJson);
                        if (dealerRes.isSuccess()){
                            dealerCount = dealerRes.getObj();
                        }
                    } catch (Exception e) {
                        dealerCount = null;
                    }
                    // 告诉completableFuture任务已经完成
                    cf2.complete(dealerCount);
                }).start();


                //会员统计,调用ms-member服务
                CompletableFuture<Integer> cf3 = new CompletableFuture<>();
                new Thread(() -> {

                    System.out.println("异步会员统计---->");
                    Integer memberCount = 0;
                    try {
                        AjaxResult<Integer> memberRes = tenMemberClient.countMemberByTid(tenJson);
                        if (memberRes.isSuccess()){
                            memberCount = memberRes.getObj();
                        }
                    } catch (Exception e) {
                        memberCount = null;
                    }
                    // 告诉completableFuture任务已经完成
                    cf3.complete(memberCount);
                }).start();


                //防伪码统计,调用ms-code服务
                CompletableFuture<SecurityCodeCountBean> cf4 = new CompletableFuture<>();
                new Thread(() -> {

                    System.out.println("异步防伪码统计---->");
                    SecurityCodeCountBean securityCodeCount = new SecurityCodeCountBean();
                    try {
                        AjaxResult<SecurityCodeCountBean> scRes = tenSecurityCodeCountClient.countScCodeByTid(tenJson);
                        securityCodeCount = scRes.getObj();
                        if (scRes.isSuccess() && securityCodeCount != null){

                        }
                    } catch (Exception e) {
                        securityCodeCount = null;
                    }
                    // 告诉completableFuture任务已经完成
                    cf4.complete(securityCodeCount);
                }).start();


                bean.setGoodsCount(cf1.get());
                bean.setDealerCount(cf2.get());
                bean.setMemberCount(cf3.get());
                SecurityCodeCountBean securityCodeCount = cf4.get();
                if (securityCodeCount != null){
                    //设置码号生成总数
                    bean.setScCodeCount(securityCodeCount.getScCode());
                    //设置历史库存
                    bean.setHistoryStock(securityCodeCount.getHistoryStock());
                    //即时库存
                    bean.setImmediateStock(securityCodeCount.getImmediateStock());
                    //经销商库存
                    bean.setDealerStock(securityCodeCount.getDealerStock());
                    //已出售
                    bean.setSellCount(securityCodeCount.getSellCount());
                    //在途
                    bean.setOnWayCount(securityCodeCount.getOnWayCount());
                }

                res.initTrue(bean);
            } catch (InterruptedException e) {
                throw new LunaException(e.getMessage(), LunaResultBean.ERROR_BUSINESS);
            } catch (ExecutionException e) {
                throw new LunaException(e.getMessage(), LunaResultBean.ERROR_BUSINESS);
            }
        }else {
            res.initFalse("租户未配置企业参数",LunaResultBean.ERROR_BUSINESS);
        }
        return res;
    }
}
View Code

相关文章:

  • 2021-10-22
  • 2022-12-23
  • 2021-12-15
  • 2022-12-23
  • 2021-07-03
  • 2021-08-08
  • 2022-01-29
猜你喜欢
  • 2023-03-21
  • 2023-03-19
  • 2022-01-30
  • 2022-02-01
  • 2021-05-22
  • 2022-12-23
相关资源
相似解决方案