Что может вызвать устаревшее соединение в Spring boot Restapi с использованием RestTemplate

Jan 09 2021

Я читал, что «устаревшие соединения являются результатом того, что сервер отключил соединение, но клиент не знал об этом». Но я пытаюсь понять, как это возможно, если я использую свое приложение на основе SpringBoot RestTemplate (в дальнейшем с помощью PoolConnectionManager из Apache) и вызываю другой API из моего приложения? В этом случае мое приложение является клиентом, а приложение, которое я вызываю, действует как сервер. Если я нажму на это приложение, и вызываемый мной api получит запрос, но каким-то образом сломается до полного заполнения запроса. В этом случае я обязательно получу исключение. И я почти уверен, что в случае, если PoolConnectionManager должен закрыть это соединение. Тогда как у меня может быть устаревшее соединение?

Ответы

2 Lokesh Jan 12 2021 at 13:47

По умолчанию PoolConnectionManager не закрывает застрявшее соединение, если вы не настроите его для этого. Метод setValidateAfterInactivity()используется для настройки этого периода времени.

PoolingHttpClientConnectionManager connManager 
          = new PoolingHttpClientConnectionManager();
        connManager.setValidateAfterInactivity(20);

        HttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).build();

Вы можете найти аналогичный пример в StackOverflow здесь

** Обновление после уточнения вопросов **

Исходя из документации, поведение немного изменено по сравнению с версией 4.4.

В версии 4.4 была изменена обработка устаревших соединений. Раньше код по умолчанию проверял каждое соединение перед его повторным использованием. Теперь код проверяет соединение только в том случае, если время, прошедшее с момента последнего использования соединения, превышает установленный тайм-аут. Тайм-аут по умолчанию установлен на 2000 мс.

https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.html#setValidateAfterInactivity(int)