Exemplo n.º 1
0
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="name">Имя соединения</param>
        /// <param name="ip">IP адрес, по котором удоступен роутер plaza2</param>
        /// <param name="port">Порт, по котором удоступен роутер plaza2</param>
        /// <param name="credential">Логин и пароль</param>
        /// <param name="secondSubconnections">Потоки и паблишеры</param>
        /// <param name="firstSubconnections">Потоки и паблишеры</param>
        /// <param name="logger">Логгер</param>
        /// <param name="callback"></param>
        public CGateConnection(
            string name,
            IPAddress ip,
            ushort port,
            NetworkCredential credential,
            IEnumerable <CGateSubconnection> firstSubconnections,
            IEnumerable <CGateSubconnection> secondSubconnections,
            ICGateLogger logger,
            ICGateConnectionCallback callback)
        {
            _name     = name;
            _logger   = logger;
            _callback = callback;

            if (!string.IsNullOrEmpty(credential.UserName) && !string.IsNullOrEmpty(credential.Password))
            {
                _connectionString = $"p2tcp://{ip}:{port};app_name={credential.UserName};local_pass={credential.Password};";
            }
            else
            {
                _connectionString = $"p2tcp://{ip}:{port};";
            }

            _streamsAndPublishers1 = new List <CGateSubconnection>(firstSubconnections.Where(_ => _ != null));
            _streamsAndPublishers2 = secondSubconnections != null
                ? new List <CGateSubconnection>(secondSubconnections.Where(_ => _ != null))
                : null;

            _streamsAndPublishers1.ForEach(_ => _.StateMightBeenChanged += StateMightBeenChangedHandler);

            _logger.Debug($"{_name} connection string is: {_connectionString}");

            callback.RegisterConnection(this);
        }
Exemplo n.º 2
0
        public void Publish(CGateMessage message)
        {
            if (!_configuredWell)
            {
                return;
            }

            using (var messageToPost = _publisher.NewMessage(MessageKeyType.KeyName, message.MessageTypeName))
            {
                var dataMessage = (DataMessage)messageToPost;

                message.CopyToDataMessage(dataMessage);

                var extIdObj = dataMessage["ext_id"];
                if (extIdObj != null)
                {
                    dataMessage.UserId = (uint)extIdObj.asInt();
                }
                else
                {
                    dataMessage.UserId = message.UserId;
                }

                _publisher.Post(messageToPost, PublishFlag.NeedReply);
                _logger.Debug($"Publish: UserId={dataMessage.UserId}; Message={message}");
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Обработка события возможного изменения состояния потока
        /// </summary>
        private void StateMightBeenChangedHandler(string streamName, StreamRegime regime)
        {
            _logger.Info($"Stream {streamName} state changed to {regime}");
            var lockTaken = false;

            try
            {
                _logger.Debug("Trying to lock spinLock");
                _spinLock.Enter(ref lockTaken);
                _logger.Debug("Changing needToCheckSubconnectionsState to true");
            }
            finally
            {
                if (lockTaken)
                {
                    _logger.Debug("SpinLock was taken and");
                    _spinLock.Exit();
                }
                else
                {
                    _logger.Debug("Spin lock wasn't taken and needToCheckSubconnectionsState != true");
                }
            }
        }
Exemplo n.º 4
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;
            }
        }