什么会导致使用 RestTemplate 在 Spring Boot 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 here

中找到类似的示例

** 跟进问题后更新 **

基于文档的行为与 4.4 版相比有所改变。

旧连接的处理在 4.4 版中发生了变化。 以前,代码会默认检查每个连接之前 重新使用它。代码现在只检查连接是否已过 自上次使用连接以来的时间超过了超时时间 被设置。默认超时设置为 2000ms

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