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

示例:

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

CompletableFuture 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 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 tenStatistical() {

AjaxResult 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 cf1 = new CompletableFuture<>();

new Thread(() -> {

System.out.println("异步商品统计---->");

Integer goodsCount = 0;

try {

AjaxResult goodsRes = brandClient.countGoodsByTid(tenJson);

if (goodsRes.isSuccess()){

goodsCount = goodsRes.getObj();

}

} catch (Exception e) {

goodsCount = null;

}

// 告诉completableFuture任务已经完成

cf1.complete(goodsCount);

}).start();

//经销商统计,调用ms-dealer服务

CompletableFuture cf2 = new CompletableFuture<>();

new Thread(() -> {

System.out.println("异步经销商统计---->");

Integer dealerCount = 0;

try {

AjaxResult dealerRes = tenDealerClient.countDealerByTid(tenJson);

if (dealerRes.isSuccess()){

dealerCount = dealerRes.getObj();

}

} catch (Exception e) {

dealerCount = null;

}

// 告诉completableFuture任务已经完成

cf2.complete(dealerCount);

}).start();

//会员统计,调用ms-member服务

CompletableFuture cf3 = new CompletableFuture<>();

new Thread(() -> {

System.out.println("异步会员统计---->");

Integer memberCount = 0;

try {

AjaxResult memberRes = tenMemberClient.countMemberByTid(tenJson);

if (memberRes.isSuccess()){

memberCount = memberRes.getObj();

}

} catch (Exception e) {

memberCount = null;

}

// 告诉completableFuture任务已经完成

cf3.complete(memberCount);

}).start();

//防伪码统计,调用ms-code服务

CompletableFuture cf4 = new CompletableFuture<>();

new Thread(() -> {

System.out.println("异步防伪码统计---->");

SecurityCodeCountBean securityCodeCount = new SecurityCodeCountBean();

try {

AjaxResult 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

 

查看原文