Cosa può causare una connessione obsoleta in Spring boot Restapi utilizzando RestTemplate

Jan 09 2021

Ho letto che "le connessioni obsolete sono il risultato del server che disconnette la connessione ma il client non lo sa". Ma sto cercando di scoprire come è possibile nel caso in cui sto utilizzando la mia applicazione basata su SpringBoot RestTemplate (ulteriormente utilizzando PoolConnectionManager da Apache) e chiamando un'altra API dalla mia applicazione? In questo caso, la mia applicazione è un client e l'applicazione che sto chiamando funge da server. Se premo quell'applicazione e l'API che sto chiamando riceve la richiesta ma in qualche modo si interrompe prima di riempire completamente la richiesta. In questo caso, otterrò sicuramente l'eccezione alla mia fine. E sono abbastanza sicuro che nel caso in cui PoolConnectionManager debba chiudere quella connessione. Allora come posso mai avere una connessione obsoleta?

Risposte

2 Lokesh Jan 12 2021 at 13:47

Per impostazione predefinita, PoolConnectionManager non chiude la connessione bloccata a meno che non venga configurata per farlo. Il metodo setValidateAfterInactivity()viene utilizzato per configurare quel periodo di tempo.

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

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

Puoi trovare un esempio simile in StackOverflow qui

** Aggiorna dopo aver risposto alle domande **

In base alla documentazione, il comportamento è leggermente cambiato rispetto alla versione 4.4.

La gestione delle connessioni obsolete è stata modificata nella versione 4.4. In precedenza, il codice controllava ogni connessione per impostazione predefinita prima di riutilizzarlo. Il codice ora controlla la connessione solo se il tempo trascorso dall'ultimo utilizzo della connessione supera il timeout impostato. Il timeout predefinito è impostato su 2000 ms

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