当前位置: 首页 > 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.xdnf.cn/news/919405.html

相关文章:

  • 2012-2023年 上市公司-知识重组创造、知识重组再利用数据-社科经管实证数据
  • MVCC多版本并发控制
  • 81 实战一:给root目录扩容
  • SDC命令详解:使用set_port_fanout_number命令进行约束
  • robot_lab train的整体逻辑
  • 判断一个或者多个软件是否安装,如果没有则自动安装
  • 使用 Ansible 在 Windows 服务器上安装 SSL 证书系列之二
  • 无法与IP建立连接,未能下载VSCode服务器
  • 前端高频面试题2:浏览器/计算机网络
  • 零基础在实践中学习网络安全-皮卡丘靶场(第十三期-php反序列化)
  • 【读论文】U-Net: Convolutional Networks for Biomedical Image Segmentation 卷积神经网络
  • 如何在Unity中实现点击一个按钮跳转到哔哩哔哩
  • 大模型在创伤性脑出血全周期预测与诊疗方案中的应用研究
  • python打卡day47
  • spring:继承接口FactoryBean获取bean实例
  • Vue速查手册
  • Unity | AmplifyShaderEditor插件基础(第五集:简易膨胀shader)
  • GOOUUU ESP32-S3-CAM 果云科技开发板开发指南(一)(超详细!)Vscode+espidf 通过摄像头拍摄照片并存取到SD卡中,文末附源码
  • SMC自修改代码一
  • JUC 串讲
  • redis分片集群架构
  • 部门档案在不同系统中的差异及整合思路
  • 【自然语言处理】大模型时代的数据标注(主动学习)
  • PostgreSQL 的扩展pageinspect
  • 【Java学习笔记】Math方法
  • Xilinx IP 解析之 Block Memory Generator v8.4 ——02-如何配置 IP(仅 Native 接口)
  • oracle 11g ADG备库报错ORA-00449 lgwr unexpectedly分析处理
  • AGV|无人叉车工业语音播报器|预警提示器LBE-LEX系列性能与接线说明
  • Python从Excel读取数据并生成图表的方法详解
  • Docker构建Vite项目内存溢出:从Heap Limit报错到完美解决的剖析