我有一个计划任务,从服务器到客户端每800秒运行一次,看看他们是否在线。如果不是,它会向我发送一封电子邮件,并在他们重新上线时发送电子邮件。
所以,这是预定的任务
@Scheduled(fixedDelay = 800000)
public void pingAllClients() {
logger.debug("Schedule pingClients");
List<Client> clients = clientService.findAllClients();
Iterator<Client> it = clients.iterator();
while (it.hasNext()) {
Client client = it.next();
String ip = client.getCurrentIp();
int idClient = client.getIdClient();
boolean isOnline = client.isOnline();
try {
boolean reachable = reachClient.isReachable(ip);
if (reachable) {
if (!isOnline) {
logger.debug("Client " + idClient + " back online");
client.setOnline(true);
clientService.updateClient(client);
smtp.sendEmail(serverName, ip, true);
}
} else {
logger.debug("Client " + idClient + " not available");
if (isOnline) {
client.setOnline(false);
clientService.updateClient(client);
smtp.sendEmail(serverName, ip, false);
}
}
} catch (Exception e) {
logger.error("Errore", e);
}
}
}
}
reachClient.isReachable(ip)就是这个方法:
public boolean isReachable(String ip){
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress(ip, 22), 50*1000);
return true;
} catch (IOException e) {
return false;
} finally {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
所以,它应该是:每800秒我循环我的客户,看看是否可以访问,如果他们改变状态,我将收到一封电子邮件。在电子邮件中,我打印请求的日期/时间。
我总是会收到来自离线客户端的电子邮件,不久之后(2-10秒)收到一封电子邮件,因为对于同一个客户端,我在一次迭代中收到2封电子邮件,它有可能吗?每个客户端都应该可以访问或不访问每个循环,而不是两个...
我收到的最后两封电子邮件是(延迟6秒)
客户端192.168.42.13处于离线状态 - 日期:11-12-2016 17:14:30
客户端192.168.42.13重新联机 - 日期:11-12-2016 17:14:36