Spring Scheduled Task,奇怪的行为

时间:2016-12-11 16:27:37

标签: spring

我有一个计划任务,从服务器到客户端每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

0 个答案:

没有答案