【问题标题】:What can cause stale connection in Spring boot Restapi using RestTemplate什么会导致使用 RestTemplate 在 Spring Boot Rest Api 中过时的连接
【发布时间】:2021-01-15 01:50:25
【问题描述】:

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

【问题讨论】:

    标签: multithreading spring-boot connection-pooling apache-httpclient-4.x spring-resttemplate


    【解决方案1】:

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

    PoolingHttpClientConnectionManager connManager 
              = new PoolingHttpClientConnectionManager();
            connManager.setValidateAfterInactivity(20);
    
            HttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).build();
    

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

    ** 跟进问题后更新**

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

    4.4 版更改了旧连接的处理方式。 以前,代码会默认检查每个连接之前 重新使用它。代码现在只检查连接是否已过 自上次使用连接以来的时间超过了 被设置。默认超时设置为 2000 毫秒

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

    【讨论】:

    • 谢谢 Lokesh。我正在尝试模仿陈旧的连接行为。我通过连接池调用 api。我的 setValidateAfterInactivity 是 100 秒。一个线程每 2 秒打印一次 poolstats。我将调试点放在我正在调用的 api 代码上,以便请求在那里等待并超时。但是一旦超时,我的 poolstats 就会从 [leased: 1;待定:0;可用:0;最大:1000] 到 [租用:0;待定:0;可用:0;最大:1000]。 ,立即释放租用的 conn,而不考虑 setValidateAfterInactivity()。那么如何模拟陈旧的 conn 行为。
    • 您是否尝试在客户端服务启动后重新启动(或关闭)依赖服务?从技术上讲,这应该将连接标记为陈旧。
    • 是的,Lokesh,我也试过这个。但不幸的是,它并没有导致陈旧的连接。但是,在 HttpConnection.java 中的 isStale() 上写了以下注释: 检查此连接是否已断开。由于多种原因,网络连接可能会在一段时间不活动期间关闭。下次尝试对此类连接进行读取时,它将引发 IOExc。此方法试图通过尝试找出连接是否仍然可用来减轻这种不便。实现可以通过尝试以非常小的超时进行读取来做到这一点。
    • 关于你提到的行为似乎是有效的。如果没有连接过时,ValidateAfterInactivity 会在设置的时间间隔后验证连接。如果它是陈旧的,那么它将从连接池中逐出。在您的场景中,连接由于超时而过时,因此被清除。不知道我是否遗漏了什么。
    • 我添加了最新的文档。请同时检查您的库版本。似乎最近版本的行为有所改变。如果您想拥有更多控制权并且现有处理程序不适合您,那么您可能需要编写自定义清理处理程序。看到这个stackoverflow.com/questions/42438970/…
    猜你喜欢
    • 2018-05-08
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2021-07-11
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多