异步编排

异步编排

最近在做公司的会议模块的时候为了性能和用户体验上达到一个可观的效果,在项目中用到了异步编排技术,以此文章作为记录写一篇记录性文章。

背景:

在一次会议请求中要获取如下
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;
        }

类似于上面这样就可以异步的完成所有数据 提高运行效率。

异步编排是指在复杂的处理流程中,使用一些异步处理的手段来提高效率和性能。在这种场景下,ThreadLocal可能会出现获取失败的问题。ThreadLocal主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式,而不是用来解决对象共享访问问题。每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确地访问到自己的对象。通过将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,可以在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。异步编排和ThreadLocal在处理复杂的流程时可以结合使用,通过ThreadLocal来保存和访问各个线程的对象,从而实现异步处理的目的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ThreadLocal跨线程问题](https://download.csdn.net/download/weixin_38669881/13750353)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [ThreadLocal和同步异步的解释](https://blog.csdn.net/doom20082004/article/details/53612339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [异步 多线程 线程池 异步编排 ThreadLocal的使用](https://blog.csdn.net/weixin_45552441/article/details/125605532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值