症状
连接成功后,调用报 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();
在服务端或代理关闭空闲连接之前主动淘汰,并对幂等调用重试。
验证
重跑负载与空闲两类场景;请求能在超时内完成,间歇性读超时消失。