问题描述
我想检查后端的健康状况,如果后端死了,我将停用该后端。
我使用ThreadPool启动线程,每10秒钟使用ip +端口ping我的后端。
Socket socket = new Socket();
InetSocketAddress address = new InetSocketAddress(domain,port);
try {
socket.connect(address,3000);
if (socket.isConnected()) {
successCount++;
}
} catch (IOException e) {
e.printstacktrace();
}
然后我关闭插座。
Socket socket = new Socket();
InetSocketAddress address = new InetSocketAddress(domain,port);
try {
socket.connect(address,3000);
if (socket.isConnected()) {
successCount++;
}
} catch (IOException e) {
e.printstacktrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printstacktrace();
}
}
我想找到这种条件在内存使用上的区别。
我使用 jconsole 显示内存使用情况。
这是有关内存的图片。我想知道为什么。 enter image description here
private void backendHealthCheck() {
Map<String,Boolean> backendHealthMap = new ConcurrentHashMap<>();
List<ProxyBackendConfiguration> allBackends = gatewayBackendManager.getAllBackends();
for (ProxyBackendConfiguration backend : allBackends) {
String backendName = backend.getName();
Boolean backendStatus = gatewayBackendManager.getBackendStatus(backendName);
log.debug("[{}] 对应的后端状态为 [{}]",backendName,backendStatus);
backendHealthMap.put(backendName,backendStatus);
}
scheduledexecutorservice.scheduleWithFixedDelay(
() -> {
log.info("Check the backend's healthy condition");
List<ProxyBackendConfiguration> backends = gatewayBackendManager.getAllBackends();
for (ProxyBackendConfiguration backend : backends) {
int successCount = 0;
String domain = backend.getProxyTo().substring(8,36);
int port = Integer.parseInt(backend.getProxyTo().substring(37,41));
String backendName = backend.getName();
for (int i = 0; i < 7; i++) {
Socket socket = new Socket();
InetSocketAddress address = new InetSocketAddress(domain,port);
try {
socket.connect(address,3000);
if (socket.isConnected()) {
successCount++;
}
} catch (IOException e) {
e.printstacktrace();
}
if (successCount >= 2) {
// if the backend is active then break,else active this backend
// if this is not in map,get false active this backend
// if this backend in this map,and status is false,then active this backend
if (!backendHealthMap.getorDefault(backendName,false)) {
gatewayBackendManager.activateBackend(backendName);
backendHealthMap.put(backendName,true);
}
break;
}
if (i == 6) {
// if this backend in map and the status is false,continue
// if this backend is not in map,get status is true,then deactive this backend
// if this backedn in map,and status is true,then deactive this backend
if (backendHealthMap.getorDefault(backendName,true)) {
gatewayBackendManager.deactivateBackend(backendName);
backendHealthMap.put(backendName,false);
}
}
}
}
},10,TimeUnit.SECONDS);
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)