WMX · 随记
·Java· 3 分钟阅读

HttpClient 的超时:连接阶段与请求阶段

连接对方服务器很快,不代表对方会及时返回响应。只有连接超时,不能完整约束一次请求的等待时间。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

连接对方服务器很快,不代表对方会及时返回响应。只有连接超时,不能完整约束一次请求的等待时间。

理解核心机制

HttpClient 可配置连接超时,HttpRequest 可配置请求超时。它们对应不同范围;完整业务截止时间还要包含排队、重试和解析,不能仅依赖某一个网络参数。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java13 行 · 可横向滚动
import java.net.URI;
import java.net.http.*;
import java.time.Duration;
public class Demo {
    public static void main(String[] args) {
        var client = HttpClient.newBuilder()
            .connectTimeout(Duration.ofSeconds(3)).build();
        var request = HttpRequest.newBuilder(URI.create("https://example.com/"))
            .timeout(Duration.ofSeconds(5)).GET().build();
        System.out.println(request.timeout().orElseThrow());
        System.out.println(client.connectTimeout().orElseThrow());
    }
}

适用边界与常见误区

示例仅构造请求,不联网。真实请求还应控制响应体大小、重试预算和目标地址权限,尤其是地址来自外部输入时。

继续练习

在可控测试服务中分别模拟连接失败、延迟响应和慢速响应体,记录各自触发的错误与实际耗时。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档