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

相关文章:

  • day 47
  • 快速上手 Metabase:从安装到高级功能实战
  • 游戏常用运行库合集 | GRLPackage 游戏运行库!
  • 自动驾驶---SD图导航的规划策略
  • 微信小程序带参分享、链接功能
  • 信息最大化(Information Maximization)
  • MySQL复杂SQL(多表联查/子查询)详细讲解
  • SQL-labs通关(level1-22)
  • 2025年—Comfyui聚合插件:Comfyui-LayerStyle 超多实用功能 | 附各功能模型
  • 深入剖析 RocketMQ 中的 DefaultMQPushConsumerImpl:消息推送消费的核心实现
  • UDP 与 TCP 调用接口的差异:面试高频问题解析与实战总结
  • 【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
  • Java IO流完全指南:从基础到进阶的全面解析
  • Linux下的fuser用法简析
  • AI整合SEO关键词智能策略
  • MySQL:分区的基本使用
  • 基于算法竞赛的c++编程(21)cin,scanf性能差距和优化
  • 王劲松《人民日报》撰文 重读抗战家书不忘来时路
  • 用电脑通过USB总线连接控制keysight示波器
  • 第22讲、Odoo18 QWeb 模板引擎详解
  • 亚川科技IBMS集成管理平台:构建商业综合体智慧中枢
  • 纳米AI搜索与百度AI搜、豆包的核心差异解析
  • Parameter ‘XXX‘ not found. Available parameters are [list, param1]
  • 手写Promise.all
  • 图卷积网络:从理论到实践
  • JavaScript篇:字母侦探:如何快速统计字符串里谁才是‘主角‘?
  • STM32标准库-输入捕获
  • Faiss vs Milvus 深度对比:向量数据库技术选型指南
  • 《高等数学》(同济大学·第7版)第二章第五节“函数微分“
  • 18-Oracle 23ai JSON二元性颠覆传统