예제 #1
0
 private bool Request(string msg, ref int retry)
 {
     if (++retry > 5)
     {
         LogRecorder.Error($"数据事件服务(EntityEvent)无法连接!\r\n{msg}");
         return(false);
     }
     try
     {
         lock (this)
         {
             _socket.Request(msg);
         }
         return(true);
     }
     catch (Exception e)
     {
         LogRecorder.Exception(e);
         StationProgram.WriteLine($"【EntityEvent】publish error =>{e.Message}");
         retry++;
         Thread.Sleep(10);
         CreateSocket();
         return(Request(msg, ref retry));
     }
 }
예제 #2
0
        /// <summary>
        ///     取得Socket对象
        /// </summary>
        /// <param name="type"></param>
        /// <param name="socket"></param>
        /// <returns></returns>
        private static bool GetSocket(string type, out RequestSocket socket)
        {
            try
            {
                lock (Publishers)
                {
                    if (Publishers.TryGetValue(type, out socket))
                    {
                        return(true);
                    }
                    var config = StationProgram.GetConfig(type);
                    if (config == null)
                    {
                        StationProgram.WriteLine($"【{type}】connect error =>无法拉取配置");
                        return(false);
                    }

                    socket = new RequestSocket();
                    socket.Options.Identity =
                        StationProgram.Config.StationName.ToAsciiBytes(); //RandomOperate.Generate(8).ToAsciiBytes();
                    socket.Options.ReconnectInterval = new TimeSpan(0, 0, 0, 0, 200);
                    socket.Connect(config.OutAddress);
                    Publishers.Add(type, socket);
                }
            }
            catch (Exception e)
            {
                LogRecorder.Exception(e);
                StationProgram.WriteLine($"【{type}】connect error =>连接时发生异常:{e}");
                socket = null;
                return(false);
            }

            return(true);
        }
예제 #3
0
        /// <summary>
        /// 命令轮询
        /// </summary>
        /// <returns></returns>
        private void PollTask()
        {
            StationProgram.WriteLine($"【{StationName}】poll start");
            var timeout = new TimeSpan(0, 0, 5);

            _inPoll = true;
            while (RunState == StationState.Run)
            {
                try
                {
                    if (!_socket.TryReceiveFrameString(timeout, out var title, out var more) || !more)
                    {
                        continue;
                    }
                    if (!_socket.TryReceiveFrameBytes(out var description, out more) || !more)
                    {
                        continue;
                    }
                    PublishItem item = new PublishItem
                    {
                        Title = title
                    };
                    int idx = 1;
                    while (more)
                    {
                        if (!_socket.TryReceiveFrameString(out var val, out more))
                        {
                            continue;
                        }
                        switch (description[idx++])
                        {
                        case ZeroHelper.zero_pub_sub:
                            item.SubTitle = val;
                            break;

                        case ZeroHelper.zero_pub_publisher:
                            item.Station = val;
                            break;

                        case ZeroHelper.zero_arg:
                            item.Content = val;
                            break;
                        }
                    }
                    _items.Push(item);
                }
                catch (Exception e)
                {
                    StationProgram.WriteLine($"【{StationName}】poll error{e.Message}...");
                    LogRecorder.Exception(e);
                    RunState = StationState.Failed;
                }
            }
            _inPoll = false;
            StationProgram.WriteLine($"【{StationName}】poll stop");
            _items.Save(CacheFileName);
            CloseSocket();
        }
예제 #4
0
 /// <summary>
 /// 执行
 /// </summary>
 /// <param name="station"></param>
 public static void Run(SubStation station)
 {
     station.Close();
     station.Config = StationProgram.GetConfig(station.StationName);
     if (station.Config == null)
     {
         StationProgram.WriteLine($"{station.StationName} not find,try install...");
         StationProgram.InstallApiStation(station.StationName);
         return;
     }
     station.Run();
 }
