Spring 休息模板 readTimeOut

Spring rest template readTimeOut

我想了解 restTemplate 上可用的 readTimeout,它到底是什么?

它是在我们收到超时异常之前请求可以花费的总时间吗?

您可以在 RestTemplate 上定义读取超时,如下所示:

HttpComponentsClientHttpRequestFactory clientRequestFactory = new HttpComponentsClientHttpRequestFactory();
// set the read timeout, this value is in milliseconds
clientRequestFactory.setReadTimeout(500);

RestTemplate restTemplate = new RestTemplate(clientRequestFactory);

给定 X 毫秒的 readTimeout,通过该 RestTemplate 实例发出的任何请求花费的时间超过 X 毫秒将导致 ResourceAccessException,用异常消息包装 java.net.SocketTimeoutException:"Read timed out".

超时实际上是由 HttpClient 实例中的套接字连接器实现的,该实例由 RestTemplate 包装,因此时钟在请求首次到达该套接字时启动,并在其中任何一个到达时停止第一:请求完成或达到读取超时。

实际上这意味着任何花费比配置的 readTimeout 更长的时间的请求都将因超时异常而失败。

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

  1. ConnectionRequestTimeout。这是从 connectionManager

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

  4. ReadTimeout。这是以毫秒为单位的超时,预计 response/result 应该从目标端点返回。

你也可以定义一个bean:

@Bean
public RestTemplate restTemplateReadTimeout(RestTemplateBuilder builder) {
    return builder
            .setReadTimeout(15000) //15 seconds
            .build();
}

并使用它:

@Autowired
@Qualifier("restTemplateReadTimeout")
private RestTemplate restTemplate;

PS.: 当我在 Spring Boot 上使用此配置时,我尝试创建具有不同超时配置的不同 RestTemplate Beans。但我最终看到 Spring 使用 always 只有一个超时配置(可能使用最后一个注册的 bean 的超时),因为超时配置是 RestTemplates 中的单例。所以要注意这一点,我不知道是不是我的配置错误,错误或预期行为。