completablefuture的使用

news2024/11/17 22:29:28

CompletableFuture使用详解

【Java异常】Variable used in lambda expression should be final or effectively final

CompletableFuture原理与实践-外卖商家端API的异步化

项目描述

项目接口需要从下游多个接口获取数据,并且下游的网络不稳定还会涉及到循环调用下游接口,导致该接口响应异常慢。

其实调用链路如图所示

在这里插入图片描述

cf1 ~ cf5 都需要调用下游接口,导致只能按照顺序,依次调用接口。其实可以将,例如cf1,cf2 拆分成两个异步请求,没必要cf2必须等待cf1请求完成才请求。

CompletableFuture 简介

之前使用的是同步模型。在同步调用的场景下,接口耗时长、性能差,接口响应时长T > T1+T2+T3+……+Tn。

利用 CompletableFuture 之后,使用的是异步模型,并行从下游获取数据。

Completable实现了两个接口:FutureCompletionStage

  • Future:表示异步计算结果
  • CompletionStage:表示异步执行过程中的一个步骤,这个步骤可能是由另外一个 CompletionStage触发的。

随着当前步骤的完成,也可能会触发其他一系列CompletionStage的执行。从而我们可以根据实际业务对这些步骤进行多样化的编排组合,CompletionStage接口正是定义了这样的能力,我们可以通过其提供的thenAppy、thenCompose等函数式编程方法来组合编排这些步骤。

使用教程

具体使用教程可以参考这边文章CompletableFuture原理与实践-外卖商家端API的异步化,描述的十分详细和生动。

项目应用

cf1,cf2由于没有任何依赖,可是需要返回值,故设计为

CompletableFuture<List<xxxDto>> cf1 = CompletableFuture.supplyAsync(() -> {
    //业务处理
    if (CollectionUtils.isEmpty(resp.getData())) {
        //其他线程抛出异常
    }
    return resp.getData();
}).exceptionally(ex -> {
    //主线程处理其他线程抛出的异常
});

cf3,cf5由于依赖 cf1, cf2 ,所以可以通过thenApply、thenAccept、thenCompose等方法来实现

但注意,返回数据类型必须相同。

CompletableFuture<xxxDto> cf3 = cf1.thenApply(result1 -> {
  //result1为cf1的结果
  //......
  return resp.getData();
});
CompletableFuture<xxxDto> cf5 = cf2.thenApply(result2 -> {
  //result2为cf2的结果
  //......
  return resp.getData();
});

cf4,依赖cf1,cf2 ,这种二元依赖可以通过thenCombine等回调来实现

CompletableFuture<String> cf4 = cf1.thenCombine(cf2, (result1, result2) -> {
  //result1和result2分别为cf1和cf2的结果
  return "result4";
});

由于cf6依赖cf3,cf4,cf5,这种多元依赖可以通过allOfanyOf方法来实现,区别是当需要多个依赖全部完成时使用allOf,当多个依赖中的任意一个完成即可时使用anyOf

CompletableFuture<Void> cf6 = CompletableFuture.allOf(cf3, cf4, cf5);
CompletableFuture<String> 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在使用该变量的时候被修改。

设计思想

按照类似 “观察者模式” 的设计思想

异步化收益

接口响应从 TP99=3s左右,提升到2s左右

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1113152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DC电源模块的模拟电源对比数字电源的优势有哪些?

BOSHIDA DC电源模块的模拟电源对比数字电源的优势有哪些&#xff1f; DC电源模块是一种电子元件&#xff0c;用于将交流电转换为直流电&#xff0c;以供电路板、集成电路等电子设备使用。在直流电源模块中&#xff0c;有模拟电源和数字电源两种类型。 模拟电源是一种传统的电源…

如何使双核心的ESP32开启双核功能同时执行多任务

如何使双核心的ESP32开启双核功能同时执行多任务 简介查看ESP32当前哪一个内核在执行任务双核同时执行任务总结 简介 ESP32-WROOM-32模组内置两个低功耗 Xtensa 32-bit LX6 MCU&#xff0c;两个 CPU 核&#xff08;core 0与core 1&#xff09;可以被单独控制。可以在两个内核上…

PHP数据加密传输和存储问题

PHP数据加密的类型 md5()&#xff0c;sha1()&#xff0c;crypt() 双md5加密加盐

2、Kafka 生产者

3.1 生产者消息发送流程 3.1.1 发送原理 在消息发送的过程中&#xff0c;涉及到了两个线程——main 线程和 Sender 线程。在 main 线程 中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator&#xff0c; Sender 线程不断从 RecordAccumulator 中…

内衣洗衣机有危害吗?迷你洗衣机热销第一名

现在洗内衣内裤也是一件较麻烦的事情了&#xff0c;在清洗过程中还要用热水杀菌&#xff0c;还要确保洗衣液是否有冲洗干净&#xff0c;还要防止细菌的滋生等等&#xff0c;所以入手一款小型的烘洗全套的内衣洗衣机是非常有必要的&#xff0c;专门的内衣洗衣机可以最大程度减少…

vue3 + axios 中断取消接口请求

前言 最近开发过程中&#xff0c;总是遇到想把正在请求的axios接口取消&#xff0c;这种情况有很多应用场景&#xff0c;举几个例子&#xff1a; 弹窗中接口请求返回图片&#xff0c;用于前端展示&#xff0c;接口还没返回数据&#xff0c;此时关闭弹窗&#xff0c;需要中断接…

