สิ่งที่อาจทำให้การเชื่อมต่อค้างใน Spring boot Restapi โดยใช้ RestTemplate
ฉันอ่านพบว่า "การเชื่อมต่อเก่าเป็นผลมาจากเซิร์ฟเวอร์ตัดการเชื่อมต่อ แต่ไคลเอนต์ไม่ทราบ" แต่ฉันกำลังพยายามค้นหาว่าจะเป็นไปได้อย่างไรในกรณีที่ฉันใช้แอปพลิเคชันของฉันตาม SpringBoot RestTemplate (เพิ่มเติมโดยใช้ PoolConnectionManager จาก Apache) และเรียก API อื่นจากแอปพลิเคชันของฉัน? ในกรณีนี้แอปพลิเคชันของฉันเป็นไคลเอนต์และแอปพลิเคชันที่ฉันเรียกใช้ทำหน้าที่เป็นเซิร์ฟเวอร์ หากฉันกดเข้าแอปพลิเคชันนั้นและ api ที่ฉันกำลังโทรได้รับคำขอ แต่พังทลายลงก่อนที่จะกรอกคำขอทั้งหมด ในกรณีนี้ฉันจะได้รับข้อยกเว้นในตอนท้ายอย่างแน่นอน และฉันค่อนข้างมั่นใจว่าในกรณีที่ PoolConnectionManager ต้องปิดการเชื่อมต่อนั้น แล้วฉันจะมีการเชื่อมต่อที่ค้างได้อย่างไร?
คำตอบ
ตามค่าเริ่มต้น PoolConnectionManager จะไม่ปิดการเชื่อมต่อแบบ staled เว้นแต่คุณจะกำหนดค่าให้ทำเช่นนั้น วิธี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)