/// <summary> /// Envia o relatorio de execucao para os assinantes /// </summary> /// <param name="order">objeto OrdemInfo</param> protected virtual void _sendConnectionStatus() { List <IRoteadorOrdensCallback> toDelete = new List <IRoteadorOrdensCallback>(); StatusConexaoBolsaInfo conexao = new StatusConexaoBolsaInfo(); conexao.Bolsa = _config.Bolsa; conexao.Operador = _config.Operador; conexao.Conectado = _bConectadoBolsa; try { lock (_exchangeStatusSubscribers) { foreach (IRoteadorOrdensCallback subscriber in _exchangeStatusSubscribers) { if (Ativador.IsValidChannel(subscriber)) { try { subscriber.StatusConexaoAlterada(conexao); } catch (Exception ex) { logger.Error(ex); logger.Info("Abortando channel para assinante: " + subscriber.ToString()); Ativador.AbortChannel(subscriber); logger.Info("Removendo assinante da lista: " + subscriber.ToString()); toDelete.Add(subscriber); } } else { logger.Info("Removendo assinante da lista: " + subscriber.ToString()); toDelete.Add(subscriber); } } // Remove os assinantes abandonados/falhos da lista foreach (IRoteadorOrdensCallback subscriber in toDelete) { _exchangeStatusSubscribers.Remove(subscriber); } toDelete.Clear(); } } catch (Exception ex) { logger.Error("Erro em _sendExecutionReport(): " + ex.Message, ex); } }
/// <summary> /// /// </summary> private void heartBeatProc() { long lastHeartBeat = DateTime.MinValue.Ticks; while (_bKeepRunning) { List <IDropCopyCallback> toDelete = new List <IDropCopyCallback>(); TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - lastHeartBeat); if (ts.TotalMilliseconds >= 30000) { lastHeartBeat = DateTime.Now.Ticks; logger.Info("Enviando Heartbeat para " + _lstDropCopySubscribers.Count + " subscribers"); foreach (IDropCopyCallback subscriber in _lstDropCopySubscribers) { if (Ativador.IsValidChannel(subscriber)) { try { subscriber.HeartBeat(); } catch (Exception ex) { logger.Error(ex); logger.Info("Abortando channel para assinante: " + subscriber.ToString()); Ativador.AbortChannel(subscriber); logger.Info("Removendo assinante da lista: " + subscriber.ToString()); toDelete.Add(subscriber); } } else { logger.Info("Removendo assinante da lista: " + subscriber.ToString()); toDelete.Add(subscriber); } } // Remove os assinantes abandonados/falhos da lista foreach (IDropCopyCallback subscriber in toDelete) { _lstDropCopySubscribers.Remove(subscriber); } toDelete.Clear(); } Thread.Sleep(250); } }
/// <summary> /// Envia o relatorio de execucao para os assinantes /// </summary> /// <param name="order">objeto OrdemInfo</param> private void _dispatchExecutionReport(OrdemInfo order) { List <IRoteadorOrdensCallback> toDelete = new List <IRoteadorOrdensCallback>(); try { lock (_executionsReportsSubscribers) { foreach (IRoteadorOrdensCallback subscriber in _executionsReportsSubscribers) { if (Ativador.IsValidChannel(subscriber)) { try { subscriber.OrdemAlterada(order); } catch (Exception ex) { logger.Error(ex); logger.Info("Abortando channel para assinante: " + subscriber.ToString()); Ativador.AbortChannel(subscriber); logger.Info("Removendo assinante da lista: " + subscriber.ToString()); toDelete.Add(subscriber); } } else { logger.Info("Removendo assinante da lista: " + subscriber.ToString()); toDelete.Add(subscriber); } } // Remove os assinantes abandonados/falhos da lista foreach (IRoteadorOrdensCallback subscriber in toDelete) { _executionsReportsSubscribers.Remove(subscriber); } toDelete.Clear(); } } catch (Exception ex) { logger.Error("Erro em _sendExecutionReport(): " + ex.Message, ex); } }
public void Run() { try { logger.Info("Iniciando thread de repasse de mensagens ao subscriber"); prepareNesper(); int qtdeFila = 0; long lastHeartbeat = 0; while (_bKeepRunning) { queueSem.WaitOne(250); lock (queue) { qtdeFila = queue.Count; } for (int i = 0; i < qtdeFila; i++) { object evento; string msgid = ""; lock (queue) { evento = queue.Dequeue(); } if (evento.GetType() == typeof(EventoMega)) { EventoMega mega = (EventoMega)evento; msgid = mega.MsgID; repassaEventoMega(mega); } if (evento.GetType() == typeof(EventoCBLC)) { EventoCBLC cblc = (EventoCBLC)evento; msgid = cblc.MsgID; repassaEventoCBLC(cblc); } logger.Debug("Encaminhou mensagem [" + msgid + "]"); } TimeSpan tspan = new TimeSpan(DateTime.Now.Ticks - lastHeartbeat); if (tspan.TotalSeconds > 30) { lastHeartbeat = DateTime.Now.Ticks; subscriberChannel.OnHeartBeat(); } } } catch (Exception ex) { logger.Error("Run() Error: " + ex.Message); if (Ativador.IsValidChannel(subscriberChannel)) { Ativador.AbortChannel(subscriberChannel); } } ServicoConectorSTM.epService.EPAdministrator.GetStatement(eplName1).RemoveListener(this); ServicoConectorSTM.epService.EPAdministrator.GetStatement(eplName2).RemoveListener(this); logger.Info("Thread finalizada [" + guid.ToString() + "]"); }
/// <summary> /// /// </summary> private void envioCallbackReportsProc() { List <IDropCopyCallback> toDelete = new List <IDropCopyCallback>(); while (_bKeepRunning) { List <OrdemInfo> lstOrdems = null; lock (qOrdemInfo) { if (qOrdemInfo.Count > 0) { lstOrdems = qOrdemInfo.ToList(); } qOrdemInfo.Clear(); } if (lstOrdems != null) { foreach (OrdemInfo info in lstOrdems) { foreach (IDropCopyCallback subscriber in _lstDropCopySubscribers) { if (Ativador.IsValidChannel(subscriber)) { try { subscriber.OrdemAlterada(info); } catch (Exception ex) { logger.Error(ex); logger.Info("Abortando channel para assinante: " + subscriber.ToString()); Ativador.AbortChannel(subscriber); logger.Info("Removendo assinante da lista: " + subscriber.ToString()); toDelete.Add(subscriber); } } else { logger.Info("Removendo assinante da lista: " + subscriber.ToString()); toDelete.Add(subscriber); } } } // Remove os assinantes abandonados/falhos da lista foreach (IDropCopyCallback subscriber in toDelete) { _lstDropCopySubscribers.Remove(subscriber); } toDelete.Clear(); } else { Thread.Sleep(100); } } }