Ejemplo n.º 1
0
        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 + "]");
            }
        }
Ejemplo n.º 2
0
        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);
            //    }
            //}
        }