示例#1
0
 /// <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);
     }
 }
示例#2
0
 /// <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]");
 }
示例#3
0
 /// <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);
     }
 }
示例#4
0
 /// <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");
             }
         }
         ;
     }
 }
示例#5
0
 /// <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]");
     }
 }
示例#6
0
        /// <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));
        }
示例#7
0
        /// <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();
            }
        }
示例#8
0
        /// <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();
            }
        }
示例#9
0
        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");
            }
        }
示例#10
0
        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");
            }
        }
示例#11
0
 /// <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);
     }
 }
示例#12
0
 /// <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);
     }
 }
示例#13
0
        /// <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]");
            }
        }
示例#14
0
 /// <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]");
     }
 }
示例#15
0
        /// <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);
        }
示例#16
0
 /// <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})]");
     }
 }
示例#17
0
 /// <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]");
     }
 }
示例#18
0
        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");
            }
        }
示例#19
0
 /// <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);
     }
 }
示例#20
0
        /// <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);
            }
        }
示例#21
0
        /// <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();
            }
        }
示例#22
0
        /// <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();
            }
        }