Я хотел бы установить тайм-ауты подключения для службы отдыха, используемой моим веб-приложением. Я использую Spring RestTemplate, чтобы общаться со своим сервисом. Я провел некоторое исследование, и я нашел и использовал xml ниже (в моем приложении xml), который, как мне кажется, предназначен для установки тайм-аута. Я использую Spring 3.0.
Я также видел ту же проблему здесь Конфигурация тайм-аута для веб-служб Spring с RestTemplate, но решения не кажутся такими чистыми , я бы предпочел установить значения тайм-аута через конфигурацию Spring
<bean id="RestOperations" class="org.springframework.web.client.RestTemplate">
<constructor-arg>
<bean class="org.springframework.http.client.CommonsClientHttpRequestFactory">
<property name="readTimeout" value="${restURL.connectionTimeout}" />
</bean>
</constructor-arg>
</bean>
Кажется, что бы я ни установил readTimeout, я получаю следующее:
Сетевой кабель отключен: ожидает около 20 секунд и сообщает следующее исключение:
org.springframework.web.client.ResourceAccessException: Ошибка ввода-вывода: нет маршрута к хосту: подключиться; вложенное исключение - java.net.NoRouteToHostException: нет маршрута к хосту: подключиться
Неверный URL-адрес, поэтому служба отдыха возвращает 404: ожидает около 10 секунд и сообщает следующее исключение:
org.springframework.web.client.HttpClientErrorException: 404 не найдено
Мои требования требуют более коротких таймаутов, поэтому мне нужно иметь возможность их изменить. Есть идеи относительно того, что я делаю неправильно?
Большое спасибо.
источник
new
Spring Boot
connectionRequestTimeout
атрибут недоступен до 4.1.4. РЕЛИЗНаконец-то я заработал.
Я думаю, что тот факт, что в нашем проекте были две разные версии jar-файла commons-httpclient, не помог. Разобравшись с этим, я обнаружил, что вы можете делать две вещи ...
В коде вы можете указать следующее:
При первом вызове этого кода он устанавливает тайм-аут для
HttpComponentsClientHttpRequestFactory
класса, используемогоRestTemplate
. Следовательно, все последующие вызовы, сделанныеRestTemplate
будут использовать настройки тайм-аута, определенные выше.Или лучший вариант - сделать это:
Где я использую
RestOperations
интерфейс в своем коде и получаю значения тайм-аута из файла свойств.источник
java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
Этот вопрос является первой ссылкой для поиска Spring Boot, поэтому было бы здорово разместить здесь решение, рекомендованное в официальной документации . Spring Boot имеет собственный удобный bean-компонент RestTemplateBuilder :
Ручное создание экземпляров RestTemplate - потенциально проблемный подход, поскольку другие автоматически настраиваемые компоненты не внедряются в экземпляры, созданные вручную.
источник
setConnectTimeout
и некоторые реализацииsetReadTimeout
устарелиВот мои 2 цента. Ничего нового, кроме некоторых пояснений, улучшений и нового кода.
По умолчанию
RestTemplate
имеет бесконечное время ожидания. Существует два вида тайм-аутов: тайм-аут соединения и тайм-аут чтения. Например, я мог подключиться к серверу, но не мог читать данные. Приложение зависало, и вы не понимаете, что происходит.Я собираюсь использовать аннотации, которые в наши дни предпочтительнее XML.
Здесь мы используем
SimpleClientHttpRequestFactory
для установки соединения и считывания таймаутов. Затем он передается конструкторуRestTemplate
.Во втором решении мы используем расширение
RestTemplateBuilder
. Также обратите внимание на параметры двух методов: они принимаютDuration
. Перегруженные методы, которые занимают миллисекунды, теперь не рекомендуются.Редактировать Протестировано с помощью Spring Boot 2.1.0 и Java 11.
источник
Вот действительно простой способ установить тайм-аут:
источник
У меня был аналогичный сценарий, но также требовалось установить прокси. Самый простой способ, который я мог сделать для этого, - это расширить,
SimpleClientHttpRequestFactory
чтобы упростить настройку прокси (разные прокси для непродовольственных и прокси-серверов). Это все равно должно работать, даже если вам не нужен прокси. Затем в моем расширенном классе я переопределяюopenConnection(URL url, Proxy proxy)
метод, используя то же, что и исходный , но просто устанавливаю таймауты перед возвратом.источник
Чтобы расширить ответ benscabbia :
источник
Переопределить тайм-аут с помощью SimpleClientHttpRequestFactory
HTTPClient предоставляет другие полезные функции, такие как пул соединений, управление незанятыми соединениями и т. Д.
Подробнее: Пример конфигурации Spring RestTemplate + HttpClient
Переопределить тайм-аут с помощью HttpComponentsClientHttpRequestFactory
ссылка: Пример конфигурации тайм-аута Spring RestTemplate
источник