protected void eventoUmdfThreadWork(object param) { EventoUmdfWorkerState workerstate = param as EventoUmdfWorkerState; long lastTick = 0; long threadWatchDog = 0; if (workerstate != null) { logger.Info("Iniciando eventoUmdfThreadWork para channelID [" + workerstate.ChannelID + "]"); while (bKeepRunning) { if (MDSUtils.shouldLog(threadWatchDog, 30)) { logger.Info("eventoUmdfThreadWork(" + workerstate.ChannelID + ") ativo"); threadWatchDog = DateTime.UtcNow.Ticks; } try { EventoUmdf evento; if (workerstate.QueueEventos.TryDequeue(out evento)) { //logger.InfoFormat("Processando mensagem UMDF [{0}]", evento.MsgSeqNum); trataEventoUmdf(evento); if (MDSUtils.shouldLog(lastTick)) { logger.Info("eventoUmdfThreadWork(" + workerstate.ChannelID + ") msgs na fila: " + workerstate.QueueEventos.Count); lastTick = DateTime.UtcNow.Ticks; } continue; } lock (workerstate.SyncObj) { Monitor.Wait(workerstate.SyncObj, 50); } } catch (Exception ex) { logger.Error("eventoUmdfThreadWork(" + workerstate.ChannelID + "): " + ex.Message, ex); } } logger.Info("Finalizando eventoUmdfThreadWork para channelID [" + workerstate.ChannelID + "]"); } }
protected virtual void processaEventoUmdf(EventoUmdf evento) { // Se nao existe thread para tratar o evento, cria EventoUmdfWorkerState workerState = null; if (evento == null) { logger.Error("EventoUmdf nao pode ser nulo"); return; } if (String.IsNullOrEmpty(evento.ChannelID)) { logger.Error("Eita porra....channelID nulo"); return; } if (!poolWorkers.TryGetValue(evento.ChannelID, out workerState)) { logger.Info("Criando worker para channel [" + evento.ChannelID + "]"); workerState = new EventoUmdfWorkerState(); workerState.ChannelID = evento.ChannelID; workerState.Thread = new Thread(new ParameterizedThreadStart(eventoUmdfThreadWork)); workerState.Thread.Name = myThreadName + "-Worker-" + workerState.ChannelID; workerState.Thread.Start(workerState); poolWorkers.Add(evento.ChannelID, workerState); } //bool sinaliza = workerState.QueueEventos.IsEmpty; workerState.QueueEventos.Enqueue(evento); if (MDSUtils.shouldLog(workerState.lastEnqueueLog, 30)) { logger.Info("processaEventoUmdf para channelID [" + workerState.ChannelID + "] fila:" + workerState.QueueEventos.Count); workerState.lastEnqueueLog = DateTime.UtcNow.Ticks; } //if (sinaliza) //{ // lock (workerState.SyncObj) // { // Monitor.Pulse(workerState.SyncObj); // } //} }