如何解决两个互联网上的 HttpClient 连接池
我在客户的环境中遇到了一些问题。
它有 2 个互联网提供商,第二个是第一个出现故障时的备份,均由 Pfsence 实例管理。
我也使用 HttpClient 向此 pfsence 实例管理的 VPN 上的另一台服务器发出请求。
当第一个互联网出现故障(第二个接管),但 HttpClient 有一个内部连接池时
(PoolingHttpClientConnectionManager
) 还有我的问题...
这个池持有一个不会超时的套接字实例(我不知道为什么),并且必须使用第二个互联网的下一个请求停止响应,因为该池具有由现在关闭的第一个互联网连接的套接字的传送,并且它不会导致读取超时或类似的......
我该如何解决这个问题?如何测试此池并以正确的方式丢弃这些连接器?
解决方法
我创建了一个健康检查线程,每次服务器拒绝连接时我驱逐池:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。