Điều gì có thể gây ra kết nối cũ trong Spring boot Restapi bằng RestTemplate

Jan 09 2021

Tôi đọc rằng "các kết nối cũ là kết quả của việc máy chủ ngắt kết nối nhưng khách hàng không biết." Nhưng tôi đang cố gắng tìm cách có thể xảy ra trong trường hợp tôi đang sử dụng ứng dụng của mình dựa trên SpringBoot RestTemplate (sử dụng thêm PoolConnectionManager từ Apache) và gọi một API khác từ ứng dụng của mình? Trong trường hợp này, ứng dụng của tôi là một máy khách và ứng dụng tôi đang gọi đang hoạt động như một máy chủ. Nếu tôi nhấn vào ứng dụng đó và api tôi đang gọi nhận được yêu cầu nhưng bằng cách nào đó bị hỏng trước khi thực hiện đầy đủ yêu cầu. Trong trường hợp này, tôi chắc chắn sẽ nhận được ngoại lệ vào cuối của tôi. Và tôi khá chắc chắn rằng trong trường hợp PoolConnectionManager phải đóng kết nối đó. Sau đó, làm thế nào tôi có thể có kết nối cũ?

Trả lời

2 Lokesh Jan 12 2021 at 13:47

Theo mặc định, PoolConnectionManager không đóng kết nối bị gián đoạn trừ khi bạn định cấu hình nó để làm điều đó. Phương thức setValidateAfterInactivity()được sử dụng để cấu hình khoảng thời gian đó.

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

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

Bạn có thể tìm thấy một ví dụ tương tự trong StackOverflow tại đây

** Cập nhật sau khi theo dõi câu hỏi **

Dựa trên hành vi tài liệu được thay đổi một chút từ phiên bản 4.4.

Việc xử lý các kết nối cũ đã được thay đổi trong phiên bản 4.4. Trước đây, mã sẽ kiểm tra mọi kết nối theo mặc định trước khi sử dụng lại. Mã hiện chỉ kiểm tra kết nối nếu thời gian trôi qua kể từ lần sử dụng kết nối cuối cùng vượt quá thời gian chờ đã được đặt. Thời gian chờ mặc định được đặt thành 2000ms

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