Что может вызвать устаревшее соединение в Spring boot Restapi с использованием RestTemplate
Я читал, что «устаревшие соединения являются результатом того, что сервер отключил соединение, но клиент не знал об этом». Но я пытаюсь понять, как это возможно, если я использую свое приложение на основе SpringBoot RestTemplate (в дальнейшем с помощью PoolConnectionManager из Apache) и вызываю другой API из моего приложения? В этом случае мое приложение является клиентом, а приложение, которое я вызываю, действует как сервер. Если я нажму на это приложение, и вызываемый мной api получит запрос, но каким-то образом сломается до полного заполнения запроса. В этом случае я обязательно получу исключение. И я почти уверен, что в случае, если PoolConnectionManager должен закрыть это соединение. Тогда как у меня может быть устаревшее соединение?
Ответы
По умолчанию 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)