3

我读到“过时的连接是服务器断开连接但客户端不知道的结果。” 但是我试图找出如果我使用基于 SpringBoot RestTemplate 的应用程序(进一步使用来自 Apache 的 PoolConnectionManager)并从我的应用程序调用另一个 API 的情况下怎么可能?在这种情况下,我的应用程序是客户端,而我正在调用的应用程序充当服务器。如果我点击该应用程序,并且我正在调用的 api 接收到请求,但在完全填充请求之前不知何故崩溃了。在这种情况下,我肯定会在最后得到例外。而且我很确定,如果 PoolConnectionManager 必须关闭该连接。那我怎么能有过时的连接?

4

1 回答 1

2

默认情况下,PoolConnectionManager 不会关闭陈旧的连接,除非您将其配置为这样做。方法setValidateAfterInactivity()用于配置该时间段。

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

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

您可以在此处的 StackOverflow 中找到类似的示例

**跟进问题后更新**

根据文档,行为从 4.4 版有所改变。

在 4.4 版中更改了旧连接的处理。以前,代码会在重新使用之前默认检查每个连接。该代码现在仅在自上次使用连接后经过的时间超过已设置的超时时才检查连接。默认超时设置为 2000 毫秒

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

于 2021-01-12T06:47:15.473 回答