RestTemplateを使用したSpringブートRestapiで古い接続を引き起こす可能性があるもの
「古い接続は、サーバーが接続を切断した結果ですが、クライアントはそれを認識していません」と読みました。しかし、SpringBoot RestTemplateに基づくアプリケーションを使用していて(さらにApacheのPoolConnectionManagerを使用している)、アプリケーションから別のAPIを呼び出す場合に、どのように可能かを見つけようとしていますか?この場合、私のアプリケーションはクライアントであり、呼び出しているアプリケーションはサーバーとして機能しています。そのアプリケーションをヒットし、呼び出しているAPIがリクエストを受信したが、リクエストを完全に満たす前に何らかの理由で故障した場合。この場合、私は確実に私の最後に例外を取得します。そして、PoolConnectionManagerがその接続を閉じている必要がある場合に備えて、私はかなり確信しています。では、どうすれば古い接続を確立できますか?
回答
デフォルトでは、PoolConnectionManagerは、それを行うように構成しない限り、停止した接続を閉じません。メソッドsetValidateAfterInactivity()
は、その期間を構成するために使用されます。
PoolingHttpClientConnectionManager connManager
= new PoolingHttpClientConnectionManager();
connManager.setValidateAfterInactivity(20);
HttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).build();
こちらのStackOverflowで同様の例を見つけることができます
**質問をフォローアップした後に更新します**
ドキュメントに基づいて、動作はバージョン4.4から少し変更されています。
古い接続の処理はバージョン4.4で変更されました。以前は、コードは再利用する前にデフォルトですべての接続をチェックしていました。コードは、接続を最後に使用してからの経過時間が設定されたタイムアウトを超えた場合にのみ接続をチェックするようになりました。デフォルトのタイムアウトは2000msに設定されています
https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.html#setValidateAfterInactivity(int)