假如我有一个订单相关的统计接口,需要返回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实现业务服务的异步调用实战代码相关推荐

  1. ArcGIS Runtime SDK for Android开发之调用GP服务(异步调用)

    一.背景说明 通过调用GP服务,Android客户端也能实现专业的.复杂的GIS分析处理功能,从而增加应用的实用价值. ArcGIS Server发布的GP服务,分为同步和异步两种类型,一般执行步骤较 ...

  2. java thrift异步调用_thrift异步调用 - thrift-cob_style-tnonblockingserver - ItBoth

    [ thrift 在python中使用了 tornado和  twisted 来作为异步的webserive服务提供异步接口,自身并没有实现     twisted:         Generate ...

  3. 使用xmlhttp结合asp,实现网页的异步调用_asp实例

    通过xmlHttp和ASP的结合,我们可以轻松完成网页的异步调用. 代码如下: 1.新建Display.asp(这是前台显示页面) 注意xmlhttp.readyState的4个属性 1:LOADIN ...

  4. springboot服务调用超时_Spring Boot 异步请求和异步调用,一文搞定

    一.Spring Boot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在耗时处理完成(例如 ...

  5. 异步调用Web服务方法

    基于Ajax技术构建的门户是web 2.0这一代中最为成功的Web应用程序.而这块市场上iGoogle和Pageflakes这两大站点已经走在了时代的前列. 当你打开Pageflakes,将会看到如下 ...

  6. Ajax异步调用Web服务的例子

    我这里是看的Dflying Chen的使用ASP.NET AJAX异步调用Web Service和页面中的类方法的一系列文章写出来的例子. 请Dflying Chen别介意.例子中没有最后一篇文章的的 ...

  7. Dubbo的异步调用

    文章目录 dubbo异步调用 2.6版本中dubbo异步调用的实现 2.7版本dubbo 客户端Consumer异步调用 使用CompletableFuture签名的接口 1.调用远程服务: 2. 使 ...

  8. Java 异步调用实践

    本文要点: 为什么需要异步调用 CompletableFuture 基本使用 RPC 异步调用 HTTP 异步调用 编排 CompletableFuture 提高吞吐量 为什么异步 BIO 模型 首先 ...

  9. Spring Boot 中使用@Async实现异步调用,加速任务执行!

    欢迎关注方志朋的博客,回复"666"获面试宝典 什么是"异步调用"?"异步调用"对应的是"同步调用",同步调用指程序按照 ...

最新文章

  1. 基于内存数据库的分布式数据库架构
  2. npm教程:如何查看TypeScript版本、卸载TypeScript和安装TypeScript
  3. python导入random模块_Python内置模块之random
  4. 可优比和aag哪个好_火花塞多级和单级哪个性能更好?多就等于好?这可未必
  5. msvcrt python linux,Python msvcrt.CrtSetReportMode方法代码示例
  6. tongweb php,TongWeb服务器部署
  7. 浅析类的const成员函数,类的const对象
  8. excel宏的使用图解教程
  9. 期货基础知识 第四节 期货交易流程
  10. STM32,仿照LL库,编写FLASH的LL库(内有完成代码)(STM32F0)
  11. 喜讯 | 图扑科技再获厦门数字经济创新创业大赛一等奖
  12. Halcon 第四章『图像特征和提取』◆第3节:基于图像的纹理特征|灰度共生矩阵
  13. robotframework之解决导入httplibrary库一直标红的问题
  14. GNU Trove trove4j
  15. android createbitmap设置背景色,Android createBitmap截取实现移动的游戏背景
  16. javaweb基于SSH开发花凋坊花店在线购物系统(前台+后台) 课程设计 毕业设计
  17. HardwareNote:一坨黑色“牛屎粑粑”,软封装(COB)
  18. Java MVC 架构初学者指南
  19. 我用python一键整理杂乱的文件
  20. iPhone“点击支付”新功能上热搜:比支付宝还方便?

热门文章

  1. 面向对象的三大特征之一继承
  2. OO第二单元作业分析
  3. hdu 3371 Connect the Cities(prim算法)
  4. MongoDB副本集配置系列六:定位MongoDB慢的原因
  5. java 多线程——一个定时调度的例子
  6. serve : 无法加载文件 C:\Users\wb\AppData\Roaming\npm\serve.ps1
  7. Linux服务器部署常用命令
  8. 【Vue】—v-html指令
  9. 零基础带你学习MySQL—查询数据库(二)
  10. es6 日期字符串转日期_小数转成百分数,日期字符串互相转换,这几个SQL问题该如何解决?...