Spring RestTemplate не будет использовать настройки тайм-аута - PullRequest
0 голосов
/ 10 января 2019

Возникла проблема с пониманием того, как 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());
}

Я проверил это, когда служба перестала звонить. Вместо ожидаемого значения 50000 метод возвращается через 3 секунды. Неважно, какое значение я настраиваю в te RestTemplate, оно всегда возвращается через 3 секунды.

У кого-нибудь есть идея?

1 Ответ

0 голосов
/ 10 января 2019

Вы можете напрямую использовать RestTemplateBuilder builder для создания своего отдыха. Экземпляр шаблона: как показано ниже

@Bean
public RestTemplate rest(final RestTemplateBuilder builder) {
    return builder
             .setConnectTimeout(50000)
             .setReadTimeout(50000)
             .build()
}

И попробуйте установить конфигурацию для Hysterix в application.properties

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

или просто в вашей команде напрямую (@HystrixProperty)

@HystrixCommand(
  commandProperties = { 
    @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"), 
    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "50000")  
}, fallbackMethod = "fallbackActivityCall")
public Optional<ResponseActivityValue> callForActivity() {
 ....
} 
...