Подтвердить что ты не робот

RestTemplate - значение тайм-аута по умолчанию

Какое значение тайм-аута по умолчанию при использовании Spring RestTemplate?

Например, я вызываю веб-сервис, как это:

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

Есть ли встроенное значение тайм-аута для RestTemplate? Я не планирую изменять значение тайм-аута, однако хочу обеспечить разумный тайм-аут для каждого запроса.

4b9b3361

Ответ 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());