HttpClient 的超时:连接阶段与请求阶段
连接对方服务器很快,不代表对方会及时返回响应。只有连接超时,不能完整约束一次请求的等待时间。
问题从哪里出现
连接对方服务器很快,不代表对方会及时返回响应。只有连接超时,不能完整约束一次请求的等待时间。
理解核心机制
HttpClient 可配置连接超时,HttpRequest 可配置请求超时。它们对应不同范围;完整业务截止时间还要包含排队、重试和解析,不能仅依赖某一个网络参数。
动手做一个小实验
Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。
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());
}
}适用边界与常见误区
示例仅构造请求,不联网。真实请求还应控制响应体大小、重试预算和目标地址权限,尤其是地址来自外部输入时。
继续练习
在可控测试服务中分别模拟连接失败、延迟响应和慢速响应体,记录各自触发的错误与实际耗时。