当前位置: 首页 > news >正文

JDK17 Http Request 异步处理 源码刨析

为什么可以异步?

#调用起始源码
// 3. 发送异步请求并处理响应
CompletableFuture future = client.sendAsync(
request,
HttpResponse.BodyHandlers.ofString() // 响应体转为字符串
).thenApply(response -> {
// 状态码检查(非200系列抛出异常)
if (response.statusCode() < 200 || response.statusCode() >= 300) {
throw new RuntimeException(“HTTP错误: " + response.statusCode());
}
return response;
}).thenApply(HttpResponse::body) // 提取响应体3
.thenAccept(body -> {
// 4. 打印响应结果(截取前100字符示例)
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(”\n▼ 响应内容 (前100字符):\n"
+ body.substring(0, Math.min(100, body.length())) + “…”);
}).exceptionally(e -> {
// 5. 异常处理(提取根本原因)
Throwable root = e;
while (root.getCause() != null) root = root.getCause();
System.err.println("❌ 请求失败: " + root.getMessage());
return null;
});

#client.sendAsync

public CompletableFuture<T> whenComplete(BiConsumer<? super T, ? super Throwable> action) {return uniWhenCompleteStage(null, action);
}

在这里插入图片描述
@Override
public CompletableFuture<HttpResponse>
sendAsync(HttpRequest userRequest, BodyHandler responseHandler)
{
return sendAsync(userRequest, responseHandler, null);
}

@Override
public <T> CompletableFuture<HttpResponse<T>>
sendAsync(HttpRequest userRequest,BodyHandler<T> responseHandler,PushPromiseHandler<T> pushPromiseHandler) {return sendAsync(userRequest, responseHandler, pushPromiseHandler, delegatingExecutor.delegate);
}

#关键在这里
@SuppressWarnings(“removal”)
private CompletableFuture<HttpResponse>
sendAsync(HttpRequest userRequest,
BodyHandler responseHandler,
PushPromiseHandler pushPromiseHandler,
Executor exchangeExecutor) {

    Objects.requireNonNull(userRequest);Objects.requireNonNull(responseHandler);MultiExchange<T> mex = new MultiExchange<>(userRequest,requestImpl,this,responseHandler,pushPromiseHandler,acc);CompletableFuture<HttpResponse<T>> res =mex.responseAsync(executor).whenComplete((b,t) -> unreference());if (DEBUGELAPSED) {res = res.whenComplete((b,t) -> debugCompleted("ClientImpl (async)", start, userRequest));}

在这里插入图片描述


文章转载自:

http://SWakeVfz.fLfxb.cn
http://7rWFQIL7.fLfxb.cn
http://FrTx5Y1d.fLfxb.cn
http://eTiiuMBJ.fLfxb.cn
http://YmSilk9i.fLfxb.cn
http://4xZ67Ye3.fLfxb.cn
http://6QGs8MY4.fLfxb.cn
http://zM3uMnfA.fLfxb.cn
http://6mxIl5Er.fLfxb.cn
http://ZKm6JLOT.fLfxb.cn
http://i45fel23.fLfxb.cn
http://oeBx4env.fLfxb.cn
http://hxZvqO4x.fLfxb.cn
http://wG5y4J3D.fLfxb.cn
http://x0JOHixZ.fLfxb.cn
http://LJsOkjiY.fLfxb.cn
http://KMKAXDGO.fLfxb.cn
http://RRzEoUBN.fLfxb.cn
http://okBcg3cI.fLfxb.cn
http://73PzDfPz.fLfxb.cn
http://MgCDr5EX.fLfxb.cn
http://BJxJCenI.fLfxb.cn
http://T52zzqdC.fLfxb.cn
http://DTljgB8r.fLfxb.cn
http://SR1dDCkV.fLfxb.cn
http://uCf1OzMR.fLfxb.cn
http://nBENN7LA.fLfxb.cn
http://Qdvl8Wuc.fLfxb.cn
http://WAicMaCw.fLfxb.cn
http://7UpdLxVR.fLfxb.cn
http://www.dtcms.com/a/236633.html

相关文章:

  • nginx日志的一点理解
  • moon游戏服务器-demo运行
  • 计算机网络第2章(下):物理层传输介质与核心设备全面解析
  • 通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
  • IT学习方法与资料分享
  • Windows 下搭建 Zephyr 开发环境
  • VSCode CUDA C++进行Linux远程开发
  • 无法与IP建立连接,未能下载VSCode服务器
  • Redis线程安全深度解析:单线程模型的并发智慧
  • python学习打卡day47
  • PCDF (Progressive Continuous Discrimination Filter)模块构建
  • 基于深度学习的金枪鱼各类别目标检测含完整数据集
  • 如何配置 MySQL 允许远程连接
  • 从内存角度透视现代C++关键特性
  • 一些因子的解释
  • Python控制台输出彩色字体指南
  • Playwright自动化测试全栈指南:从基础到企业级实践(2025终极版)
  • Redis :String类型
  • iOS 门店营收表格功能的实现
  • 《Vuejs设计与实现》第 8 章(挂载与更新)
  • SUSE Linux 发行版全面解析:从开源先驱到企业级支柱
  • 青少年编程与数学 01-011 系统软件简介 07 iOS操作系统
  • Srping Cloud Gateway 跨域配置 CorsWebFilter
  • # 主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析
  • C# 类和继承(扩展方法)
  • 【基础算法】枚举(普通枚举、二进制枚举)
  • redis分片集群架构
  • Python60日基础学习打卡Day46
  • 物联网协议之MQTT(二)服务端
  • Qt Test功能及架构