Multithreading 使用RestTemplate在Spring boot Restapi中导致连接陈旧的原因是什么

Multithreading 使用RestTemplate在Spring boot Restapi中导致连接陈旧的原因是什么,multithreading,spring-boot,connection-pooling,apache-httpclient-4.x,spring-resttemplate,Multithreading,Spring Boot,Connection Pooling,Apache Httpclient 4.x,Spring Resttemplate,我读到“过时的连接是服务器断开连接但客户端不知道的结果。”但我试图找到在我使用基于SpringBoot RestTemplate的应用程序(进一步使用Apache的PoolConnectionManager)并从应用程序调用另一个API的情况下如何实现这一点?在本例中,我的应用程序是一个客户端,我调用的应用程序充当服务器。如果我点击了该应用程序,并且我正在调用的api收到了请求,但在完全填充请求之前不知何故发生了故障。在这种情况下,我肯定会得到例外在我的结束。我非常确定,万一PoolConnec

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

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

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

        HttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).build();
您可以在StackOverflow中找到类似的示例

**跟进问题后更新**

根据文档,从版本4.4开始,行为发生了一些变化

在版本4.4中更改了过时连接的处理。 以前,代码会在默认情况下检查每个连接 我们正在使用它。代码现在只检查连接是否已通过 自上次使用连接以来的时间超过了 已经设定好了。默认超时设置为2000ms


谢谢你,洛克斯。我试图模仿过时的连接行为。我通过连接池调用api。我的setValidateAfterInactivity是100秒。线程每2秒打印一次poolstats。我将调试点放在我调用的api代码上,以便请求在那里等待并超时。但一旦超时,我的poolstats将从[Leated:1;pending:0;available:0;max:1000]更改为[Leated:0;pending:0;available:0;max:1000],立即释放租用的连接,不考虑setValidateAfterInactivity()。那么,如何模拟过时的conn行为呢?在客户端服务启动后,您是否尝试重新启动(或关闭)依赖服务?从技术上讲,这应该会将连接标记为陈旧。是的,Lokesh,我也试过这个。但不幸的是,这并没有导致陈旧的连接。但是,以下注释是对HttpConnection.java中的isStale()编写的:检查此连接是否已关闭。由于多种原因,网络连接可能在一段时间内关闭。下次在这样的连接上尝试读取时,它将抛出IOExc。此方法试图通过确定连接是否仍然可用来减轻这种不便。实现可以通过在很短的超时时间内尝试读取来实现这一点。ValidateAfterInactivity在设置的时间间隔后验证连接(如果没有连接是过时的)。如果它已过时,则会从连接池中退出。在您的场景中,由于超时,连接已过时,因此已清除。不确定是否遗漏了任何内容。我已添加了最新的文档。请检查您的库版本。最近的版本似乎改变了一些行为。如果您想拥有更多的控制,而现有的处理程序不适合您,那么您可能需要编写一个自定义清理处理程序。看到这个了吗