[英]Default httpclient for resttemplate, have absolute value for read timeout
[英]RestTemplate — default timeout value
使用Spring的RestTemplate
时,默认超时值是RestTemplate
?
例如,我正在调用这样的Web服务:
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);
RestTemplate
是否有内置的超时值? 我不打算更改超时值,但是,我想确保每个请求都有合理的超时。
我认为您可以使用SimpleClientHttpRequestFactory作为超时参数。 可以通过构造函数或setter方法将SimpleClientHttpRequestFactory的实例设置为rest模板。
默认情况下,RestTemplate使用SimpleClientHttpRequestFactory,因此您可以直接将值设置为restTemplate。
明确回答这个问题......
默认超时是无限的。
默认情况下,RestTemplate使用SimpleClientHttpRequestFactory,然后使用HttpURLConnection。
默认情况下,HttpURLConnection的超时为0 - 即无限,除非它已由这些属性设置:
-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec
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);
}
}
}
您可以在RestTemplate构造函数中使用ClientHttpRequestFactory param:
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.