В этой статье мы попытаемся объяснить, почему важно определять тайм-ауты для исходящих тестовых вызовов.
Перед настройкой любого тайм-аута давайте рассмотрим ниже некоторые распространенные исключения для исходящих вызовов http,
Время ожидания соединения
максимальное время ожидания ответа другой стороны “да, я здесь, давайте поговорим” при создании нового соединения (время ожидания подключения в конечном итоге вызывает socket.connect (адрес, время ожидания), если соединение не установлено в течение времени ожидания подключения, указанного вами или используемой вами библиотекой, вы получите сообщение об ошибке “время ожидания подключения
Тайм-аут сокета
Является ли тайм-аут для ожидания данных или, другими словами, максимальный период бездействия между двумя последовательными пакетами данных
Тайм-аут чтения
Тайм-аут чтения может произойти, когда между клиентом и сервером установлено успешное соединение, а пакеты данных неактивны в ожидании ответа сервера.
Тайм-аут записи
Подобно тайм-ауту чтения, тайм-аут записи может произойти, когда между клиентом и сервером установлено успешное соединение, и при отправке запроса на сервер пакеты данных неактивны.
Важная тема, которую следует помнить здесь, заключается в том, что в зависимости от выбора библиотеки, которую мы используем для исходящих вызовов, очень важно, чтобы мы настроили свойства для обработки вышеупомянутых и корректно обработали исключение.
Верблюд-апач
Если мы используем компонент Apache Camel “http” для выполнения исходящих вызовов, мы можем настроить эти свойства следующими способами, пожалуйста, обратите внимание, что если мы не определяем эти свойства, значения по умолчанию равны -1! означает, что соединение никогда не будет прерываться и может отрицательно сказаться на производительности приложения в целом.
неблагоприятный
http.urlProxy = http4://ThirdPartyServers?throwExceptionOnFailure=false&httpClient.socketTimeout=${rest.timeout.millis}&httpClient.connectTimeout=${rest.timeout.millis}
Класс Построителя маршрутов
@Override
public void configure() throws Exception {
configureTimeout();
}
private void configureTimeout() {
HttpComponent httpComponent = getContext().getComponent("http4", HttpComponent.class);
httpComponent.setConnectionTimeToLive(VALUE_IN_MILI);// for closing the idle connection - in milliseconds
httpComponent.setSocketTimeout(VALUE_IN_MILI); //socket timeout - in milliseconds
httpComponent.setConnectTimeout(VALUE_IN_MILI); // connection timeout - in milliseconds*/
}
Шаблон отдыха
Аналогичным образом для resttemplate мы могли бы определить следующим образом,
final RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(VALUE_IN_MILI)
.setConnectTimeout(VALUE_IN_MILI)
.setSocketTimeout(VALUE_IN_MILIs)
.build();
final HttpClient httpClient = HttpClients.custom()
.setConnectionTimeToLive(VALUE_IN_MILI, SECONDS)
.setRetryHandler((IOException exception, int executionCount, HttpContext context) -> {
return executionCount <= 3;
})
.setServiceUnavailableRetryStrategy(new DefaultServiceUnavailableRetryStrategy(3, 1))
.setDefaultRequestConfig(requestConfig)
.build();
final RestTemplate restTemplate = new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient));
Веб-клиент
И аналогичным образом ниже показано, как мы могли бы определить это в веб-клиенте,
public WebClient getWebClient()
{
HttpClient httpClient = HttpClient.create()
.tcpConfiguration(client ->
client.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, VALUE_IN_MILI)
.doOnConnected(conn -> conn
.addHandlerLast(new ReadTimeoutHandler(rest.timeout.millis))
.addHandlerLast(new WriteTimeoutHandler(rest.timeout.millis))));
ClientHttpConnector connector = new ReactorClientHttpConnector(httpClient.wiretap(true));
return WebClient.builder()
.baseUrl("http://localhost:3000")
.clientConnector(connector)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.build();
}
Резюме
В целом, очень важно настроить эти значения, т.е. тайм-аут соединения, тайм-аут чтения, тайм-аут сокета и т.д., Чтобы прерывать соединения после ожидания определенного промежутка времени, а не оставлять соединение открытым на неопределенный срок, что может привести к проблемам с общей производительностью и стабильностью приложения.
Рекомендации
HTTP4:: Верблюд Apache
Руководство по шаблону RestTemplate | Baeldung
Оригинал: “https://dev.to/sanjaybsm/timeouts-and-how-to-handline-in-java-5h3j”