当前位置: 首页 > 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://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功能及架构