public virtual void IniciarServico() { logger.Info("*** Iniciando Cotacao MDS para Streamer ***"); MemoriaNegociosDestaque.InicializarDicionarios(); MemoriaResumoCorretoras.InicializarDicionarios(); QueueManager.Instance.Start(); QueueManager.Instance.OnFastQuoteReceived += new MDSMessageReceivedHandler(OnNegocio); lSocket = new MDSPackageSocket(); lSocket.IpAddr = ConfigurationManager.AppSettings["ASConnMDSIp"].ToString(); lSocket.Port = ConfigurationManager.AppSettings["ASConnMDSPort"].ToString(); lSocket.OnFastQuoteReceived += new MDSMessageReceivedHandler(OnNegocio); lSocket.OpenConnection(); _sendMDSLoginMSG(lSocket); socketStreamerServer = new SocketPackage(); socketStreamerServer.OnClientConnected += new ClientConnectedHandler(socketStreamerServer_OnClientConnected); socketStreamerServer.OnRequestReceived += new MessageReceivedHandler(socketStreamerServer_OnRequestReceived); // Ativa thread para retirar mensagens de destaques da fila e enviar para os StreamerServers conectados thDestaquesProcessor = new Thread(new ThreadStart(NegociosDestaqueProcessor)); thDestaquesProcessor.Start(); // Ativa thread para retirar mensagens de leilao da fila e enviar para os StreamerServers conectados thLeilaoProcessor = new Thread(new ThreadStart(AcompanhamentoLeilaoProcessor)); thLeilaoProcessor.Start(); // Ativa thread para retirar mensagens de resumo da fila e enviar para os StreamerServers conectados thResumoProcessor = new Thread(new ThreadStart(ResumoCorretorasProcessor)); thResumoProcessor.Start(); // Ativa thread que monitora conexao com sinal MDS thMonitorConexao = new Thread(new ThreadStart(MonitorConexaoMDS)); thMonitorConexao.Start(); // Ativa thread que trata as mensagens para os Negocios em Destaque thNegociosDestaque = new Thread(new ThreadStart(TrataNegociosDestaque)); thNegociosDestaque.Start(); // Ativa thread que trata as mensagens para o Acompanhamento de Leilao thAcompanhamentoLeilao = new Thread(new ThreadStart(TrataAcompanhamentoLeilao)); thAcompanhamentoLeilao.Start(); // Ativa thread que trata as mensagens para o Resumo de Corretoras thResumoCorretoras = new Thread(new ThreadStart(TrataResumoCorretoras)); thResumoCorretoras.Start(); // Obtem o parametro de maxima diferenca de horario da ultima mensagem com a bolsa // para envio de alertas MaxDifHorarioBolsa = 75; if (ConfigurationManager.AppSettings["MaxDifHorarioBolsa"] != null) { MaxDifHorarioBolsa = Convert.ToDouble(ConfigurationManager.AppSettings["MaxDifHorarioBolsa"].ToString()); } MaxDifHorarioBolsa *= 1000; // Obtem o timeout de mensagem com o MDS, em segundos TimeoutMDS = 300; if (ConfigurationManager.AppSettings["TimeoutMDS"] != null) { TimeoutMDS = Convert.ToDouble(ConfigurationManager.AppSettings["TimeoutMDS"].ToString()); } TimeoutMDS *= 1000; // Obtem a frequencia de geracao da lista de destaques, em segundos FrequenciaGeracaoDestaques = 20; if (ConfigurationManager.AppSettings["FrequenciaGeracaoDestaques"] != null) { FrequenciaGeracaoDestaques = Convert.ToInt32(ConfigurationManager.AppSettings["FrequenciaGeracaoDestaques"].ToString()); } FrequenciaGeracaoDestaques *= 1000; // Define no timer a chamada da montagem de destaques gTimerDestaques = new Timer(new TimerCallback(MontagemListaDestaques), null, 0, FrequenciaGeracaoDestaques); // Obtem a frequencia de geracao da lista de resumo de corretoras, em segundos FrequenciaGeracaoResumo = 25; if (ConfigurationManager.AppSettings["FrequenciaGeracaoResumo"] != null) { FrequenciaGeracaoResumo = Convert.ToInt32(ConfigurationManager.AppSettings["FrequenciaGeracaoResumo"].ToString()); } FrequenciaGeracaoResumo *= 1000; // Define no timer a chamada da montagem de resumo de corretoras gTimerResumo = new Timer(new TimerCallback(MontagemListaResumo), null, 0, FrequenciaGeracaoResumo); // Obtem a frequencia de envio do acompanhamento de leilao, em milisegundos FrequenciaEnviaLeilao = 250; if (ConfigurationManager.AppSettings["FrequenciaEnviaLeilao"] != null) { FrequenciaEnviaLeilao = Convert.ToInt32(ConfigurationManager.AppSettings["FrequenciaEnviaLeilao"].ToString()); } // Define no timer a chamada do envio do acompanhamento de leilao gTimerLeilao = new Timer(new TimerCallback(EnviaAcompanhamentoLeilao), null, 0, FrequenciaEnviaLeilao); if (ConfigurationManager.AppSettings["ListenPort"] != null) { ListenPortStreamer = Convert.ToInt32(ConfigurationManager.AppSettings["ListenPort"].ToString()); } socketStreamerServer.StartListen(ListenPortStreamer); this.Status = ServicoStatus.EmExecucao; }
protected virtual void MonitorConexaoMDS() { int i = 0; int iTrialInterval = 600; logger.Info("Iniciando thread de monitoracao de conexao com MDS"); while (bKeepRunning) { try { // Reconecta a cada 5 min if (!lSocket.IsConectado()) { if (i > iTrialInterval) { _enviaAlertaDesconexao(lSocket.IpAddr, lSocket.Port); logger.Info("Reabrindo conexao com MDS..."); // Não precisa acrescentar outro Handler no OnNegocio, quando ocorre restart do MDS //lSocket.OnFastQuoteReceived += new MDSMessageReceivedHandler(OnNegocio); lSocket.OpenConnection(); _sendMDSLoginMSG(lSocket); i = 0; } else { i++; // Configura intervalos de 1 minuto durante o dia ou // 5 minutos if (DateTime.Now.Hour > 7 && DateTime.Now.Hour < 21) { iTrialInterval = 600; } else { iTrialInterval = 3000; } } } else { if (i > 600) { logger.Info("Conexao com MDS ativa " + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + " LastPkt: [" + QueueManager.Instance.LastNegocioPacket.ToString("dd/MM/yyyy HH:mm:ss.ffff") + "] [" + QueueManager.Instance.LastNegocioMsg + "]"); // Verifica dessincronizacao de sinal if (DateTime.Now.DayOfWeek != DayOfWeek.Saturday && DateTime.Now.DayOfWeek != DayOfWeek.Sunday) { if (DateTime.Now.Hour > 7 && DateTime.Now.Hour < 20) { TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - lSocket.HorarioUltimaSonda.Ticks); if (ts.TotalMilliseconds > MaxDifHorarioBolsa) { _enviaAlertaAtraso(lSocket.IpAddr, lSocket.Port); } } } // Verifica ultima comunicacao com MDS TimeSpan tslastpkt = new TimeSpan(DateTime.Now.Ticks - lSocket.LastPacket.Ticks); if (tslastpkt.TotalMilliseconds > TimeoutMDS) { logger.Warn("Finalizando conexao com MDS por timeout!!!"); lSocket.CloseConnection(); } i = 0; } else { i++; } } Thread.Sleep(100); } catch (Exception ex) { logger.Fatal("MonitorCotacaoMDS(): " + ex.Message, ex); Thread.Sleep(1000); } } logger.Info("Thread de monitoracao de conexao com MDS finalizacao"); }