Spring rest模板readTimeOut

时间:2017-08-16 12:38:43

标签: spring spring-boot spring-rest

我正在尝试理解restTemplate上可用的readTimeout,它究竟是什么?

是否在获得超时异常之前请求可以花费的总时间?

3 个答案:

答案 0 :(得分:14)

据我所知,在restTemplate中我们有3种类型的超时

  1. <强> ConnectionRequestTimeout 即可。这是从connectionManager

  2. 获取连接的超时(以毫秒为单位)
  3. <强> ConnectionTimeout 即可。这是在源和目标之间建立连接的毫秒超时

  4. <强> 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。因此请注意,我不知道我是否犯了某些错误,错误或预期的行为。