两个 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
我在客户的环境中遇到了一些问题。
它有 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