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,均未解决问题。现咨询两个问题:
- 这个3分钟超时设置来自何处?
- 如何延长超时避免应用报错?
服务器环境为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
相关产品推荐
相关产品推荐

