Spring RestTemplate不会使用超时设置

时间:2019-01-10 09:29:37

标签: java spring spring-boot resttemplate hystrix

在理解RestTemplate如何处理超时方面存在问题。

我将RestTemplate配置为Bean,如下所示:

@Bean
public RestTemplate rest(final RestTemplateBuilder builder) {
    final RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());
    return restTemplate;
}

private ClientHttpRequestFactory getClientHttpRequestFactory() {
    final int timeout = 50000;
    final RequestConfig config = RequestConfig.custom().setConnectTimeout(timeout).setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build();
    final CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
    return new HttpComponentsClientHttpRequestFactory(client);
}

50000只是一个学术价值。

我在RestTemplate包装的服务连接器中使用Hystrix

@HystrixCommand(commandProperties = { @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE") }, fallbackMethod = "fallbackActivityCall")
public Optional<ResponseActivityValue> callForActivity() {
    final StringBuilder urlBuilder = new StringBuilder(accessConfig.getTracking().getUrl());
    final HttpEntity<String> entity = new HttpEntity<>(buildAuthHeader());

    final ResponseEntity<ResponseActivityValue> re = restTemplate.exchange(urlBuilder.toString(), HttpMethod.GET, entity, ResponseActivityValue.class);
    final HttpStatus code = re.getStatusCode();
    return Optional.ofNullable(re.getBody());
}

我使用停止通话的服务对其进行了测试。该方法将在3秒后返回,而不是预期的50000。我在te RestTemplate中配置哪个值都没有关系,它总是在3秒后返回。

有人有主意吗?

1 个答案:

答案 0 :(得分:1)

您可以直接使用RestTemplateBuilder构建器来构建您的Rest Template实例:如下

.h

并尝试在const

中设置hysterix的配置。
@Bean
public RestTemplate rest(final RestTemplateBuilder builder) {
    return builder
             .setConnectTimeout(50000)
             .setReadTimeout(50000)
             .build()
}

或直接在命令中(application.properties

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=50000