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));
        }
相关推荐
XiaoMaqqqq5 小时前
市面上正规的IP驱动产业新场景新工具哪家强
运维·python·网络协议·tcp/ip
ShyanZh6 小时前
【Python3基础】19-Socket 与 TCP、UDP 编程
python·网络协议·tcp/ip·udp
三少爷的鞋7 小时前
AI 时代,我们都将成为通才型开发者:只懂 Android,已经不够了
android
DP DPharness8 小时前
StudyMate 从安装到第一节课的完整操作路径
人工智能·websocket·网络协议·智能手机·dpharness
Dovis(誓平步青云)11 小时前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
剑锋所指,所向披靡!11 小时前
HTTP服务器的基本相关概念
服务器·网络协议·http
2301_7779983412 小时前
TCP协议:滑动窗口与流量控制
服务器·网络·网络协议·tcp/ip·php
晚风叙码12 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程13 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
wangbing112514 小时前
开发指南148-WebSocket-前端查报文
网络·websocket·网络协议