RestTemplate读取超时无效。

3

我有一个使用RestTemplate调用Rest服务B的Spring Boot Rest服务A。 Rest服务A的RestTemplate Bean如下所示,其中包含代码片段中的超时设置。

@Bean
RestTemplate getRestTemplate()
{
    CloseableHttpClient  closeableHttpClient = HttpClientBuilder.create().build();
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(closeableHttpClient);
    RestTemplate restTemplate = new RestTemplate(requestFactory);

    requestFactory.setConnectTimeout( 2000 );
    requestFactory.setReadTimeout( 2000 );

    return restTemplate;
}

A 如下调用 B:

try{
    restTemplate.postForEntity(urlSvcB, httpEntity, myObject.class);
}
catch (Exception ex){
  .....some code here.....
}

当我将A和B都设置为调试模式,并在B中等待超过2秒的断点时,我期望A中的restTemplate调用检测到2秒的超时并立即进入异常块,但实际上并没有。我还在B中加入了thread.sleep(5000),但仍然无功而返。
请问我有做错什么导致我没有看到预期结果吗?

2
嗨,你知道这是什么原因吗?我也遇到了同样的问题。 - Kyle
1个回答

1
如果您正在使用Spring Boot,则可以尝试以下方法:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) 
{
    return restTemplateBuilder
       .setConnectTimeout(...)
       .setReadTimeout(...)
       .build();
}

如果这样不行的话,在你目前的代码中,试着在创建restTemplate之前把所有的属性都设置到requestFactory上,或者尝试一下去掉CloseableHTTPClient。
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectionRequestTimeout(...);
httpRequestFactory.setConnectTimeout(...);
httpRequestFactory.setReadTimeout(...);
return new RestTemplate(httpRequestFactory);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接