apache-httpclient-4.x - 两个互联网上的 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
推荐阅读
- mysql - 我想加入两个表,删除重复值
- javascript - 我怎么做复选框元素打开/关闭并更改 Javascript 中的 CSS 类/ID
- javascript - 如何点击实际元素而不是 Rails 不显眼的 javascript 表单?
- javascript - 如何在移动设备上运行 JWPlayer?
- r - 使用 R 中的 tryCatch 从处理函数中的 gamlss 模型预测数据
- ms-access - TUniTable/TFDTable.Filter 通配符限制 - 比如 '[AB]*'
- python-3.x - 我在使用此代码时遇到了计算问题
- python - Windows 安装程序必须写入注册表(使用 NSIS 安装的已编译 python 应用程序)
- node.js - Azure 管道中的 UI 测试显示错误找不到使用节点 js 的 chrome 二进制文件
- android - Admob 在 Android 应用程序中导致 NullPointerException