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)); } }
/// <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); }
/// <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(); }
/// <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(); }
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; } }
/// <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); }
/// <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); }
/// <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(); }