RestTemplate - 默认超时值

时间:2012-07-18 08:50:12

标签: java web-services spring http rest

使用Spring RestTemplate时的默认超时值是什么?

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

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

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

4 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:12)

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

  

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

所以之前的答案并不完整,因为没有考虑HttpComponentsClientHttpRequestFactory(由spring-android用于Android操作系统版本< 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);
        }
    }
}

答案 2 :(得分:12)

明确回答问题......

默认超时是无限的。

默认情况下,RestTemplate使用SimpleClientHttpRequestFactory,然后使用HttpURLConnection。

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

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 

答案 3 :(得分:0)

您可以在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());