O que pode causar conexão obsoleta no Spring boot Restapi usando RestTemplate
Eu li que "conexões obsoletas são o resultado do servidor desconectar a conexão, mas o cliente não sabe." Mas estou tentando descobrir como isso é possível no caso de estar usando meu aplicativo com base no SpringBoot RestTemplate (usando ainda PoolConnectionManager do Apache) e chamando outra API do meu aplicativo? Nesse caso, meu aplicativo é um cliente e o aplicativo que estou chamando está atuando como um servidor. Se eu acessar esse aplicativo e a api que estou chamando receber a solicitação, mas de alguma forma quebrar antes de preencher totalmente a solicitação. Nesse caso, certamente receberei a exceção no meu final. E tenho certeza de que no caso de PoolConnectionManager deve estar fechando essa conexão. Então, como posso ter uma conexão obsoleta?
Respostas
Por padrão, PoolConnectionManager não fecha a conexão interrompida, a menos que você configure para fazer isso. O método setValidateAfterInactivity()
é usado para configurar esse período de tempo.
PoolingHttpClientConnectionManager connManager
= new PoolingHttpClientConnectionManager();
connManager.setValidateAfterInactivity(20);
HttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).build();
Você pode encontrar um exemplo semelhante no StackOverflow aqui
** Atualização após perguntas de acompanhamento **
Com base na documentação, o comportamento foi alterado um pouco desde a versão 4.4.
O tratamento de conexões obsoletas foi alterado na versão 4.4. Anteriormente, o código verificava todas as conexões por padrão antes de reutilizá-las. O código agora verifica a conexão apenas se o tempo decorrido desde o último uso da conexão exceder o tempo limite definido. O tempo limite padrão é definido para 2.000 ms
https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.html#setValidateAfterInactivity(int)