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 种类型的超时
ConnectionRequestTimeout。这是从 connectionManager
获取连接的超时时间(以毫秒为单位)
连接超时。这是在源和目标之间建立连接的超时时间
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 中的单例。所以要注意这一点,我不知道是不是我的配置错误,错误或预期行为。
我想了解 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 种类型的超时
ConnectionRequestTimeout。这是从 connectionManager
获取连接的超时时间(以毫秒为单位)
连接超时。这是在源和目标之间建立连接的超时时间
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 中的单例。所以要注意这一点,我不知道是不是我的配置错误,错误或预期行为。