首页 > 解决方案 > 两个互联网上的 HttpClient 连接池

问题描述

我在客户的环境中遇到了一些问题。

它有 2 个互联网提供商,第二个是第一个出现故障时的备份,两者都由 Pfsence 实例管理。

我也在使用 HttpClient 向此 pfsence 实例管理的 VPN 上的另一台服务器发出请求。

当第一个互联网出现故障(第二个接管),但 HttpClient 有一个内部连接池(PoolingHttpClientConnectionManager)并且有我的问题......这个池持有一个不会超时的套接字实例(我不知道为什么)并且必须使用第二个互联网的下一个请求停止响应,因为池已经传递了由现在关闭的第一个互联网连接的套接字,并且它不会导致读取超时或类似的事情......

我该如何解决这个问题?如何测试这个池并以正确的方式丢弃这些连接器?

标签: apache-httpclient-4.x

解决方案


我创建了一个健康检查线程,每次服务器拒绝连接时,我都会驱逐池:

Thread healthCheck = new Thread(() -> {
    while (true) {
        try (Socket s = new Socket()) {
            s.connect(new InetSocketAddress("ip-server-address", 80), 3000);
        } catch (IOException e) {
            myPoolingHttpClientConnectionManager.closeExpiredConnections();
            myPoolingHttpClientConnectionManager.closeIdleConnections(0, TimeUnit.MILLISECONDS);
        }
        
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            return;
        }
    }

});
healthCheck.setDaemon(true);
healthCheck.start();

该解决方案基于这篇文章:

https://www.baeldung.com/httpclient-connection-management#eviction


推荐阅读