参考地址:https://www.jianshu.com/p/6f3ee90ab7d3
示例:
public static void main(String[] args) throws InterruptedException, ExecutionException {
CompletableFuture
new Thread(() -> {
// 模拟执行耗时任务
System.out.println("task doing...");
try {
Thread.sleep(3000);
} catch (Exception e) {
cf1.completeExceptionally(e);
}
// 告诉completableFuture任务已经完成
cf1.complete("3");
}).start();
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
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
new Thread(() -> {
System.out.println("异步商品统计---->");
Integer goodsCount = 0;
try {
AjaxResult
if (goodsRes.isSuccess()){
goodsCount = goodsRes.getObj();
}
} catch (Exception e) {
goodsCount = null;
}
// 告诉completableFuture任务已经完成
cf1.complete(goodsCount);
}).start();
//经销商统计,调用ms-dealer服务
CompletableFuture
new Thread(() -> {
System.out.println("异步经销商统计---->");
Integer dealerCount = 0;
try {
AjaxResult
if (dealerRes.isSuccess()){
dealerCount = dealerRes.getObj();
}
} catch (Exception e) {
dealerCount = null;
}
// 告诉completableFuture任务已经完成
cf2.complete(dealerCount);
}).start();
//会员统计,调用ms-member服务
CompletableFuture
new Thread(() -> {
System.out.println("异步会员统计---->");
Integer memberCount = 0;
try {
AjaxResult
if (memberRes.isSuccess()){
memberCount = memberRes.getObj();
}
} catch (Exception e) {
memberCount = null;
}
// 告诉completableFuture任务已经完成
cf3.complete(memberCount);
}).start();
//防伪码统计,调用ms-code服务
CompletableFuture
new Thread(() -> {
System.out.println("异步防伪码统计---->");
SecurityCodeCountBean securityCodeCount = new SecurityCodeCountBean();
try {
AjaxResult
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
发表评论