Spring Boot 3.2.4:RestTemplate与JettyClientHttpRequestFactory空闲超时配置问题
解决方案:配置RestTemplate的Jetty客户端空闲超时
你遇到的是Jetty HTTP客户端的空闲超时问题,server.jetty.connection-idle-timeout是配置Spring Boot内嵌Jetty服务器的连接超时,和RestTemplate使用的Jetty客户端完全无关,所以这个配置不会作用于你的外部请求。
默认情况下,Jetty HttpClient的空闲超时为30秒(即报错中的30000ms),这就是请求超过30秒触发超时的原因。要解决这个问题,需要自定义Jetty HttpClient实例并设置空闲超时,再将其关联到RestTemplate的请求工厂。
步骤1:自定义Jetty HttpClient Bean
创建配置类,定义带有自定义空闲超时的Jetty HttpClient:
import org.eclipse.jetty.client.HttpClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JettyHttpClientConfig { @Bean public HttpClient jettyHttpClient() { HttpClient httpClient = new HttpClient(); // 设置空闲超时,单位为毫秒,这里与你之前的server端配置保持一致 httpClient.setIdleTimeout(800000); // 可选:按需配置其他超时参数 // 连接超时:建立TCP连接的最大等待时间 // httpClient.setConnectTimeout(10000); // 请求超时:整个请求从发送到接收响应的最大时长 // httpClient.setRequestTimeout(800000); return httpClient; } }
步骤2:配置RestTemplate使用自定义HttpClient
将上面定义的HttpClient注入到JettyClientHttpRequestFactory,再创建RestTemplate:
import org.eclipse.jetty.client.HttpClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.JettyClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(HttpClient jettyHttpClient) { JettyClientHttpRequestFactory requestFactory = new JettyClientHttpRequestFactory(jettyHttpClient); return new RestTemplate(requestFactory); } }
关键说明
- 空闲超时(Idle Timeout):指连接在没有数据传输时的最大存活时间,若请求过程中长时间无数据交互,会触发该超时。
- 若你的外部服务不仅是空闲时间长,整个请求响应周期本身就很长,建议同时配置
requestTimeout,避免整个请求因超时而失败。
内容的提问来源于stack exchange,提问作者user24583087
相关产品推荐
相关产品推荐

