← 中文资源

简体中文版本

Java SocketTimeoutException: Read timed out

诊断 Java 的 java.net.SocketTimeoutException Read timed out:测量服务端延迟、检查超时设置,并修复连接池或 keep-alive 复用问题。

阅读英文原文

症状

连接成功后,调用报 java.net.SocketTimeoutException: Read timed out。失败集中在空闲之后或高峰负载时,而重试往往成功。

诊断

测量服务端延迟并检查连接池行为:

conn.setConnectTimeout(2000);
conn.setReadTimeout(5000); // too low for a slow endpoint?

只在空闲之后出现超时,通常强烈指向连接池中的陈旧连接。

修复

调整超时并校验池中连接:

RequestConfig cfg = RequestConfig.custom()
    .setConnectTimeout(2000)
    .setSocketTimeout(15000)
    .setConnectionRequestTimeout(2000)
    .build();

在服务端或代理关闭空闲连接之前主动淘汰,并对幂等调用重试。

验证

重跑负载与空闲两类场景;请求能在超时内完成,间歇性读超时消失。