【神印王座】伊莱克斯现身,龙皓晨获得一传承,圣采儿却惨遭反噬

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 神印王座第78集的预告片更新&#xff0c;一个神秘人物伊莱克斯突然现身&#xff0c;他是一个实力强大、统兵能力卓越的统帅&#xff0c;更拥有令人闻风丧胆的亡灵大军。这个传奇人物被誉为永恒之塔的主人&…

Linux下的命令行参数和环境变量

命令行参数 什么是命令行参数 命令行参数是指在执行命令行程序时&#xff0c;给程序传递的额外参数。在Linux终端中&#xff0c;命令行参数通常通过在命令后面添加空格分隔的参数来传递。 Linux下以main函数举例说明 #include<stdio.h>int main(int argc char* argv[])…

svg常用属性及动画效果

文章目录 引言一、什么是svg二、svg有哪些应用场景三、基本使用四、svg常用属性介绍1. viewBox2. preserveAspectRatio3. symbol标签4.transform1. translate2.scale3.rotate4.skewX和skewY 5. matrix6.stroke-dasharray 五、svg动画1. svg属性结合css动画2. animate 标签动画3…

【网络】网络编程套接字(一)

网络编程套接字 一 一、网络编程中的一些基础知识1、认识端口号2、认识TCP协议和UDP协议3、网络字节序 二、socket编程1、sockaddr结构2、简单的UDP网络程序Ⅰ、服务器的创建Ⅱ、运行服务器Ⅲ、关于客户端的绑定问题Ⅳ、启动客户端Ⅴ、本地测试Ⅵ、网络测试 一、网络编程中的一…

20款VS Code实用插件推荐

前言&#xff1a; VS Code是一个轻量级但功能强大的源代码编辑器&#xff0c;轻量级指的是下载下来的VS Code其实就是一个简单的编辑器&#xff0c;强大指的是支持多种语言的环境插件拓展&#xff0c;也正是因为这种支持插件式安装环境开发让VS Code成为了开发语言工具中的霸主…

升级常有,错误不可避免!更新升级时遇到的错误0x800F081F–0x20003如何修复

Windows更新错误0x800F081F–0x20003主要发生在升级Windows 11/10副本时。这是由于在计算机上启用各种与开发人员相关的设置时出现错误造成的。安装程序遇到的错误被表述为以下任一错误: 我们无法安装Windows 11/10。SAFE_OS阶段的安装失败,INSTALL_UPDATES操作期间出现错误:…

解除OU屏蔽(EBS检查无法直接查询解决)

解除OU屏蔽(EBS检查无法直接查询解决) 具有OU屏蔽的例子 SELECT t.org_id, t.* FROM po.po_headers_all t -- 无屏蔽表&#xff0c;在PL/SQL运行有数据 SELECT t.org_id, t.* FROM apps.po_headers t -- 包含OU屏蔽&#xff0c;在PL/SQL中查询无数据多组织屏蔽原理 1. 在…

免费SSL证书与付费SSL证书的区别

SSL&#xff08;安全套接层&#xff09;证书是网站安全性的关键组成部分&#xff0c;用于保护数据的机密性和完整性。当您考虑在您的网站上部署SSL证书时&#xff0c;您将面临一个重要的决策&#xff1a;是选择免费SSL证书还是付费SSL证书&#xff1f;本文将帮助您理解这两者之…

工具篇之Axure RP 10的使用

引言 最近在学习原型图&#xff0c;针对画原型图的工具&#xff0c;反复对比墨刀、Axure、xiaopiu后&#xff0c;最终选择Axure。 接下来&#xff0c;我便从Axure RP 10的下载、安装、中文字体、授权等几个方面&#xff0c;来介绍Axure。 一、背景 Axure是一款强大的原型设计…

【XSS_MSN】基于GCN的web攻击Payload识别与可解释性分析

原文标题&#xff1a;Web Attack Payload Identification and Interpretability Analysis Based on Graph Convolutional Network 原文链接&#xff1a;https://ieeexplore.ieee.org/document/10076547/ 作者单位&#xff1a;四川大学网络安全学院 相似原理论文&#xff1…

Excel拆分单元格怎么操作?学会这4招,工作效率倍涨!

“刚刚在做一份Excel的报表&#xff0c;需要将某些单元格进行拆分&#xff0c;但是我不知道应该如何处理&#xff0c;大家在使用Excel时有什么比较简单的单元格拆分方法吗&#xff1f;” 当我们需要使用Excel处理大量数据或者创建专业报表时&#xff0c;可能需要对单元格进行拆…

【试题011】C语言多个运算符计算例题

1.题目&#xff1a;表达式1!23/45%6(78)9的值是&#xff1f; 2.代码&#xff1a; #include <stdio.h> int main() {//表达式1 !2 3 / 4 5 % 6 (7 8) 9的值printf("%d\n", (1 !2 3 / 4 5 % 6 (7 8) 9));//分析&#xff1a;多个运算符先考虑优先级…

如何用R语言优雅地玩转PubMed-RISmed包的使用

PubMed是最大的生命科学文献数据库之一&#xff0c;在开展课题使用关键词搜索时&#xff0c;会检索出大量文献。如何对这些文献进行筛选&#xff0c;出了巧妙使用关键词组合外&#xff0c;还可以使用R将相关文献信息一键提取&#xff0c;实现文献的快速浏览。RISmed是一个用于从…