Co może spowodować nieaktualne połączenie w Spring boot Restapi przy użyciu RestTemplate
Czytałem, że „nieaktualne połączenia są wynikiem rozłączenia połączenia przez serwer, ale klient nie wie”. Ale próbuję dowiedzieć się, jak to jest możliwe w przypadku, gdy używam mojej aplikacji opartej na SpringBoot RestTemplate (dalej używam PoolConnectionManager z Apache) i wywołuję inny interfejs API z mojej aplikacji? W tym przypadku moja aplikacja jest klientem, a aplikacja, którą wywołuję, działa jako serwer. Jeśli trafię na tę aplikację, a wywoływany interfejs API odbierze żądanie, ale w jakiś sposób zepsuje się przed pełnym wypełnieniem żądania. W takim przypadku na pewno dostanę wyjątek na końcu. I jestem prawie pewien, że w przypadku, gdy PoolConnectionManager musi zamykać to połączenie. Jak więc mogę kiedykolwiek mieć nieaktualne połączenie?
Odpowiedzi
Domyślnie PoolConnectionManager nie zamyka nieaktualnego połączenia, chyba że skonfigurujesz go w ten sposób. Metoda setValidateAfterInactivity()
służy do konfigurowania tego okresu.
PoolingHttpClientConnectionManager connManager
= new PoolingHttpClientConnectionManager();
connManager.setValidateAfterInactivity(20);
HttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).build();
Podobny przykład znajdziesz w StackOverflow tutaj
** Aktualizacja po pytaniach uzupełniających **
Na podstawie dokumentacji zachowanie jest nieco zmienione od wersji 4.4.
Obsługa przestarzałych połączeń została zmieniona w wersji 4.4. Wcześniej kod sprawdzał domyślnie każde połączenie przed ponownym użyciem. Kod sprawdza teraz połączenie tylko wtedy, gdy czas, który upłynął od ostatniego użycia połączenia przekracza ustawiony limit czasu. Domyślny limit czasu jest ustawiony na 2000 ms
https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.html#setValidateAfterInactivity(int)