Spring rest模板readTimeOut

Seb*_*Seb 6 spring spring-boot spring-rest

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

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

Dha*_*ana 22

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

  1. ConnectionRequestTimeout.这是从connectionManager获取连接的毫秒超时

  2. ConnectionTimeout.这是在源和目标之间建立连接的毫秒超时

  3. ReadTimeout.这是以毫秒为单位的超时,它应该从目标端点返回响应/结果.

  • ReadTimeout 不正确,当从服务器接收两部分数据之间的时间大于超时值时发生读取超时。您建议它是响应的总时间,这是不正确的:总时间可能大于超时值 (8认同)
  • 这真的应该是选定的答案,因为它以简洁的方式从字面上回答了 OP 的问题。 (2认同)

gly*_*ing 10

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

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

RestTemplate restTemplate = new RestTemplate(clientRequestFactory);
Run Code Online (Sandbox Code Playgroud)

给定一个X millis 的readTimeout,通过该RestTemplate实例发出的任何请求所需的时间超过X millis将导致a ResourceAccessException,java.net.SocketTimeoutException包含一个异常消息:"read timed out".

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

实际上,这意味着任何花费超过配置的readTmeout的请求都将因超时异常而失败.


Dhe*_*rik 7

您还可以定义一个bean:

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

并使用它:

@Autowired
@Qualifier("restTemplateReadTimeout")
private RestTemplate restTemplate;
Run Code Online (Sandbox Code Playgroud)

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