38

使用 Spring 时的默认超时值是RestTemplate多少?

例如,我正在调用这样的 Web 服务:

RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);

是否有任何内置超时值RestTemplate?我不打算更改超时值,但是,我想确保每个请求都有合理的超时。

4

4 回答 4

26

要明确回答问题...

默认超时是无限的。

默认情况下,RestTemplate 使用 SimpleClientHttpRequestFactory,而后者又使用 HttpURLConnection。

默认情况下,HttpURLConnection 的超时为 0 - 即无限,除非它已由以下属性设置:

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 
于 2016-05-12T01:38:52.517 回答
21

我认为您可以使用 SimpleClientHttpRequestFactory 作为超时参数。SimpleClientHttpRequestFactory 的实例可以通过构造函数或 setter 方法设置为 rest 模板。

默认情况下,RestTemplate 使用 SimpleClientHttpRequestFactory,因此您可以直接将值设置为 restTemplate。

于 2012-07-18T09:14:20.777 回答
12

spring-android RestTemplate 的一个不错的功能是根据操作系统的版本使用适当的(由 Google 推荐)实现 RequestFactory。

Google 建议在 Gingerbread(2.3 版)和更新版本上使用 J2SE 工具,而之前的版本应该使用 HttpComponents HttpClient。根据此建议,RestTemplate 会检查您的应用运行的 Android 版本并使用适当的 ClientHttpRequestFactory。

所以前面的答案并不完整,因为没有考虑到 HttpComponentsClientHttpRequestFactory(spring-android 用于 Android OS 版本 < 2.3)。

我的解决方案是这样的:

public class MyRestTemplate extends RestTemplate {
    public MyRestTemplate() {
        if (getRequestFactory() instanceof SimpleClientHttpRequestFactory) {
            Log.d("HTTP", "HttpUrlConnection is used");
            ((SimpleClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000);
            ((SimpleClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000);
        } else if (getRequestFactory() instanceof HttpComponentsClientHttpRequestFactory) {
            Log.d("HTTP", "HttpClient is used");
            ((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000);
            ((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000);
        }
    }
}
于 2013-01-14T14:49:50.633 回答
6

您可以在 RestTemplate 构造函数中使用 ClientHttpRequestFactory 参数:

private final int HTTP_CONNECT_TIMEOUT = 15000;
private final int HTTP_READ_TIMEOUT = 10000;

private ClientHttpRequestFactory getClientHttpRequestFactory() {
    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
    clientHttpRequestFactory.setConnectTimeout(HTTP_CONNECT_TIMEOUT);
    clientHttpRequestFactory.setReadTimeout(HTTP_READ_TIMEOUT);
    return clientHttpRequestFactory;
}

当你需要一个新的 RestTemplate 时,像这个例子一样创建它:

RestTemplate rt = new RestTemplate(getClientHttpRequestFactory());
于 2019-04-29T11:02:53.523 回答