O que pode causar conexão obsoleta no Spring boot Restapi usando RestTemplate

Jan 09 2021

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

2 Lokesh Jan 12 2021 at 13:47

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)