예제 #5
0
 private void CreateSocket()
 {
     try
     {
         _socket.Options.Identity          = StationProgram.Config.ServiceName.ToAsciiBytes();
         _socket.Options.ReconnectInterval = new TimeSpan(0, 0, 0, 0, 200);
         _socket.Connect(_config.OutAddress);
     }
     catch (Exception e)
     {
         LogRecorder.Exception(e);
         StationProgram.WriteLine($"【EntityEvent】connect error =>{e.Message}");
         throw;
     }
 }
예제 #6
0
        /// <inheritdoc />
        /// <summary>
        /// 命令轮询
        /// </summary>
        /// <returns></returns>
        public sealed override bool Run()
        {
            lock (this)
            {
                if (RunState != StationState.Run)
                {
                    RunState = StationState.Start;
                }
                if (_socket != null)
                {
                    return(false);
                }
            }
            _inPoll = false;

            _socket = new SubscriberSocket();
            try
            {
                _socket.Options.Identity          = RealName.ToAsciiBytes();
                _socket.Options.ReconnectInterval = new TimeSpan(0, 0, 0, 0, 200);
                _socket.Subscribe(Subscribe);
                _socket.Connect(Config.InnerAddress);
            }
            catch (Exception e)
            {
                LogRecorder.Exception(e);
                RunState = StationState.Failed;
                CloseSocket();
                StationProgram.WriteLine($"【{StationName}】connect error =>{e.Message}");
                return(false);
            }
            RunState = StationState.Run;

            _items = MulitToOneQueue <PublishItem> .Load(CacheFileName);

            Task.Factory.StartNew(CommandTask);

            var task1 = Task.Factory.StartNew(PollTask);

            task1.ContinueWith(OnTaskStop);
            while (!_inPoll)
            {
                Thread.Sleep(50);
            }
            StationProgram.WriteLine($"【{StationName}:{RealName}】runing...");
            return(true);
        }
예제 #7
0
        /// <summary>
        ///     发送广播
        /// </summary>
        /// <param name="item"></param>
        /// <param name="socket"></param>
        /// <returns></returns>
        private static bool Send(RequestSocket socket, PublishItem item)
        {
            try
            {
                lock (socket)
                {
                    List <string> frames = new List <string> {
                        item.Title
                    };
                    socket.SendMoreFrame(item.Title);
                    byte[] description = new byte[5];
                    description[0] = (byte)3;
                    description[1] = ZeroHelper.zero_pub_publisher;
                    description[2] = ZeroHelper.zero_pub_sub;
                    description[3] = ZeroHelper.zero_arg;
                    description[4] = ZeroHelper.zero_end;
                    socket.SendMoreFrame(item.Title);
                    socket.SendMoreFrame(description);
                    socket.SendMoreFrame(StationProgram.Config.StationName);
                    socket.SendMoreFrame(item.SubTitle);
                    socket.SendFrame(item.Content);
                    var word = socket.ReceiveFrameString();
                    StationProgram.WriteLine($"【{item.Station}-{item.Title}】{word}");
                    return(word == "ok");
                }
            }
            catch (Exception e)
            {
                LogRecorder.Exception(e);
                StationProgram.WriteLine($"【{item.Station}-{item.Title}】request error =>{e.Message}");
            }

            lock (Publishers)
            {
                Publishers.Remove(item.Station);
            }

            return(false);
        }
예제 #8
0
        /// <summary>
        /// 命令轮询
        /// </summary>
        /// <returns></returns>
        private void OnStop()
        {
            if (StationProgram.State != StationState.Run)
            {
                return;
            }
            bool restart;

            lock (this)
            {
                restart = RunState == StationState.Failed || RunState == StationState.Start;
            }
            if (!restart)
            {
                return;
            }
            StationProgram.WriteLine($"【{StationName}】restart...");
            if (Run())
            {
                return;
            }
            Thread.Sleep(1000);
            OnStop();
        }