示例#1
0
        public void Reset()
        {
            lastMsgSeqNum = 0;
            currentFeed   = -1;
            sentMsgSeqNum = 0;

            logger.Warn("Clearing all queues");

            QuickFix.FIX44.Message message = null;

            while (mainInboundQ.TryDequeue(out message))
            {
                ;
            }

            for (int i = 0; i < 10; i++)
            {
                while (inboundQueues[i].TryDequeue(out message))
                {
                    ;
                }
                while (intermediateQueues[i].TryDequeue(out message))
                {
                    ;
                }
            }

            while (this.mainOutboundQ.TryDequeue(out message))
            {
                ;
            }
        }
示例#2
0
        protected static string JsonRepresentation(QuickFix.FIX44.Message message)
        {
            JsonSerializerSettings settings = new JsonSerializerSettings {
                NullValueHandling = NullValueHandling.Ignore
            };
            var json = JsonConvert.SerializeObject(message, settings);

            return(json);
        }
示例#3
0
 /// <summary>
 /// Enfileira a mensagem pra despacho final
 /// </summary>
 /// <param name="message"></param>
 private void enqueueToOutput(QuickFix.FIX44.Message message)
 {
     try
     {
         mainOutboundQ.Enqueue(message);
     }
     catch (Exception ex)
     {
         logger.Error("enqueueToOutput: " + ex.Message, ex);
     }
 }
示例#4
0
 /// <summary>
 /// Enfileira a mensagem para as filas intermediarias
 /// </summary>
 /// <param name="queueNumber"></param>
 /// <param name="message"></param>
 private void enqueueToFire(int queueNumber, QuickFix.FIX44.Message message)
 {
     try
     {
         intermediateQueues[queueNumber].Enqueue(message);
     }
     catch (Exception ex)
     {
         logger.Error("enqueueToFire: " + ex.Message, ex);
     }
 }
示例#5
0
        /// <summary>
        /// Thread de despacho final das mensagems
        /// </summary>
        private void mainOutboundProc()
        {
            logger.Info("Iniciando thread de despacho final");

            long lastLog = 0;

            while (_bKeepRunning)
            {
                try
                {
                    if (currentFeed < 0)
                    {
                        Thread.Sleep(250);
                        continue;
                    }

                    QuickFix.FIX44.Message message = null;
                    if (mainOutboundQ.TryDequeue(out message))
                    {
                        int    msgSeqNum = message.Header.GetInt(QuickFix.Fields.Tags.MsgSeqNum);
                        string msgType   = message.Header.GetString(QuickFix.Fields.Tags.MsgType);

                        logger.Debug("Dispatching Message [" + message.Header.GetInt(QuickFix.Fields.Tags.MsgSeqNum) + "] type [" + message.Header.GetString(QuickFix.Fields.Tags.MsgType) + "]");

                        if (UnderFIXMessageFire != null)
                        {
                            FIXMachineGunEventEventArgs args = new FIXMachineGunEventEventArgs();
                            args.Message = message;

                            UnderFIXMessageFire(this, args);
                        }

                        if (MDSUtils.shouldLog(lastLog))
                        {
                            logger.InfoFormat("Mensagens FIX na fila mainOutboundQ: {0}", mainOutboundQ.Count);
                            lastLog = DateTime.UtcNow.Ticks;
                        }

                        continue;
                    }

                    Thread.Sleep(25);
                }
                catch (Exception ex)
                {
                    logger.Error("mainOutboundProc: " + ex.Message, ex);
                }
            }

            logger.Info("Fim da thread mainOutboundProc");
        }
示例#6
0
        public void EnqueueMessage(QuickFix.FIX44.Message message)
        {
            try
            {
                // - set the initial feed
                if (currentFeed < 0)
                {
                    int lastDigit = message.Header.GetInt(QuickFix.Fields.Tags.MsgSeqNum) % 10;
                    currentFeed = lastDigit;
                }

                mainInboundQ.Enqueue(message);
            }
            catch (Exception ex)
            {
                logger.Error("EnqueueMessage: " + ex.Message, ex);
            }
        }
示例#7
0
        /// <summary>
        /// Thread de convergencia das mensagems
        /// Pega as mensagens splitadas na sequencia correta a partir
        /// da fila intermediaria
        /// </summary>
        private void sendBulletsProc()
        {
            logger.Info("Iniciando thread de convergencia");

            long [] lastLogs = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

            while (_bKeepRunning)
            {
                try
                {
                    if (currentFeed < 0)
                    {
                        Thread.Sleep(250);
                        continue;
                    }

                    QuickFix.FIX44.Message message = null;
                    if (intermediateQueues[currentFeed].TryDequeue(out message))
                    {
                        int    msgSeqNum = message.Header.GetInt(QuickFix.Fields.Tags.MsgSeqNum);
                        string msgType   = message.Header.GetString(QuickFix.Fields.Tags.MsgType);

                        if (sentMsgSeqNum != 0)
                        {
                            if (msgSeqNum < sentMsgSeqNum || msgSeqNum > sentMsgSeqNum + 1)
                            {
                                logger.FatalFormat("Deu merrda, capitao {0}<=>{1}", msgSeqNum, sentMsgSeqNum);
                                continue;
                            }
                        }

                        sentMsgSeqNum = msgSeqNum;

                        // Qdo receber o marcador, troca a fila de leitura
                        if (msgType.Equals(QuickFix.FIX44.TestRequest.MsgType))
                        {
                            currentFeed++;
                            if (currentFeed > 9)
                            {
                                currentFeed = 0;
                            }

                            continue;
                        }

                        logger.Debug("Converging Message [" + message.Header.GetInt(QuickFix.Fields.Tags.MsgSeqNum) + "] type [" + message.Header.GetString(QuickFix.Fields.Tags.MsgType) + "]");

                        enqueueToOutput(message);

                        if (MDSUtils.shouldLog(lastLogs[currentFeed]))
                        {
                            logger.InfoFormat("Mensagens FIX na fila intermediaria {0}: {1}", currentFeed, intermediateQueues[currentFeed].Count);
                            lastLogs[currentFeed] = DateTime.UtcNow.Ticks;
                        }

                        continue;
                    }

                    Thread.Sleep(25);
                }
                catch (Exception ex)
                {
                    logger.Error("sendBulletsProc: " + ex.Message, ex);
                }
            }

            logger.Info("Fim da thread sendBullets");
        }
