/// <summary> /// 发送广播 /// </summary> /// <param name="description"></param> /// <param name="title"></param> /// <param name="content"></param> /// <param name="socket"></param> /// <returns></returns> public static bool Publish(this ZSocket socket, byte[] description, string title, byte[] content) { if (socket == null) { return(false); } try { if (!socket.SendTo(description, title.ToZeroBytes(), GlobalContext.RequestInfo.RequestId.ToZeroBytes(), ZeroApplication.Config.RealName.ToZeroBytes(), content)) { ZeroTrace.WriteError("Pub", socket.LastError.Text, socket.Connects.LinkToString(','), title); return(false); } var result = socket.ReceiveString(); return(result.InteractiveSuccess && result.State == ZeroOperatorStateType.Ok); } catch (Exception e) { ZeroTrace.WriteException("Pub", e, socket.Connects.LinkToString(','), $"Socket Ptr:{socket.SocketPtr}"); return(false); } }
/// <summary> /// 系统启动时调用 /// </summary> internal static void OnZeroStart() { Debug.Assert(!HaseActiveObject); using (OnceScope.CreateScope(ZeroObjects, ResetObjectActive)) { ZeroTrace.SystemLog("[OnZeroStart>>"); foreach (var obj in ZeroObjects.Values.ToArray()) { try { ZeroTrace.SystemLog(obj.Name, "*Start"); obj.OnZeroStart(); } catch (Exception e) { ZeroTrace.WriteException(obj.Name, e, "*Start"); } } WaitAllObjectSemaphore(); } SystemManager.Instance.HeartReady(); ApplicationState = StationState.Run; RaiseEvent(ZeroNetEventType.AppRun); ZeroTrace.SystemLog("<<OnZeroStart]"); }
/// <summary> /// 发送广播 /// </summary> /// <param name="title"></param> /// <param name="socket"></param> /// <returns></returns> public static bool Publish(this ZSocket socket, string title) { if (socket == null) { return(false); } try { if (!socket.SendTo(PubDescriptionEmpty, ToZeroBytes(title), ToZeroBytes(ApiContext.RequestContext.RequestId), ToZeroBytes(ZeroApplication.Config.RealName)) ) { ZeroTrace.WriteError("Pub", socket.LastError.Text, socket.Connects.LinkToString(','), title); return(false); } var result = socket.ReceiveString(); return(result.InteractiveSuccess && result.State == ZeroOperatorStateType.Ok); } catch (Exception e) { ZeroTrace.WriteException("Pub", e, socket.Connects.LinkToString(','), $"Socket Ptr:{socket.SocketPtr}"); return(false); } }
/// <summary> /// 心跳 /// </summary> internal static void OnHeartbeat() { if (!InRun) { return; } using (OnceScope.CreateScope(ZeroObjects)) { if (!InRun) { return; } SystemManager.Instance.Heartbeat(); foreach (var obj in ActiveObjects.ToArray()) { try { obj.OnHeartbeat(); } catch (Exception e) { ZeroTrace.WriteException(obj.Name, e, "OnHeartbeat"); } } ; } }
/// <summary> /// 系统关闭时调用 /// </summary> internal static void OnZeroEnd() { RaiseEvent(ZeroNetEventType.AppStop); using (OnceScope.CreateScope(ZeroObjects)) { ZeroTrace.SystemLog("[OnZeroEnd>>"); SystemManager.Instance.HeartLeft(); ApplicationState = StationState.Closing; if (HaseActiveObject) { Parallel.ForEach(ActiveObjects.ToArray(), obj => { try { ZeroTrace.SystemLog(obj.Name, "*Close"); obj.OnZeroEnd(); } catch (Exception e) { ZeroTrace.WriteException(obj.Name, e, "*Close"); } }); WaitAllObjectSemaphore(); } GC.Collect(); ApplicationState = StationState.Closed; ZeroTrace.SystemLog("<<OnZeroEnd]"); } }
/// <summary> /// 接收文本 /// </summary> /// <param name="socket"></param> /// <param name="showError">是否显示错误</param> /// <returns></returns> public static ZeroResultData ReceiveString(this ZSocket socket, bool showError = false) { ZMessage messages; try { if (!socket.Recv(out messages)) { if (showError) { ZeroTrace.WriteError("Receive", socket.Connects.LinkToString(','), socket.LastError.Text); } return(new ZeroResultData { State = ZeroOperatorStateType.LocalRecvError, ZmqError = socket.LastError }); } } catch (Exception e) { ZeroTrace.WriteException("Receive", e, socket.Connects.LinkToString(',')); return(new ZeroResultData { State = ZeroOperatorStateType.LocalRecvError, Exception = e }); } return(Unpack(messages, showError)); }
/// <summary> /// 命令解包 /// </summary> /// <param name="showError"></param> /// <param name="messages"></param> /// <returns></returns> public static ZeroResultData Unpack(this ZMessage messages, bool showError = false) { try { var description = messages[0].Read(); if (description.Length == 0) { if (showError) { ZeroTrace.WriteError("Unpack", "LaoutError", description.LinkToString(p => p.ToString("X2"), "")); } return(new ZeroResultData { State = ZeroOperatorStateType.FrameInvalid, Message = "网络格式错误" }); } int end = description[0] + 1; if (end != messages.Count) { if (showError) { ZeroTrace.WriteError("Unpack", "LaoutError", $"FrameSize{messages.Count}", description.LinkToString(p => p.ToString("X2"), "")); } return(new ZeroResultData { State = ZeroOperatorStateType.FrameInvalid, Message = "网络格式错误" }); } var result = new ZeroResultData { InteractiveSuccess = true, State = (ZeroOperatorStateType)description[1] }; for (int idx = 1; idx < end; idx++) { result.Add(description[idx + 1], Encoding.UTF8.GetString(messages[idx].Read())); } return(result); } catch (Exception e) { ZeroTrace.WriteException("Unpack", e); return(new ZeroResultData { State = ZeroOperatorStateType.LocalRecvError, Exception = e }); } finally { messages.Dispose(); } }
/// <summary> /// 接收文本 /// </summary> /// <param name="socket"></param> /// <returns></returns> public static ZeroResultData <byte[]> ReceiveUnknow(this ZSocket socket) { //tryCnt = 0; ZMessage messages; try { if (!socket.Recv(out messages)) { ZeroTrace.WriteError("Receive", socket.Connects.LinkToString(','), socket.LastError.Text); return(new ZeroResultData <byte[]> { State = ZeroOperatorStateType.LocalRecvError, ZmqError = socket.LastError }); } } catch (Exception e) { ZeroTrace.WriteException("Receive", e, socket.Connects.LinkToString(',')); return(new ZeroResultData <byte[]> { State = ZeroOperatorStateType.LocalRecvError, Exception = e }); } try { var result = new ZeroResultData <byte[]> { InteractiveSuccess = true, State = ZeroOperatorStateType.Ok }; foreach (var frame in messages) { result.Add(ZeroFrameType.BinaryValue, frame.Read()); } return(result); } catch (Exception e) { ZeroTrace.WriteException("Receive", e, socket.Connects.LinkToString(','), $"FrameSize{messages.Count}, Socket Ptr:{ socket.SocketPtr}."); return(new ZeroResultData <byte[]> { State = ZeroOperatorStateType.LocalRecvError, Exception = e }); } finally { messages.Dispose(); } }
private void CheckCall(IZmqPool pool, int idx) { if (!pool.CheckIn(idx, out var message)) { return; } try { using (message) { if (!ZeroApplication.ZerCenterIsRun) { using (var res = new ZMessage { message[1].Duplicate(), new ZFrame(NetErrorDescription) }) { pool.Sockets[idx].SendMessage(res, out var error); } } bool success; using (ZMessage clone = new ZMessage()) { for (var index = 1; index < message.Count; index++) { clone.Add(message[index].Duplicate()); } success = pool.Sockets[idx + 1].SendMessage(clone, out var error2); } if (!success) { using (var res = new ZMessage { message[1].Duplicate(), new ZFrame(NetErrorDescription) }) { pool.Sockets[idx].SendMessage(res, out var error); } } else { ++WaitCount; } } } catch (Exception e) { ZeroTrace.WriteException("ConnectionProxy", e, "CheckCall"); } }
private void CheckCall(IZmqPool pool) { if (!pool.CheckIn(0, out var message)) { return; } try { using (message) { if (!ZeroApplication.ZerCenterIsRun) { using (var res = new ZMessage { message[1].Duplicate(), new ZFrame(NetErrorDescription) }) { _inprocPollSocket.SendMessage(res, out _); } } bool success; using (ZMessage clone = new ZMessage()) { for (var index = 1; index < message.Count; index++) { clone.Add(message[index].Duplicate()); } success = _callPollSocket.SendMessage(clone, out _); } if (!success) { using (var res = new ZMessage { message[1].Duplicate(), new ZFrame(NetErrorDescription) }) { _inprocPollSocket.SendMessage(res, out _); } } else { ++WaitCount; } } } catch (Exception e) { ZeroTrace.WriteException(Config.Name, e, "CheckCall"); } }
/// <summary> /// 站点心跳 /// </summary> /// <param name="name"></param> /// <param name="content"></param> private static void station_state(string name, string content) { //ZeroTrace.WriteInfo("station_state",name); if (!ZeroApplication.Config.TryGetConfig(name, out var config)) { return; } try { ZeroApplication.InvokeEvent(ZeroNetEventType.CenterStationState, content, config); } catch (Exception e) { LogRecorder.Exception(e); ZeroTrace.WriteException("station_state", e, name, content); } }
/// <summary> /// 刷新配置 /// </summary> /// <param name="json"></param> public bool FlushConfigs(string json) { try { var configs = JsonConvert.DeserializeObject <List <StationConfig> >(json); foreach (var config in configs) { AddStation(config); } ZeroTrace.SystemLog("LoadAllConfig", json); return(true); } catch (Exception e) { ZeroTrace.WriteException("LoadAllConfig", e, json); return(false); } }
/// <summary> /// 注销时调用 /// </summary> internal static void OnZeroDestory() { if (!Monitor.TryEnter(ZeroObjects)) { return; } ZeroTrace.SystemLog("[OnZeroDestory>>"); RaiseEvent(ZeroNetEventType.AppEnd); using (OnceScope.CreateScope(ZeroObjects)) { var array = ZeroObjects.Values.ToArray(); ZeroObjects.Clear(); Parallel.ForEach(array, obj => { try { ZeroTrace.SystemLog(obj.Name, "*Destory"); obj.OnZeroDestory(); } catch (Exception e) { ZeroTrace.WriteException(obj.Name, e, "*Destory"); } }); GC.Collect(); ZeroTrace.SystemLog("<<OnZeroDestory]"); ZeroTrace.SystemLog("[OnZeroDispose>>"); Parallel.ForEach(array, obj => { try { ZeroTrace.SystemLog(obj.Name, "*Dispose"); obj.Dispose(); } catch (Exception e) { ZeroTrace.WriteException(obj.Name, e, "*Dispose"); } }); ZeroTrace.SystemLog("<<OnZeroDispose]"); } }
/// <summary> /// 系统启动时调用 /// </summary> internal static void OnStationStateChanged(StationConfig config) { using (OnceScope.CreateScope(ZeroObjects)) { ZeroTrace.WriteLine("[OnStationStateChanged>>"); Parallel.ForEach(ActiveObjects.ToArray(), obj => { try { obj.OnStationStateChanged(config); } catch (Exception e) { ZeroTrace.WriteException(obj.Name, e, "OnStationStateChanged"); } }); ZeroTrace.WriteLine("<<OnStationStateChanged]"); } }
/// <summary> /// 注册对象 /// </summary> public static bool RegistZeroObject(IZeroObject obj) { if (obj.GetType().IsSubclassOf(typeof(ApiStation))) { ZeroDiscover.DiscoverApiDocument(obj.GetType()); } using (OnceScope.CreateScope(ZeroObjects)) { if (ZeroObjects.ContainsKey(obj.Name)) { return(false); } ZeroTrace.SystemLog("RegistZeroObject", obj.Name); ZeroObjects.Add(obj.Name, obj); if (ApplicationState >= StationState.Initialized) { try { obj.OnZeroInitialize(); ZeroTrace.SystemLog(obj.Name, "Initialize"); } catch (Exception e) { ZeroTrace.WriteException(obj.Name, e, "Initialize"); } } if (!CanDo) { return(true); } try { ZeroTrace.SystemLog(obj.Name, "Start"); obj.OnZeroStart(); } catch (Exception e) { ZeroTrace.WriteException(obj.Name, e, "Start"); } } return(true); }
/// <summary> /// 系统启动时调用 /// </summary> internal static void OnStationStateChanged(StationConfig config) { using (OnceScope.CreateScope(ZeroObjects)) { ZeroTrace.SystemLog($"[OnStationStateChanged({config.StationName})>>"); Parallel.ForEach(ActiveObjects.Where(p => string.Equals(config.StationName, p.StationName, StringComparison.OrdinalIgnoreCase)).ToArray(), obj => { try { obj.OnStationStateChanged(config); } catch (Exception e) { ZeroTrace.WriteException(obj.Name, e, "OnStationStateChanged"); } }); ZeroTrace.SystemLog($"<<OnStationStateChanged({config.StationName})]"); } }
/// <summary> /// 系统启动时调用 /// </summary> internal static void OnZeroInitialize() { using (OnceScope.CreateScope(ZeroObjects)) { ZeroTrace.SystemLog("[OnZeroInitialize>>"); Parallel.ForEach(ZeroObjects.Values.ToArray(), obj => { try { obj.OnZeroInitialize(); ZeroTrace.SystemLog(obj.Name, "Initialize"); } catch (Exception e) { ZeroTrace.WriteException(obj.Name, e, "*Initialize"); } }); ZeroTrace.SystemLog("<<OnZeroInitialize]"); } }
private void CheckResult(IZmqPool pool, int idx) { if (!pool.CheckIn(idx, out var message)) { return; } try { using (message) { using (ZMessage clone = new ZMessage()) { byte[] des = message[0].Read(); int size = des[0] + 2; for (var index = 2; index < size && index < des.Length; index++) { if (des[index] != ZeroFrameType.Requester) { continue; } clone.Add(message[index - 1].Duplicate()); break; } //clone.Add(new ZFrame("".ToAsciiBytes())); clone.Add(new ZFrame(des)); for (var index = 1; index < message.Count; index++) { clone.Add(message[index].Duplicate()); } pool.Sockets[idx - 1].SendMessage(clone, out _); --WaitCount; } } } catch (Exception e) { ZeroTrace.WriteException("ConnectionProxy", e, "CheckResult"); } }
/// <summary> /// 试着取配置 /// </summary> /// <param name="stationName"></param> /// <param name="json"></param> /// <param name="config"></param> /// <returns></returns> public bool UpdateConfig(string stationName, string json, out StationConfig config) { if (stationName == null || string.IsNullOrEmpty(json) || json[0] != '{') { ZeroTrace.WriteError("UpdateConfig", "argument error", stationName, json); config = null; return(false); } try { config = JsonConvert.DeserializeObject <StationConfig>(json); AddStation(config); return(true); } catch (Exception e) { ZeroTrace.WriteException("UpdateConfig", e, stationName, json); config = null; return(false); } }
/// <summary> /// 下载文档 /// </summary> /// <returns></returns> public bool LoadDocument(string name, out StationDocument doc) { ZeroResultData result; try { result = CallCommand("doc", name); if (!result.InteractiveSuccess || result.State != ZeroOperatorStateType.Ok) { ZeroTrace.WriteError("LoadDocument", result); doc = null; return(false); } } catch (Exception e) { ZeroTrace.WriteException("LoadDocument", e); doc = null; return(false); } if (!result.TryGetValue(ZeroFrameType.Status, out var json)) { ZeroTrace.WriteError("LoadDocument", "Empty"); doc = null; return(false); } try { doc = JsonConvert.DeserializeObject <StationDocument>(json); return(true); } catch (Exception e) { ZeroTrace.WriteException("LoadDocument", e, json); doc = null; return(false); } }
/// <summary> /// 广播消息解包 /// </summary> /// <param name="messages"></param> /// <param name="item"></param> /// <param name="showError"></param> /// <returns></returns> public static bool Unpack(this ZMessage messages, out PublishItem item, bool showError = true) { if (messages == null) { item = null; return(false); } try { if (messages.Count < 3) { item = null; return(false); } var description = messages[1].Read(); if (description.Length < 2) { item = null; return(false); } int end = description[0] + 2; if (end != messages.Count) { item = null; return(false); } item = new PublishItem { Title = messages[0].ReadString(), State = (ZeroOperatorStateType)description[1], ZeroEvent = (ZeroNetEventType)description[1] }; for (int idx = 2; idx < end; idx++) { var bytes = messages[idx].Read(); if (bytes.Length == 0) { continue; } switch (description[idx]) { case ZeroFrameType.SubTitle: item.SubTitle = Encoding.UTF8.GetString(bytes); break; case ZeroFrameType.Station: item.Station = Encoding.UTF8.GetString(bytes); break; case ZeroFrameType.Publisher: item.Publisher = Encoding.UTF8.GetString(bytes); break; case ZeroFrameType.Content: if (item.Content == null) { item.Content = Encoding.UTF8.GetString(bytes); } else { item.Values.Add(Encoding.UTF8.GetString(bytes)); } break; case ZeroFrameType.BinaryValue: item.Buffer = bytes; break; case ZeroFrameType.TsonValue: item.Tson = bytes; break; default: item.Values.Add(Encoding.UTF8.GetString(bytes)); break; } } return(true); } catch (Exception e) { ZeroTrace.WriteException("Unpack", e); item = null; return(false); } finally { messages.Dispose(); } }
/// <summary> /// 接收字节 /// </summary> /// <param name="socket"></param> /// <returns></returns> public static ZeroResultData <byte[]> Receive(this ZSocket socket) { ZMessage messages; try { if (!socket.Recv(out messages)) { return(new ZeroResultData <byte[]> { State = ZeroOperatorStateType.LocalRecvError, ZmqError = socket.LastError }); } } catch (Exception e) { ZeroTrace.WriteException("Receive", e, socket.Connects.LinkToString(','), "Exception"); return(new ZeroResultData <byte[]> { State = ZeroOperatorStateType.LocalRecvError, Exception = e }); } try { var description = messages[0].Read(); if (description.Length < 2) { ZeroTrace.WriteError("Receive", "LaoutError", socket.Connects.LinkToString(','), description.LinkToString(p => p.ToString("X2"), "")); return(new ZeroResultData <byte[]> { State = ZeroOperatorStateType.FrameInvalid, Message = "网络格式错误" }); } int end = description[0] + 1; if (end != messages.Count) { ZeroTrace.WriteError("Receive", "LaoutError", socket.Connects.LinkToString(','), $"FrameSize{messages.Count}", description.LinkToString(p => p.ToString("X2"), "")); return(new ZeroResultData <byte[]> { State = ZeroOperatorStateType.FrameInvalid, Message = "网络格式错误" }); } var result = new ZeroResultData <byte[]> { InteractiveSuccess = true, State = (ZeroOperatorStateType)description[1] }; for (int idx = 1; idx < end; idx++) { result.Add(description[idx + 1], messages[idx].Read()); } return(result); } catch (Exception e) { ZeroTrace.WriteException("Receive", e, socket.Connects.LinkToString(','), $"FrameSize{messages.Count},Socket Ptr:{ socket.SocketPtr}."); return(new ZeroResultData <byte[]> { State = ZeroOperatorStateType.LocalRecvError, Exception = e }); } finally { messages.Dispose(); } }