异步编排
最近在做公司的会议模块的时候为了性能和用户体验上达到一个可观的效果,在项目中用到了异步编排技术,以此文章作为记录写一篇记录性文章。
背景:
在一次会议请求中要获取如下
1获取本月会议统计
2获取会议列表
3获取当前用户会议待办
4获取当前用户所在部门会议库
5获取当前用户所在部门的议题库
分析:分析发现 以上的每一步都不依赖于其它步骤,如按照传统 串行化开发 (假设:每一个查询需要一秒)那么执行完所有查询至少需要5秒。这样的响应时间是不可以被用户所接受的。
解决思路:因为每一部都不互相依赖 所以直接用异步编排即可
实现过程:
1.用Future和java 8的CompletableFuture
此类的具体要用可自行搜索
一丶
首先定义一个线程池,改线程池用于执行每一个任务(我习惯用Spring的线程工具)
//配置线程池
@Bean(value = "taskThreadPool")
public ThreadPoolTaskExecutor getThreadPoolTaskExecutor()
{
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(5);
return threadPoolTaskExecutor;
}
二,
使用CompletableFuture编排任务(将获取到的数据全部整合 返回)
@RequestMapping({"mainJson"})
@ResponseBody
public JSONObject mainJson(HttpServletRequest request, HttpServletResponse reponse) throws ExecutionException, InterruptedException {
//存放结果
JSONObject result = new JSONObject();
//启用异步编排
//1获取本月会议统计
CompletableFuture future1 = CompletableFuture.supplyAsync(()->{
//获取本月会议统计业务代码
},taskExecutor);
//2获取会议列表
CompletableFuture future2 = CompletableFuture.supplyAsync(()->{
//获取会议列表业务代码
},taskExecutor);
//3获取当前用户会议待办
CompletableFuture future3 = CompletableFuture.supplyAsync(()->{
//获取当前用户会议待办代码
},taskExecutor);
//4获取当前用户所在部门会议库
CompletableFuture future4 = CompletableFuture.supplyAsync(()->{
//获取当前用户所在部门会议库代码
},taskExecutor);
//5获取当前用户所在部门的议题库
CompletableFuture future5 = CompletableFuture.supplyAsync(()->{
//获取当前用户所在部门的议题库代码
},taskExecutor);
//结果整合
result.put("summaryInfo",future1.get());
result.put("meetToDoList", future2.get());
result.put("meetTaskList", future3.get());
result.put("meetInfoList", future4.get());
result.put("issueLibraryList", future5.get());
return result;
}
类似于上面这样就可以异步的完成所有数据 提高运行效率。