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

SpringBoot3.2.1中RestTemplate调用超时问题排查与解决咨询

问题背景

我司基于SpringBoot_3.2.1/JDK17/Tomcat10开发的应用,使用RestTemplate调用执行存储过程的接口,该存储过程执行时长超3分钟,恰好3分钟时触发org.springframework.web.client.ResourceAccessException(根因为java.net.SocketTimeoutException: Read Timed out)。尝试通过JVM参数-Dsun.net.client.defaultConnectionTimeout=600000、-Dsun.net.client.defaultReadTimeout=600000,以及编程方式配置SimpleClientHttpRequestFactory设置连接和读取超时为600000ms,均未解决问题。现咨询两个问题:

  1. 这个3分钟超时设置来自何处?
  2. 如何延长超时避免应用报错?
    服务器环境为Red Hat Linux 9.4。

1. 3分钟超时的可能来源

网络中间组件超时

大部分反向代理、负载均衡器或防火墙的默认超时配置为180秒(3分钟),比如:

  • 负载均衡器(如F5、云厂商LB)的连接/读取超时
  • Nginx的proxy_read_timeout(若目标接口通过Nginx转发)
  • Linux系统层面的防火墙超时规则(如iptables相关超时参数)

目标服务端容器超时

如果调用的接口部署在Tomcat或其他Web容器上,容器本身可能设置了响应超时:

  • Tomcat的server.xml中Connector节点的keepAliveTimeout,或异步请求的asyncTimeout(若接口异步处理存储过程)
  • 服务端框架的全局超时配置(如Spring MVC的request-timeout)

RestTemplate配置未生效

  • 代码中创建了多个RestTemplate实例,实际使用的是未配置超时的默认实例
  • 使用了SimpleClientHttpRequestFactory之外的请求工厂(如Apache HttpClient、OkHttp对应的工厂),但未对这些工厂配置超时
  • JVM参数未正确生效:可通过代码System.out.println(System.getProperty("sun.net.client.defaultReadTimeout"))验证参数是否被加载

2. 延长超时的解决方法

确认并修正RestTemplate超时配置

根据使用的请求工厂,正确配置超时:

方式1:使用SimpleClientHttpRequestFactory

@Bean
public RestTemplate restTemplate() {
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    factory.setConnectTimeout(600000); // 10分钟连接超时
    factory.setReadTimeout(600000);    // 10分钟读取超时
    return new RestTemplate(factory);
}

方式2:使用RestTemplateBuilder(Spring Boot推荐)

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
            .setConnectTimeout(Duration.ofMinutes(10))
            .setReadTimeout(Duration.ofMinutes(10))
            .build();
}

方式3:若使用Apache HttpClient作为底层客户端

@Bean
public RestTemplate restTemplate() {
    HttpClient httpClient = HttpClientBuilder.create()
            .setConnectionTimeToLive(600, TimeUnit.SECONDS)
            .build();
    HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
    factory.setConnectTimeout(600000);
    factory.setReadTimeout(600000);
    return new RestTemplate(factory);
}

检查并调整网络中间组件超时

  • 若使用Nginx转发,修改nginx.conf或对应站点配置,设置proxy_read_timeout 600s;
  • 联系运维调整负载均衡器、防火墙的超时时间至大于存储过程的预期执行时长

调整目标服务端的超时配置

  • 若目标接口部署在Tomcat,修改server.xml中Connector节点的asyncTimeout(如asyncTimeout="600000"),同时检查Spring MVC的application.properties配置:
spring.mvc.async.request-timeout=600000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:37:22