Exemplo n.º 1
0
        public override void Open()
        {
            if (!_configuredWell)
            {
                return;
            }

            try
            {
                _publisher.Open();
            }
            catch (CGateException exception)
            {
                _logger.Error(exception, $"{Name}: CGateException: ErrCode={exception.ErrCode}, Message={exception.Message}");
                throw;
            }
            catch (Exception exception)
            {
                _logger.Error(exception, $"{Name}: Exception: {exception.Message}");
                throw;
            }

            _logger.Info($"{Name}: Publisher is opened");

            _stream.Open();
        }
Exemplo n.º 2
0
        private int Handler(Connection conn, Listener listener, Message msg)
        {
            try
            {
                if (!_configuredWell)
                {
                    return(-1);
                }

                if (Name == "FORTS_FUTTRADE_REPL" && SchemeFileName.Contains("fut_trades.ini"))
                {
                    _logger.Info($"#FTR: {msg.GetType()}");
                }

                if (Name == "FORTS_OPTTRADE_REPL" && SchemeFileName.Contains("opt_trades.ini"))
                {
                    _logger.Info($"#OTR: {msg.GetType()}");
                }

                // если получены потоковые данные, то процессим их специфическим для каждого потока конвертером
                if (msg.Type == MessageType.MsgStreamData)
                {
                    var message = Converter.ConvertToAdapterMessage((StreamDataMessage)msg);
                    message.StreamRegime = Regime;
                    message.StreamName   = Name;
                    _callback.HandleMessage(this, message);
                    _logger.Trace("{0}", message);
                }
                else if (msg.Type == MessageType.MsgData)
                {
                    var dm      = (DataMessage)msg;
                    var message = Converter.ConvertToAdapterMessage(dm);
                    message.StreamRegime = Regime;
                    message.StreamName   = Name;
                    message.UserId       = dm.UserId;
                    _callback.HandleMessage(this, message);
                    _logger.Debug($"UserId={((DataMessage)msg).UserId}; Message={message}");
                }

                // если это общее для всех потоков сообщение, то процессим его в базовом классе
                else
                {
                    ProcessMessagesCommonForAllStreams(msg);
                }

                return(0);
            }
            catch (Exception exception)
            {
                _logger.Error(exception, $"{NameForLogging}: Exception: {exception.Message}");
                throw;
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Конструктор для создания потока репликации общей информации
        /// </summary>
        /// <param name="name">Название потока</param>
        /// <param name="streamType">Тип потока</param>
        /// <param name="schemeFileName">Имя файла схемы (ini)</param>
        /// <param name="schemeName">Имя схемы</param>
        /// <param name="converter">Конвертер сообщений</param>
        /// <param name="callback">Интерфейс который нужно дёргать для передачи ему полученных сообщений</param>
        /// <param name="logger">Логгер</param>
        /// <param name="dependOnStreams">Потоки, от которых зависит данный поток. Сначала нужно дождаться их подключения, потом подключаться самому</param>
        /// <param name="mode">Режим, в котором должен работать поток</param>
        /// <param name="useReplStateWhenReconnect">Использовать ли replstate при переподключении или стартовать с нуля</param>
        /// <param name="transactional">Признак того, что поток транзакционный, то есть в нем приходит OSCMы и сделки</param>
        public CGateStream(
            string name,
            CGateStreamType streamType,
            string schemeFileName,
            string schemeName,
            IMessageConverter converter,
            ICGateStreamCallback callback,
            ICGateLogger logger,
            CGateStream[] dependOnStreams = null,
            string mode = "",
            bool useReplStateWhenReconnect = true,
            bool transactional             = false)
        {
            _callback = callback;
            _logger   = logger;

            Name             = name;
            StreamType       = streamType;
            SchemeFileName   = schemeFileName;
            SchemeName       = schemeName;
            Converter        = converter;
            Transactional    = transactional;
            _dependOnStreams = dependOnStreams;

            if (!string.IsNullOrEmpty(mode))
            {
                _mode = mode;
            }

            _useReplStateWhenReconnect = useReplStateWhenReconnect;

            if (!File.Exists(schemeFileName))
            {
                _logger.Error($"File {schemeFileName} doesn't exist, stream {Name} won't be started");
                _configuredWell = false;
                return;
            }

            _callback.RegisterStream(this);
            _configuredWell = true;
        }
Exemplo n.º 4
0
        public CGatePublisher(
            string name,
            string schemeFileName,
            string schemeName,
            IMessageConverter converter,
            ICGateStreamCallback callback,
            ICGateLogger logger)
        {
            _logger = logger;

            Name           = name;
            SchemeFileName = schemeFileName;
            SchemeName     = schemeName;

            if (!File.Exists(schemeFileName))
            {
                _logger.Error($"File {schemeFileName} doesn't exist, publisher {Name} won't be started");
                _configuredWell = false;
                return;
            }

            _stream         = new CGateStream(Name, CGateStreamType.FortsMessages, converter, callback, _logger);
            _configuredWell = true;
        }
Exemplo n.º 5
0
        public void Open()
        {
            try
            {
                _connection = new Connection(_connectionString);

                foreach (var stream in _streamsAndPublishers1)
                {
                    stream.SetConnection(_connection);
                }

                if (_streamsAndPublishers2 != null)
                {
                    foreach (var stream in _streamsAndPublishers2)
                    {
                        stream.SetConnection(_connection);
                    }
                }

                _logger.Info($"{_name} connection: opening...");
                _connection.Open("");

                Interlocked.Exchange(ref _state, STATE_ON);
                _connectionPollingTask = Task.Factory.StartNew(ProcessConnection, TaskCreationOptions.LongRunning);
            }
            catch (CGateException e)
            {
                _logger.Error(e, $"Failed to open connection: [E_{e.ErrCode:G}] {e.Message}");
                _connection = null;
                throw;
            }
            catch (Exception e)
            {
                _logger.Error(e, $"Failed to open connection: {e.Message}");
                _connection = null;
                throw;
            }
        }