Apa yang dapat menyebabkan koneksi basi di Spring boot Restapi menggunakan RestTemplate

Jan 09 2021

Saya membaca bahwa "koneksi basi adalah hasil dari server memutuskan koneksi tetapi klien tidak mengetahuinya." Tetapi saya mencoba untuk menemukan bagaimana mungkin jika saya menggunakan aplikasi saya berdasarkan SpringBoot RestTemplate (selanjutnya menggunakan PoolConnectionManager dari Apache) dan memanggil API lain dari aplikasi saya? Dalam hal ini, aplikasi saya adalah klien dan aplikasi yang saya panggil bertindak sebagai server. Jika saya menekan aplikasi itu, dan api yang saya panggil menerima permintaan tetapi entah bagaimana rusak sebelum memenuhi permintaan secara penuh. Dalam hal ini, saya pasti akan mendapatkan pengecualian di akhir saya. Dan saya cukup yakin bahwa PoolConnectionManager harus menutup koneksi itu. Lalu bagaimana saya bisa memiliki koneksi yang basi?

Jawaban

2 Lokesh Jan 12 2021 at 13:47

Secara default, PoolConnectionManager tidak menutup koneksi yang terhenti kecuali Anda mengkonfigurasinya untuk melakukannya. Metode setValidateAfterInactivity()digunakan untuk mengkonfigurasi periode waktu tersebut.

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

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

Anda dapat menemukan contoh serupa di StackOverflow di sini

** Perbarui setelah menindaklanjuti pertanyaan **

Berdasarkan dokumentasi, perilaku diubah sedikit dari versi 4.4.

Penanganan koneksi lama diubah di versi 4.4. Sebelumnya, kode akan memeriksa setiap koneksi secara default sebelum menggunakannya kembali. Kode sekarang hanya memeriksa koneksi jika waktu yang telah berlalu sejak penggunaan terakhir koneksi melebihi waktu tunggu yang telah ditetapkan. Batas waktu default diatur ke 2000ms

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