public Resposta ProcessaComando(Requisicao req) { while (true) { lock (blockRespostasGRPC) { if (listaRespostasGRPC.ContainsKey(req)) { Resposta r = new Resposta(); string rep; listaRespostasGRPC.TryGetValue(req, out rep); r.Mensagem = rep; listaRespostasGRPC.Remove(req); return(r); } } } }
/// <summary> /// Thread que pega os comandos de filaProcessa os processa e envia o resultado para o cliente. /// </summary> static void ThreadProcessaComando() { Requisicao req; IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), portaEnvia); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socket.Bind(ip); while (true) { lock (blockProcessa) { if (filaProcessa.Count > 0) { req = filaProcessa.Dequeue(); string resposta = ""; byte[] resp; if (req.Comand.comand != (int)Comandos.LISTAR && req.Comand.comand != (int)Comandos.MONITORAR) { ProcessaComando(req.Comand, ref resposta); if (req.Remote != null) { resp = Encoding.UTF8.GetBytes(resposta); socket.SendTo(resp, resposta.Length, SocketFlags.None, req.Remote); } else { lock (blockRespostasGRPC) { listaRespostasGRPC.Add(req, resposta); } } } else if (req.Comand.comand == (int)Comandos.LISTAR) { if (req.Remote != null) { foreach (KeyValuePair <long, string> entry in Mapa) { resposta = entry.Key + " - " + entry.Value; resp = Encoding.UTF8.GetBytes(resposta); socket.SendTo(resp, resposta.Length, SocketFlags.None, req.Remote); } } else { foreach (KeyValuePair <long, string> entry in Mapa) { resposta = entry.Key + " - " + entry.Value; lock (req.block) { req.respostas.Enqueue(resposta); } } lock (req.block) { req.HaRespostas = false; } } } else if (req.Comand.comand == (int)Comandos.MONITORAR) { Requisicao existe = null; if (!Mapa.ContainsKey(req.Comand.Chave)) { lock (req.block) { req.respostas.Enqueue("Chave inexistente."); req.HaRespostas = false; continue; } } foreach (Requisicao r in Monitorados) { if (r.EstaMonitorando(req.Comand.Chave) && r.context.Peer == req.context.Peer) { existe = r; } } if (existe != null) { lock (req.block){ lock (Monitorados) { Monitorados.Remove(existe); } lock (existe.block) { existe.HaRespostas = false; } req.respostas.Enqueue("Monitoramento da chave " + req.Comand.Chave + " parado com sucesso."); req.HaRespostas = false; } } else { req.monitora = req.Comand.Chave; lock (Monitorados) { Monitorados.Add(req); } lock (req.block) { req.respostas.Enqueue("Monitoramento da chave " + req.Comand.Chave + " iniciado com sucesso."); } } } List <Requisicao> remover = new List <Requisicao>(); lock (Monitorados) { foreach (Requisicao r in Monitorados) { if (req.Comand.Chave == r.monitora) { lock (r.block) { if (req.Comand.comand == (int)Comandos.UPDATE) { r.respostas.Enqueue("Valor da chave " + r.Comand.Chave + " atualizado.\nNovo valor: " + req.Comand.Valor); } else if (req.Comand.comand == (int)Comandos.DELETE) { remover.Add(r); r.respostas.Enqueue("Chave " + r.Comand.Chave + " deletada.\nParando monitoramento."); r.HaRespostas = false; } } } } } lock (Monitorados) { foreach (Requisicao r in remover) { Monitorados.Remove(r); } } } } } }