两个 Internet 上的 HttpClient 连接池

HttpClient connection pool over two internets

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

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

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

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

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

我创建了一个 health-check 线程,每次服务器拒绝连接时我 evict 池:

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