/*
* 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();
}
}
}
}