Spring Boot中如何为OAuth2RestTemplate添加REST API请求超时?
解决OAuth2RestTemplate请求超时不生效的问题
为啥spring.mvc.async.request-timeout没效果
spring.mvc.async.request-timeout=20000这个配置管的是Spring MVC控制器里的异步请求超时,比如控制器返回Callable或者DeferredResult时的超时,和你用OAuth2RestTemplate调用外部API的超时完全不搭边,所以这个配置根本不会起作用。
正确的配置方法
要给OAuth2RestTemplate设置请求超时,得给它配置带超时参数的ClientHttpRequestFactory。直接修改你的配置类即可:
1. 修改配置类添加超时设置
@Configuration public class ResourceConfig { // 定义一个带超时的请求工厂Bean @Bean public ClientHttpRequestFactory timeoutRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); // 连接超时:5秒(单位毫秒) factory.setConnectTimeout(5000); // 读取超时:20秒(单位毫秒) factory.setReadTimeout(20000); return factory; } @Bean @LoadBalanced @Qualifier("oauth2BalancedRestTemplate") public OAuth2RestTemplate oauth2BalancedRestTemplate(@Qualifier("oauth2RestTemplate") OAuth2RestTemplate bean, ClientHttpRequestFactory timeoutRequestFactory) { OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(bean.getResource()); // 替换为带超时的请求工厂 restTemplate.setRequestFactory(timeoutRequestFactory); return restTemplate; } @Bean @LoadBalanced @Qualifier("oauth2JWTBalancedRestTemplate") public OAuth2RestTemplate oauth2JWTBalancedRestTemplate(@Qualifier("oauth2JWTRestTemplate") OAuth2RestTemplate bean, ClientHttpRequestFactory timeoutRequestFactory) { OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(bean.getResource()); // 替换为带超时的请求工厂 restTemplate.setRequestFactory(timeoutRequestFactory); return restTemplate; } }
2. (可选)从配置文件读取超时参数
要是想把超时时间放到application.properties里统一管理,可以这么做:
先在application.properties中添加配置:
# 连接超时(毫秒) resttemplate.connect-timeout=5000 # 读取超时(毫秒) resttemplate.read-timeout=20000
再修改配置类:
@Configuration public class ResourceConfig { @Value("${resttemplate.connect-timeout}") private int connectTimeout; @Value("${resttemplate.read-timeout}") private int readTimeout; @Bean public ClientHttpRequestFactory timeoutRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(connectTimeout); factory.setReadTimeout(readTimeout); return factory; } // 后续两个RestTemplate Bean定义和之前一致,注入timeoutRequestFactory即可 }
关键说明
setConnectTimeout:控制与目标服务建立HTTP连接的超时时间,超过该时间未连接成功则抛出超时异常。setReadTimeout:控制连接建立后,等待目标服务返回响应的超时时间,超过该时间未收到响应则抛出异常。- 你的
OAuth2RestTemplate标注了@LoadBalanced,替换请求工厂后依然能正常使用负载均衡功能,不会产生冲突。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

