zoukankan      html  css  js  c++  java
  • 【多线程】java多线程Completablefuture 详解【在spring cloud微服务之间调用,防止接口超时的应用】【未完成】

    参考地址: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

    附接收的实体:

    public class TenStatisticalBean {
    
        private String tid;//租户ID
    
        private Integer goodsCount;//商品统计
    
        private Integer dealerCount;//经销商统计
    
        private Integer memberCount;//会员统计
    
        private Long scCodeCount;//码号生成统计【此处及以下防伪码相关字段 都只展示  租户配置的产品码类型  内码量/外码量】
    
        private Long historyStock;//历史库存    总共生成码 入 数据库的总量
    
        private Long immediateStock;//即时库存  租户仓库 的库存数量  发货给经销商-   经销商退货给租户+
    
        private Long onWayCount;//在途统计
    
        private Long dealerStock;//经销商库存    经销商发货-  经销商收货+  出售- 出售的退货+
    
        private Long sellCount;//出售统计   所有出售的+ 退货给经销商-
    
    
        public Long getOnWayCount() {
            return onWayCount;
        }
    
        public void setOnWayCount(Long onWayCount) {
            this.onWayCount = onWayCount;
        }
    
        public String getTid() {
            return tid;
        }
    
        public void setTid(String tid) {
            this.tid = tid;
        }
    
        public Integer getGoodsCount() {
            return goodsCount;
        }
    
        public void setGoodsCount(Integer goodsCount) {
            this.goodsCount = goodsCount;
        }
    
        public Integer getDealerCount() {
            return dealerCount;
        }
    
        public void setDealerCount(Integer dealerCount) {
            this.dealerCount = dealerCount;
        }
    
        public Integer getMemberCount() {
            return memberCount;
        }
    
        public void setMemberCount(Integer memberCount) {
            this.memberCount = memberCount;
        }
    
        public Long getScCodeCount() {
            return scCodeCount;
        }
    
        public void setScCodeCount(Long scCodeCount) {
            this.scCodeCount = scCodeCount;
        }
    
        public Long getHistoryStock() {
            return historyStock;
        }
    
        public void setHistoryStock(Long historyStock) {
            this.historyStock = historyStock;
        }
    
        public Long getImmediateStock() {
            return immediateStock;
        }
    
        public void setImmediateStock(Long immediateStock) {
            this.immediateStock = immediateStock;
        }
    
        public Long getDealerStock() {
            return dealerStock;
        }
    
        public void setDealerStock(Long dealerStock) {
            this.dealerStock = dealerStock;
        }
    
        public Long getSellCount() {
            return sellCount;
        }
    
        public void setSellCount(Long sellCount) {
            this.sellCount = sellCount;
        }
    }
    View Code
  • 相关阅读:
    <s:iterator>各种遍历用法
    hibernate4整合spring3事务问题
    web服务器部署过程记录
    svn一次性add/delete所有文件
    svn回退版本/取消修改
    sdk接入
    论坛遇到附件上传失败问题总结(discuz)
    linux下部署monogoDB服务(以及安装php mogodb扩展)
    linux部署svn服务器
    linux下给php安装memcached及memcache扩展(转)
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/9560260.html
Copyright © 2011-2022 走看看