You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OkHttp的callTimeout计时是否包含拦截器重试消耗的时间

结论

你配置的callTimeout(5000)是包含重试环节所有耗时的总调用超时,不是仅针对单次请求。


原理说明

OkHttp的callTimeout作用域是整个Call的完整生命周期:从请求被发起(execute/enqueue)开始计时,直到最终拿到响应或者抛出异常结束,所有流程耗时都会被计入,包括:

  • 单次请求的DNS解析、建连、数据收发耗时
  • 你自定义拦截器中捕获异常后的sleep等待时间
  • 多次重试请求的累计耗时

举个实际场景:假设你设置MAX_TRY_COUNT=3、RETRY_BACKOFF_DELAY=3000,第一次请求耗时2s抛出SocketTimeoutException,随后进入sleep等待3s,此时累计耗时已经达到5s,callTimeout会直接触发超时中断,不会执行后续的第二次、第三次重试。


实现单次请求5s超时的方案

如果你希望5s超时只作用于单次请求尝试、不包含重试等待和多次请求的总耗时,不要使用callTimeout,改为分别配置单次请求的三个超时参数即可:

builder.connectTimeout(5000, TimeUnit.MILLISECONDS)
       .readTimeout(5000, TimeUnit.MILLISECONDS)
       .writeTimeout(5000, TimeUnit.MILLISECONDS)
       // 其余配置不变

这三个参数仅对每次chain.proceed(request)的单次请求生效,重试之间的等待时间、多次请求的累计耗时都不会被计入超时统计。


内容的提问来源于stack exchange,提问作者chrisrhyno2003

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:39:00