我正在尝试理解restTemplate上可用的readTimeout,它究竟是什么?
是否在获得超时异常之前请求可以花费的总时间?
答案 0 :(得分:14)
据我所知,在restTemplate中我们有3种类型的超时
<强> ConnectionRequestTimeout 即可。这是从connectionManager
<强> ConnectionTimeout 即可。这是在源和目标之间建立连接的毫秒超时
<强> ReadTimeout 即可。这是以毫秒为单位的超时,它应该从目标端点返回响应/结果。
答案 1 :(得分:10)
您可以在RestTemplate
上定义读取超时,如下所示:
HttpComponentsClientHttpRequestFactory clientRequestFactory = new HttpComponentsClientHttpRequestFactory();
// set the read timeot, this value is in miliseconds
clientRequestFactory.setReadTimeout(500);
RestTemplate restTemplate = new RestTemplate(clientRequestFactory);
给定 X millis的readTimeout,通过该RestTemplate实例发出的任何请求所需的时间超过 X millis将导致ResourceAccessException
,包裹{ {1}}带有异常消息:&#34;读取超时&#34;。
超时实际上是由java.net.SocketTimeoutException
实例中的套接字连接器实现的,该连接由HttpClient
包裹,因此当请求首次到达该套接字时,时钟开始,并且当这些时钟中的任何一个出现时停止:请求完成或达到readTimeout。
实际上,这意味着任何花费超过配置的readTmeout的请求都将因超时异常而失败。
答案 2 :(得分:7)
您还可以定义一个bean:
@Bean
public RestTemplate restTemplateReadTimeout(RestTemplateBuilder builder) {
return builder
.setReadTimeout(15000) //15 seconds
.build();
}
并使用它:
@Autowired
@Qualifier("restTemplateReadTimeout")
private RestTemplate restTemplate;
PS ::当我在Spring Boot上使用此配置时,我尝试创建具有不同超时配置的其他RestTemplate
Bean。但是我最终看到Spring仅使用总是一个超时配置(也许使用最后一个注册的bean的超时),因为该超时配置是RestTemplates中的Singleton。因此请注意,我不知道我是否犯了某些错误,错误或预期的行为。