我每5分鐘運行一個流程並檢查以確定每個集裝箱。如果容器沒有響應,我可以將其標記爲關閉。我有容器的IP地址,我循環每個IP並檢查它是否響應ping。如果沒有,我將其標記爲關閉。有一個更好的方法嗎?我的代碼:如何檢測碼頭集裝箱是否墜毀
@Transactional
@Scheduled(fixedRate = 1000 * 60) //5 min
public void monitorHosts(){
Iterable<Ncl> ncls = nclRepository.findAll();
for(Ncl ncl: ncls){
for(String host: ncl.getHosts()){
Boolean isHostAlive = isHostAlive(host);
if(!isHostAlive){
Ncl nclWorking = nclRepository.findOne(ncl.getUuid());
if(nclWorking != null){
Set<String> hosts = nclWorking.getHosts().stream().filter(x -> x.equals(host)).collect(Collectors.toSet());
nclWorking.getHosts().clear();
nclWorking = nclRepository.save(nclWorking);
nclWorking.setHosts(hosts);
nclRepository.save(nclWorking);
}
}
}
}
}
private Boolean isHostAlive(String host){
try{
InetAddress address = InetAddress.getByName(host);
boolean reachable = address.isReachable(10000);
return reachable;
} catch (Exception e){
e.printStackTrace();
return false;
}
}
在cron作業上編寫shell腳本不是更好嗎? – CSK
你能澄清你在這裏想達到的目標嗎?您是否正在測試運行Docker容器的一組主機已啓動?或者你是否試圖在特定的主機上測試一組給定的容器正在運行? –
你的第二個陳述。主機=容器IP地址。主機是容器的IP地址。我有一個所有容器IP地址的列表。然後我通過容器ips進行循環。當我找到一個不可達的IP時,我將其刪除。 – Luke101