有没有专做烘焙的网站,有网络网站打不开,玉林网站优化,福田公司是国企还是私企CompletableFuture使用详解
【Java异常】Variable used in lambda expression should be final or effectively final
CompletableFuture原理与实践-外卖商家端API的异步化 项目描述
项目接口需要从下游多个接口获取数据#xff0c;并且下游的网络不稳定还会涉及到循环调用…CompletableFuture使用详解
【Java异常】Variable used in lambda expression should be final or effectively final
CompletableFuture原理与实践-外卖商家端API的异步化 项目描述
项目接口需要从下游多个接口获取数据并且下游的网络不稳定还会涉及到循环调用下游接口导致该接口响应异常慢。
其实调用链路如图所示 cf1 ~ cf5 都需要调用下游接口导致只能按照顺序依次调用接口。其实可以将例如cf1cf2 拆分成两个异步请求没必要cf2必须等待cf1请求完成才请求。
CompletableFuture 简介
之前使用的是同步模型。在同步调用的场景下接口耗时长、性能差接口响应时长T T1T2T3……Tn。
利用 CompletableFuture 之后使用的是异步模型并行从下游获取数据。
Completable实现了两个接口Future 和 CompletionStage。
Future表示异步计算结果CompletionStage表示异步执行过程中的一个步骤这个步骤可能是由另外一个 CompletionStage触发的。
随着当前步骤的完成也可能会触发其他一系列CompletionStage的执行。从而我们可以根据实际业务对这些步骤进行多样化的编排组合CompletionStage接口正是定义了这样的能力我们可以通过其提供的thenAppy、thenCompose等函数式编程方法来组合编排这些步骤。
使用教程
具体使用教程可以参考这边文章CompletableFuture原理与实践-外卖商家端API的异步化描述的十分详细和生动。
项目应用
cf1cf2由于没有任何依赖可是需要返回值故设计为
CompletableFutureListxxxDto cf1 CompletableFuture.supplyAsync(() - {//业务处理if (CollectionUtils.isEmpty(resp.getData())) {//其他线程抛出异常}return resp.getData();
}).exceptionally(ex - {//主线程处理其他线程抛出的异常
});cf3cf5由于依赖 cf1, cf2 所以可以通过thenApply、thenAccept、thenCompose等方法来实现
但注意返回数据类型必须相同。
CompletableFuturexxxDto cf3 cf1.thenApply(result1 - {//result1为cf1的结果//......return resp.getData();
});
CompletableFuturexxxDto cf5 cf2.thenApply(result2 - {//result2为cf2的结果//......return resp.getData();
});cf4依赖cf1cf2 这种二元依赖可以通过thenCombine等回调来实现
CompletableFutureString cf4 cf1.thenCombine(cf2, (result1, result2) - {//result1和result2分别为cf1和cf2的结果return result4;
});由于cf6依赖cf3cf4cf5这种多元依赖可以通过allOf或anyOf方法来实现区别是当需要多个依赖全部完成时使用allOf当多个依赖中的任意一个完成即可时使用anyOf
CompletableFutureVoid cf6 CompletableFuture.allOf(cf3, cf4, cf5);
CompletableFutureString result cf6.thenApply(v - {//这里的join并不会阻塞因为传给thenApply的函数是在CF3、CF4、CF5全部完成时才会执行 。result3 cf3.join();result4 cf4.join();result5 cf5.join();//根据result3、result4、result5组装最终result;return result;
});需注意如果cfx里用到方法的局部变量需要设置为final避免completablefuture在使用该变量的时候被修改。
设计思想
按照类似 “观察者模式” 的设计思想
异步化收益
接口响应从 TP993s左右提升到2s左右