BOa tarde preciso fazer um modulo no meu sistema de chat web para detecção de usuários q estiverem off-line no momento em q o browser é fechado.
fiz o modelo em q a pagina fica mandando uma requisição a cada 2 s para o servidor para que eu possa ter esse controle o mais rápido possível
estou usando uma Thread para ficar sempre comparando uma lista online atual (online1) com uma outra lista anterior (online2) para comparar si alguém saiu da lista
o problema q que a “online2” atualiza junto com a “online1” e não sei por isso ta acontecendo ja que a mesma so deveria ficar igual a outra depois de fazer a comparação na Thread
[code]package br.com.you.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSessionListener;
import br.com.you.bean.Usuario;
@WebServlet(urlPatterns = {"/onlinereal"}, asyncSupported=true)
public class OnlineReal extends HttpServlet implements Runnable {
private static HashMap<Integer, Usuario> onlines1 = new HashMap<Integer, Usuario>();
private static HashMap<Integer, Usuario> onlines2 = new HashMap<Integer, Usuario>();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
synchronized (this) {
Usuario usuariologado = (Usuario) request.getSession().getAttribute("usuariologado");
onlines1.put(usuariologado.getNumero_matricula(),usuariologado);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if(onlines1.size() == 1){
OnlineReal e = new OnlineReal();
Thread t = new Thread(e);
t.start();
}
}
public void run() {
while(true){
//List<Integer> online1 = new ArrayList<Integer>(online1set);
System.out.println("run");
synchronized (this) {
if(onlines2.size()>0){
for(Integer matricula: onlines2.keySet()){
Usuario verifica = onlines1.get(matricula);
if (verifica == null){
System.out.println(matricula+" esta offline");
}
}
}
if(onlines1.size()>0){
onlines2 = onlines1;
}
onlines1.clear();
try{
Thread.sleep(5000);
}catch(InterruptedException e){
System.out.println("erro na thead " + e.getMessage());
}
}
}
}
}
[/code]