/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package socius.thread; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import socius.dispositivos.ComputadorRemoto; import socius.dispositivos.ServidorRemoto; import socius.util.ConfigSistema; /** * * @author Lucas Dillmann <lucas [at] dillmann.com.br> */ public class MantemListaComputadoresOnlineThread extends Thread { private ServidorRemoto servidor; public MantemListaComputadoresOnlineThread(ServidorRemoto servidor) { super(); this.servidor = servidor; } @Override public void run() { // Obtem intervalo em segundos (e converte para milisegundos) que // computadores clientes irão seguir para me enviar notificações que // ainda estao online Integer intervalo = Integer.parseInt( ConfigSistema.getProperty("cliente.intervalo_notificacao_servidor")) * 1000; Integer tempoInatividade = intervalo * 3; while (true) { List<ComputadorRemoto> computadoresOffline = new ArrayList<>(); try { Thread.sleep(intervalo); } catch (InterruptedException ex) { Logger.getLogger(MantemListaComputadoresOnlineThread.class.getName()).log(Level.SEVERE, null, ex); } try { Map<ComputadorRemoto, Date> online = servidor.getMapClientes(); Iterator<Map.Entry<ComputadorRemoto, Date>> iterator = online.entrySet().iterator(); // Passa por todos os computadores em tese online while (iterator.hasNext()) { Map.Entry<ComputadorRemoto, Date> item = iterator.next(); Date ultimaAtualizacao = item.getValue(); ComputadorRemoto c = item.getKey(); // Compara se a última atualização passou do tempo limite if (ultimaAtualizacao.getTime() + tempoInatividade < new Date().getTime()) { // Se positivo, adiciona a lista para remoção futura computadoresOffline.add(c); } } // Atualiza lista no servidor synchronized(servidor.getMapClientes()) { for(ComputadorRemoto coff : computadoresOffline) { System.out.println("Computador offline: " + coff.hashCode()); servidor.getMapClientes().remove(coff); servidor.disparaNotificacoes(); } } } catch (RemoteException e) { e.printStackTrace(); } } } }