使用Spring的RestTemplate
时,默认超时时间是多少?
例如,我像这样调用Web服务:
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);
RestTemplate
是否有内置的超时值?我不打算更改超时值,但我希望确保每个请求都有合理的超时时间。
使用Spring的RestTemplate
时,默认超时时间是多少?
例如,我像这样调用Web服务:
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);
RestTemplate
是否有内置的超时值?我不打算更改超时值,但我希望确保每个请求都有合理的超时时间。
明确回答问题:
默认超时时间是无限的。
RestTemplate默认使用SimpleClientHttpRequestFactory,而SimpleClientHttpRequestFactory又使用HttpURLConnection。
HttpURLConnection的默认超时时间是0——即永不超时,除非通过这些属性设置了超时时间:
-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec
我认为你可以使用SimpleClientHttpRequestFactory来设置超时参数。可以通过构造函数或setter方法将SimpleClientHttpRequestFactory的实例设置到rest模板中。
默认情况下,RestTemplate使用SimpleClientHttpRequestFactory,因此您可以直接将值设置给restTemplate。
Spring-Android RestTemplate的一个不错的特性是根据Android系统版本使用适当的(由Google推荐的)RequestFactory实现。
Google建议在Gingerbread(版本2.3)及更高版本上使用J2SE设施,而较早的版本应该使用HttpComponents HttpClient。基于此建议,RestTemplate会检查您的应用程序运行的Android版本并使用适当的ClientHttpRequestFactory。
因此,前面的答案并不完整,因为它没有考虑到HttpComponentsClientHttpRequestFactory(它被用于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);
}
}
}
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());