【问题标题】:Spring RestTemplate wont use timeout settingsSpring RestTemplate 不会使用超时设置
【发布时间】:2019-06-05 03:20:30
【问题描述】:

在理解 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的价值只是学术价值。

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

@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。我在 teRestTemplate 中配置的值无关紧要,它总是在 3 秒后返回。

有人有想法吗?

【问题讨论】:

  • 你正在使用哪个版本的 spring
  • 我使用的是 Spring Boot 2.0.5。

标签: java spring spring-boot resttemplate hystrix


【解决方案1】:

你可以直接使用RestTemplateBuilderbuilder来构建你的rest模板实例:如下

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

并尝试在application.properties 中设置 hysterix 的配置

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() {
 ....
} 

【讨论】:

  • 使用 Builder 是我第一次尝试使用具有相同效果的超时。
  • 无法确定结果代码,触发了回退。可能是 hystrix 的原因。
  • 你可以发布你的 Hystrix 配置
  • 是在方法上方注解的那个 ´@HystrixCommand(commandProperties = { @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE") }, fallbackMethod = "fallbackActivityCall")´
  • 我不是真的 sur ,请尝试在 application.properties 中设置 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=50000 行,此外,此端点是否返回错误或所需的结果?
猜你喜欢
  • 2012-11-29
  • 2019-07-26
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 2011-07-20
  • 2012-02-27
  • 2020-12-20
相关资源
最近更新 更多