예제 #1
0
        protected virtual void TrataNegociosDestaque()
        {
            bool bWait = false;

            logger.Info("Iniciando thread para tratar mensagens de Negocios em Destaque");
            while (bKeepRunning)
            {
                try
                {
                    List <NegocioInfo> filaTemp = new List <NegocioInfo>();

                    lock (filaNegociosDestaque)
                    {
                        filaTemp = filaNegociosDestaque.ToList();
                        filaNegociosDestaque.Clear();
                    }

                    foreach (NegocioInfo negocio in filaTemp)
                    {
                        if (negocio.Status == 2)
                        {
                            MemoriaNegociosDestaque.ContabilizaNegocio(negocio);
                        }
                    }

                    lock (filaNegociosDestaque)
                    {
                        if (filaNegociosDestaque.Count == 0)
                        {
                            bWait = true;
                        }
                        else
                        {
                            bWait = false;
                        }
                    }

                    if (bWait)
                    {
                        Thread.Sleep(250);
                    }

                    Thread.Sleep(100);
                }
                catch (Exception ex)
                {
                    logger.Fatal("TrataNegociosDestaque(): " + ex.Message, ex);
                    Thread.Sleep(1000);
                }
            }

            logger.Info("Finalizando thread para tratar mensagens de Negocios em Destaque");
        }
예제 #2
0
        protected void MontagemListaDestaques(object state)
        {
            // Evita que mais que uma instância seja executada pelo timer
            if (montandoListaDestaques)
            {
                return;
            }

            montandoListaDestaques = true;
            MemoriaNegociosDestaque.ListaRanking(filaDestaquesParaStreamer, null);
            montandoListaDestaques = false;
        }
예제 #3
0
        void socketStreamerServer_OnRequestReceived(object sender, MessageEventArgs args)
        {
            try
            {
                DadosRequisicaoInfo req = JsonConvert.DeserializeObject <DadosRequisicaoInfo>(args.Message);

                if (req.tipo.Equals(TIPO_REQUISICAO_NEGOCIOS_DESTAQUE))
                {
                    logger.Info("Enviando snapshot de Negocios em Destaque para cliente[" + args.ClientNumber.ToString() + "]");
                    MemoriaNegociosDestaque.ListaRanking(filaDestaquesParaStreamer, args.ClientSocket);
                }
                else if (req.tipo.Equals(TIPO_REQUISICAO_ACOMPANHAMENTO_LEILAO))
                {
                    logger.Info("Enviando snapshot de Acompanhamento de Leilao para cliente[" + args.ClientNumber.ToString() + "]");
                    MemoriaAcompanhamentoLeilao.MontagemAcompanhamentoLeilaoStreamer(args.ClientSocket);
                    MemoriaAcompanhamentoLeilao.EnviaAcompanhamentoLeilaoStreamer(filaLeilaoParaStreamer, FrequenciaEnviaLeilao);
                }
                else if (req.tipo.Equals(TIPO_REQUISICAO_RESUMO_CORRETORAS))
                {
                    if (!((IList <string>)MemoriaResumoCorretoras.SEGMENTOS_MERCADO).Contains(req.instrumento))
                    {
                        if (req.acao.Equals(MDS_ACAO_ASSINAR))
                        {
                            MemoriaResumoCorretoras.AssinarRankingPorInstrumento(req.instrumento);
                            MemoriaResumoCorretoras.ListaRankingPorInstrumentoOuCorretora(filaResumoParaStreamer, args.ClientSocket, req.instrumento);
                        }
                        else
                        {
                            MemoriaResumoCorretoras.DesassinarRankingPorInstrumento(req.instrumento);
                        }
                    }
                    else
                    {
                        logger.Info("Enviando snapshot de Resumo de Corretoras para cliente[" + args.ClientNumber.ToString() + "]");
                        MemoriaResumoCorretoras.ListaRanking(filaResumoParaStreamer, args.ClientSocket);
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error("socketStreamerServer_OnRequestReceived(): " + ex.Message, ex);
            }
        }
예제 #4
0
        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;
        }
예제 #5
0
 public string ReceberNegociosDestaque(string segmentoMercado, TipoDestaqueEnum tipoDestaque)
 {
     return(MemoriaNegociosDestaque.ReceberNegociosDestaque(segmentoMercado, tipoDestaque));
 }