使用CompletableFuture实现业务服务的异步调用实战代码
假如我有一个订单相关的统计接口,需要返回3样数据:今日订单数、今日交易额、总交易额。
一般的我们的做法是串行调用3个函数,把调用返回的结果返回给调用者,这3次调用时串行执行的,如果每个调用耗时1秒的话,3次调用总耗时就是3秒。
这种做法效率非常低,因为3次调用之间无所谓先后顺序,所以采用并行执行效率会更好。比如使用线程池ExecutorService实现异步调用。
其实Java8提供了一个非常牛逼的CompletableFuture类,也可以实现异步化:
1 import lombok.extern.slf4j.Slf4j; 2 import org.springframework.stereotype.Service; 3 4 import java.util.concurrent.CompletableFuture; 5 import java.util.concurrent.TimeUnit; 6 7 @Slf4j 8 @Service 9 public class OrderService { 10 11 /** 12 * 今日订单数 13 * 14 * @return 15 */ 16 public CompletableFuture<String> todayOrderCount() { 17 return CompletableFuture.supplyAsync(() -> this.getTodayOrderCount()); 18 } 19 20 public CompletableFuture<String> todayTurnover() { 21 return CompletableFuture.supplyAsync(() -> this.getTodayTurnover()); 22 } 23 24 public CompletableFuture<String> totalTurnover() { 25 return CompletableFuture.supplyAsync(() -> this.getTotalTurnover()); 26 } 27 28 private String getTodayOrderCount() { 29 System.out.println(">>>>>>> 查询今日订单数:" + Thread.currentThread().getName()); 30 try { 31 TimeUnit.SECONDS.sleep(1); 32 } catch (InterruptedException e) { 33 e.printStackTrace(); 34 } 35 return "50"; 36 } 37 38 /** 39 * 今日交易额 40 * 41 * @return 42 */ 43 private String getTodayTurnover() { 44 System.out.println(">>>>>>> 查询今日交易额:" + Thread.currentThread().getName()); 45 try { 46 TimeUnit.SECONDS.sleep(1); 47 } catch (InterruptedException e) { 48 e.printStackTrace(); 49 } 50 return "200"; 51 } 52 53 /** 54 * 总交易额 55 * 56 * @return 57 */ 58 private String getTotalTurnover() { 59 System.out.println(">>>>>>> 查询总交易额:" + Thread.currentThread().getName()); 60 try { 61 TimeUnit.SECONDS.sleep(1); 62 } catch (InterruptedException e) { 63 e.printStackTrace(); 64 } 65 return "800"; 66 } 67 }
1 import com.alibaba.fastjson.JSONObject; 2 import com.example.sb.service.test.impl.OrderService; 3 import lombok.extern.slf4j.Slf4j; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.web.bind.annotation.GetMapping; 6 import org.springframework.web.bind.annotation.RequestMapping; 7 import org.springframework.web.bind.annotation.RestController; 8 9 import java.util.concurrent.CompletableFuture; 10 11 @Slf4j 12 @RestController 13 @RequestMapping("/order") 14 public class OrderController { 15 16 @Autowired 17 private OrderService orderService; 18 19 @GetMapping("/report") 20 public JSONObject report() { 21 long start = System.currentTimeMillis(); 22 JSONObject json = orderReport(); 23 System.out.println("耗时:" + (System.currentTimeMillis() - start)); 24 return json; 25 } 26 27 private JSONObject orderReport() { 28 CompletableFuture<String> todayOrderCountFuture = orderService.todayOrderCount(); 29 CompletableFuture<String> todayTurnoverFuture = orderService.todayTurnover(); 30 CompletableFuture<String> totalTurnoverFuture = orderService.totalTurnover(); 31 32 JSONObject json = new JSONObject(); 33 34 todayOrderCountFuture.whenComplete((v, t) -> { 35 json.put("todayOrderCountFuture", v); 36 }); 37 todayTurnoverFuture.whenComplete((v, t) -> { 38 json.put("todayTurnoverFuture", v); 39 }); 40 totalTurnoverFuture.whenComplete((v, t) -> { 41 json.put("totalTurnoverFuture", v); 42 }); 43 44 CompletableFuture.allOf(todayOrderCountFuture, todayTurnoverFuture, totalTurnoverFuture) 45 .thenRun(() -> System.out.println("完成!!!!")) 46 .join(); 47 return json; 48 } 49 }
浏览器访问:http://localhost:8080/order/report 执行结果截图如下:
因为每个OrderService的调用模拟都是耗时1秒,3个调用并行执行,最终耗时自然也是1秒。
转载于:https://www.cnblogs.com/jun1019/p/11521145.html
使用CompletableFuture实现业务服务的异步调用实战代码相关推荐
- ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)
一.背景说明 通过调用GP服务,Android客户端也能实现专业的.复杂的GIS分析处理功能,从而增加应用的实用价值. ArcGIS Server发布的GP服务,分为同步和异步两种类型,一般执行步骤较 ...
- java thrift异步调用_thrift异步调用 - thrift-cob_style-tnonblockingserver - ItBoth
[ thrift 在python中使用了 tornado和 twisted 来作为异步的webserive服务提供异步接口,自身并没有实现 twisted: Generate ...
- 使用xmlhttp结合asp,实现网页的异步调用_asp实例
通过xmlHttp和ASP的结合,我们可以轻松完成网页的异步调用. 代码如下: 1.新建Display.asp(这是前台显示页面) 注意xmlhttp.readyState的4个属性 1:LOADIN ...
- springboot服务调用超时_Spring Boot 异步请求和异步调用,一文搞定
一.Spring Boot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如 ...
- 异步调用Web服务方法
基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下 ...
- Ajax异步调用Web服务的例子
我这里是看的Dflying Chen的使用ASP.NET AJAX异步调用Web Service和页面中的类方法的一系列文章写出来的例子. 请Dflying Chen别介意.例子中没有最后一篇文章的的 ...
- Dubbo的异步调用
文章目录 dubbo异步调用 2.6版本中dubbo异步调用的实现 2.7版本dubbo 客户端Consumer异步调用 使用CompletableFuture签名的接口 1.调用远程服务: 2. 使 ...
- Java 异步调用实践
本文要点: 为什么需要异步调用 CompletableFuture 基本使用 RPC 异步调用 HTTP 异步调用 编排 CompletableFuture 提高吞吐量 为什么异步 BIO 模型 首先 ...
- Spring Boot 中使用@Async实现异步调用,加速任务执行!
欢迎关注方志朋的博客,回复"666"获面试宝典 什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照 ...
最新文章
- 基于内存数据库的分布式数据库架构
- npm教程:如何查看TypeScript版本、卸载TypeScript和安装TypeScript
- python导入random模块_Python内置模块之random
- 可优比和aag哪个好_火花塞多级和单级哪个性能更好?多就等于好?这可未必
- msvcrt python linux,Python msvcrt.CrtSetReportMode方法代码示例
- tongweb php,TongWeb服务器部署
- 浅析类的const成员函数,类的const对象
- excel宏的使用图解教程
- 期货基础知识 第四节 期货交易流程
- STM32,仿照LL库,编写FLASH的LL库(内有完成代码)(STM32F0)
- 喜讯 | 图扑科技再获厦门数字经济创新创业大赛一等奖
- Halcon 第四章『图像特征和提取』◆第3节:基于图像的纹理特征|灰度共生矩阵
- robotframework之解决导入httplibrary库一直标红的问题
- GNU Trove trove4j
- android createbitmap设置背景色,Android createBitmap截取实现移动的游戏背景
- javaweb基于SSH开发花凋坊花店在线购物系统(前台+后台) 课程设计 毕业设计
- HardwareNote:一坨黑色“牛屎粑粑”,软封装(COB)
- Java MVC 架构初学者指南
- 我用python一键整理杂乱的文件
- iPhone“点击支付”新功能上热搜:比支付宝还方便?
热门文章
- 面向对象的三大特征之一继承
- OO第二单元作业分析
- hdu 3371 Connect the Cities(prim算法)
- MongoDB副本集配置系列六:定位MongoDB慢的原因
- java 多线程——一个定时调度的例子
- serve : 无法加载文件 C:\Users\wb\AppData\Roaming\npm\serve.ps1
- Linux服务器部署常用命令
- 【Vue】—v-html指令
- 零基础带你学习MySQL—查询数据库(二)
- es6 日期字符串转日期_小数转成百分数,日期字符串互相转换,这几个SQL问题该如何解决?...