RestTemplate - значение тайм-аута по умолчанию
Какое значение тайм-аута по умолчанию при использовании Spring RestTemplate
?
Например, я вызываю веб-сервис, как это:
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);
Есть ли встроенное значение тайм-аута для RestTemplate
? Я не планирую изменять значение тайм-аута, однако хочу обеспечить разумный тайм-аут для каждого запроса.
Ответы
Ответ 1
Я думаю, вы можете использовать SimpleClientHttpRequestFactory для параметра timeout. Экземпляр SimpleClientHttpRequestFactory может быть настроен на сохранение шаблона с помощью метода конструктора или сеттера.
По умолчанию RestTemplate использует SimpleClientHttpRequestFactory, так что вы можете напрямую установить значение restTemplate.
Ответ 2
Одной из приятных особенностей spring -android RestTemplate является использование соответствующей (рекомендуется Google) реализации RequestFactory в зависимости от версии ОС.
Google рекомендует использовать объекты J2SE на Gingerbread (версия 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);
}
}
}
Ответ 3
Чтобы явным образом ответить на вопрос...
Тайм-аут по умолчанию бесконечен.
По умолчанию RestTemplate использует SimpleClientHttpRequestFactory и, в свою очередь, использует HttpURLConnection.
По умолчанию тайм-аут для HttpURLConnection равен 0 - т.е. бесконечный, если только он не был задан этими свойствами:
-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec
Ответ 4
Вы можете использовать параметр ClientHttpRequestFactory в конструкторе RestTemplate:
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());