示例#8
0
        /// <summary>
        ///
        /// </summary>
        private void messageSplitterProc(object param)
        {
            int me = (int)param;

            logger.InfoFormat("Iniciando thread {0} de splitting", me);

            long lastLog = 0;

            while (_bKeepRunning)
            {
                try
                {
                    if (currentFeed < 0)
                    {
                        Thread.Sleep(250);
                        continue;
                    }

                    QuickFix.FIX44.Message message = null;
                    if (inboundQueues[me].TryDequeue(out message))
                    {
                        int    msgSeqNum = message.Header.GetInt(QuickFix.Fields.Tags.MsgSeqNum);
                        string msgType   = message.Header.GetString(QuickFix.Fields.Tags.MsgType);
                        int    lastDigit = msgSeqNum % 10;

                        if (lastDigit != Convert.ToInt32(msgSeqNum.ToString().AsEnumerable().Last().ToString()))
                        {
                            logger.Error("PQP arrendondamento FDP");
                        }

                        if (!msgType.Equals(QuickFix.FIX44.TestRequest.MsgType))
                        {
                            logger.Debug("Splitting Message [" + message.Header.GetInt(QuickFix.Fields.Tags.MsgSeqNum) + "] type [" + message.Header.GetString(QuickFix.Fields.Tags.MsgType) + "]");

                            List <QuickFix.FIX44.Message> lstSplitted = FIXUtils.splitMessage(message, 0, null);

                            foreach (QuickFix.FIX44.Message splittedmsg in lstSplitted)
                            {
                                enqueueToFire(me, splittedmsg);
                            }
                        }
                        else
                        {
                            logger.DebugFormat("inboundQueue[{0}] recebeu TestRequest, skipping", me);
                        }

                        // Envia o marcador de final da mensagem
                        QuickFix.FIX44.TestRequest mark = new QuickFix.FIX44.TestRequest();
                        mark.Header.SetField(new QuickFix.Fields.MsgSeqNum(msgSeqNum));
                        enqueueToFire(me, mark);

                        if (MDSUtils.shouldLog(lastLog))
                        {
                            logger.InfoFormat("Mensagens para splitting FIX na fila {0}: {1}", me, inboundQueues[me].Count);
                            lastLog = DateTime.UtcNow.Ticks;
                        }
                        continue;
                    }

                    Thread.Sleep(25);
                }
                catch (Exception ex)
                {
                    logger.Error("messageSplitterProc: " + ex.Message, ex);
                }
            }
        }
示例#9
0
        /// <summary>
        ///
        /// </summary>
        private void mainInboundQProc()
        {
            logger.Info("Iniciando thread de processamento da fila principal de entrada");
            long lastLog = 0;

            while (_bKeepRunning)
            {
                try
                {
                    if (currentFeed < 0)
                    {
                        Thread.Sleep(250);
                        continue;
                    }

                    QuickFix.FIX44.Message message = null;
                    if (mainInboundQ.TryDequeue(out message))
                    {
                        int msgSeqNum = message.Header.GetInt(QuickFix.Fields.Tags.MsgSeqNum);
                        int lastDigit = msgSeqNum % 10;

                        // Se ha um intervalo entre as mensagens
                        // preenche com marcadores para forcar a
                        // troca da fila
                        if (lastMsgSeqNum > 0)
                        {
                            if (msgSeqNum > (lastMsgSeqNum + 1))
                            {
                                logger.InfoFormat("Filling gap [{0}]->[{1}]", lastMsgSeqNum + 1, msgSeqNum);

                                for (int fillSeqNum = lastMsgSeqNum + 1; fillSeqNum < msgSeqNum; fillSeqNum++)
                                {
                                    int markLastDigit = fillSeqNum % 10;

                                    // Envia o marcador de final da mensagem
                                    QuickFix.FIX44.TestRequest mark = new QuickFix.FIX44.TestRequest();
                                    mark.Header.SetField(new QuickFix.Fields.MsgSeqNum(fillSeqNum));

                                    inboundQueues[markLastDigit].Enqueue(mark);
                                }
                            }
                        }

                        inboundQueues[lastDigit].Enqueue(message);
                        lastMsgSeqNum = msgSeqNum;

                        if (MDSUtils.shouldLog(lastLog))
                        {
                            logger.Info("Mensagens FIX para processar na fila (mainInboudQ): " + mainInboundQ.Count);
                            lastLog = DateTime.UtcNow.Ticks;
                        }

                        continue;
                    }

                    Thread.Sleep(25);
                }
                catch (Exception ex)
                {
                    logger.Error("mainInboundQProc: " + ex.Message, ex);
                }
            }
        }