[RESOLVIDO] Problema com atualização de HashMap na Thread - Ajudem por favor

1 resposta
S

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

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

            }
		}

   }


		
		
        
	


}

1 Resposta

S

resolvi troquei isto…

if(onlines1.size()>0){  
                    onlines2 = onlines1;  
                }

por isto pelo jeito botar para receber direto não da certo :S

if(onlines1.size()>0){
	            	
	            	for(Integer matricula: onlines1.keySet()){
	                	
	            		onlines2.put(matricula, onlines1.get(matricula));

	                }
	          
	            }
Criado 5 de maio de 2013
Ultima resposta 5 de mai. de 2013
Respostas 1
Participantes 1