Exemple #1
0
        /// <summary>
        /// 检测私有消息
        /// </summary>
        /// <returns></returns>
        private static async Task PrivateMsgWatcher()
        {
            if (m_client != null)
            {
                await m_client.SubscribeChildrenChange($"/Message/PrivateMessage/{m_ClientName}", async (ct, args) =>
                {
                    List <string> currentChildrens = args.CurrentChildrens.ToList();
                    string path = args.Path;
                    Watcher.Event.EventType eventType = args.Type;

                    foreach (var newMsg in currentChildrens)
                    {
                        string newpath = $"/Message/PrivateMessage/{m_ClientName}/{newMsg}";

                        if (await m_client.ExistsAsync(newpath))
                        {
                            var data   = await m_client.GetDataAsync(newpath);
                            string msg = Encoding.UTF8.GetString(data.ToArray());

                            string result = $"{msg},RecieveTime:{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}";
                            Console.WriteLine(result);

                            await m_client.DeleteAsync(newpath);
                        }
                    }
                });
            }
        }
Exemple #2
0
        /// <summary>
        /// 检测Client上下线
        /// </summary>
        /// <returns></returns>
        private static async Task ClientWatcher()
        {
            if (m_client != null)
            {
                var childs = await m_client.GetChildrenAsync("/Client");

                foreach (var child in childs)
                {
                    string childpath = $"/Client/{child}";
                    if (await m_client.ExistsAsync(childpath))
                    {
                        await m_client.SubscribeDataChange(childpath, (ct, args) =>
                        {
                            IEnumerable <byte> currentData = args.CurrentData;
                            string onlineresult            = Encoding.UTF8.GetString(currentData.ToArray());
                            string path   = args.Path;
                            string client = path.Replace("/Client/", "");
                            Watcher.Event.EventType eventType = args.Type;

                            string result = $"通知:{client}状态是{onlineresult}";
                            Console.WriteLine(result);

                            return(Task.CompletedTask);
                        });
                    }
                }
            }
        }
Exemple #3
0
        /**
         * Convert a WatcherEvent sent over the wire into a full-fledged WatcherEvent
         */

        internal WatchedEvent(WatcherEvent eventMessage)
        {
            keeperState = EnumUtil <Watcher.Event.KeeperState> .DefinedCast(eventMessage.getState());

            eventType = EnumUtil <Watcher.Event.EventType> .DefinedCast(eventMessage.get_Type());

            path = eventMessage.getPath();
        }
Exemple #4
0
        public void testInvalidIntConversion()
        {
            try {
                Watcher.Event.EventType et = EnumUtil <Watcher.Event.EventType> .DefinedCast(324242);

                Assert.fail("Was able to create an invalid EventType via an integer");
            }
            catch (Exception)
            {
                // we're good.
            }
        }
        public static NodeChangedEventType ToNodeChangedEventType(this Watcher.Event.EventType type)
        {
            switch (type)
            {
            case Watcher.Event.EventType.NodeCreated:
                return(NodeChangedEventType.Created);

            case Watcher.Event.EventType.NodeDeleted:
                return(NodeChangedEventType.Deleted);

            case Watcher.Event.EventType.NodeDataChanged:
                return(NodeChangedEventType.DataChanged);

            case Watcher.Event.EventType.NodeChildrenChanged:
                return(NodeChangedEventType.ChildrenChanged);

            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, null);
            }
        }
        private async Task SubscribeNodes(string path, Watcher.Event.EventType eventType)
        {
            var children = await ZooKeeper.getChildrenAsync(path, true);

            switch (eventType)
            {
            case Watcher.Event.EventType.NodeChildrenChanged:
                var serviceName = GetServiceNameFromPath(path);
                if (children == null)
                {
                    RefreshNodes(serviceName, new List <ServiceNodeInfo>());
                }
                else
                {
                    var nodes = await QueryServiceAsync(serviceName);

                    RefreshNodes(serviceName, nodes.Select(p => new ServiceNodeInfo(p.ServiceId, p.Address, p.Port, p.Weight, p.EnableTls, p.Meta)).ToList());
                }
                break;
            }
        }
Exemple #7
0
        //public void SetCurrentData(byte[] currentData)
        //{
        //    _currentData = currentData;
        //}

        internal async Task HandleNodeDataChange(IZookeeperClient client, NodeDataChangeArgs args)
        {
            Watcher.Event.EventType eventType = args.Type;
            var nodeData = new byte[0];

            if (args.CurrentData != null && args.CurrentData.Any())
            {
                nodeData = args.CurrentData.ToArray();
            }
            switch (eventType)
            {
            case Watcher.Event.EventType.NodeCreated:
                _action(new byte[0], nodeData);
                _currentData = nodeData;
                break;

            case Watcher.Event.EventType.NodeDataChanged:
                _action(_currentData, nodeData);
                _currentData = nodeData;
                break;
            }
        }
Exemple #8
0
        internal async Task HandleChildrenChange(IZookeeperClient client, NodeChildrenChangeArgs args)
        {
            Watcher.Event.EventType eventType = args.Type;
            var path    = args.Path;
            var watcher = new ChildrenMonitorWatcher(path, _action);

            switch (eventType)
            {
            case Watcher.Event.EventType.NodeCreated:
                await client.SubscribeChildrenChange(path, watcher.HandleChildrenChange);

                break;

            case Watcher.Event.EventType.NodeDataChanged:
                try
                {
                    var currentChildrens = new string[0];
                    if (args.CurrentChildrens != null && args.CurrentChildrens.Any())
                    {
                        currentChildrens = args.CurrentChildrens.ToArray();
                    }
                    _action(_currentData, currentChildrens);
                    watcher.SetCurrentData(currentChildrens);
                }
                catch (KeeperException.NoNodeException)
                {
                    _action(_currentData, new string[0]);
                    watcher.SetCurrentData(new string[0]);
                }
                break;

            case Watcher.Event.EventType.NodeDeleted:
                _action(_currentData, new string[0]);
                watcher.SetCurrentData(new string[0]);
                break;
            }
        }
Exemple #9
0
        /// <summary>
        /// 检测群组消息
        /// </summary>
        /// <returns></returns>
        private static async Task GroupMsgWatcher()
        {
            if (m_client != null)
            {
                await m_client.SubscribeChildrenChange("/Message/GroupMessage", async (ct, args) =>
                {
                    List <string> currentChildrens = args.CurrentChildrens.ToList();
                    string path = args.Path;
                    Watcher.Event.EventType eventType = args.Type;

                    var newadded = currentChildrens.Where(t => !groupMsgList.Contains(t)).ToList();

                    foreach (var newMsg in newadded)
                    {
                        string newpath = $"/Message/GroupMessage/{newMsg}";

                        if (await m_client.ExistsAsync(newpath))
                        {
                            var data   = await m_client.GetDataAsync(newpath);
                            string msg = Encoding.UTF8.GetString(data.ToArray());

                            string result = $"{msg},RecieveTime:{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}";
                            Console.WriteLine(result);
                        }
                    }

                    groupMsgList.AddRange(newadded);

                    var needdelete = groupMsgList.Where(t => !currentChildrens.Contains(t)).ToList();

                    foreach (var delete in needdelete)
                    {
                        groupMsgList.Remove(delete);
                    }
                });
            }
        }
Exemple #10
0
 /// <summary>
 /// 创建一个新的节点子节点变更参数。
 /// </summary>
 /// <param name="path">节点路径。</param>
 /// <param name="type">事件类型。</param>
 /// <param name="currentChildrens">最新的子节点集合。</param>
 public NodeChildrenChangeArgs(string path, Watcher.Event.EventType type, IEnumerable <string> currentChildrens) : base(path, type)
 {
     CurrentChildrens = currentChildrens;
 }
Exemple #11
0
 /// <summary>
 /// 创建一个新的节点数据变更参数。
 /// </summary>
 /// <param name="path">节点路径。</param>
 /// <param name="type">事件类型。</param>
 /// <param name="currentData">最新的节点数据。</param>
 public NodeDataChangeArgs(string path, Watcher.Event.EventType type, IEnumerable <byte> currentData) : base(path, type)
 {
     CurrentData = currentData;
 }
Exemple #12
0
 /// <summary>
 /// 创建一个新的节点变更参数。
 /// </summary>
 /// <param name="path">节点路径。</param>
 /// <param name="type">事件类型。</param>
 protected NodeChangeArgs(string path, Watcher.Event.EventType type)
 {
     Path = path;
     Type = type;
 }
Exemple #13
0
        static void Main(string[] args)
        {
            IZookeeperClient client = new ZookeeperClient(new ZookeeperClientOptions("192.168.1.167:2181")
            {
                BasePath                   = "/",                      //default value
                ConnectionTimeout          = TimeSpan.FromSeconds(10), //default value
                SessionTimeout             = TimeSpan.FromSeconds(20), //default value
                OperatingTimeout           = TimeSpan.FromSeconds(60), //default value
                ReadOnly                   = false,                    //default value
                SessionId                  = 0,                        //default value
                SessionPasswd              = null,                     //default value
                EnableEphemeralNodeRestore = true                      //default value
            });



            client.SubscribeChildrenChange("/microsoft", (ct, args2) =>
            {
                IEnumerable <string> currentChildrens = args2.CurrentChildrens;
                string path = args2.Path;
                Console.WriteLine("SubscribeChildrenChange:" + path);
                Watcher.Event.EventType eventType = args2.Type;
                return(Task.CompletedTask);
            });

            client.SubscribeDataChange("/year", (ct, args1) =>
            {
                IEnumerable <byte> currentData = args1.CurrentData;
                string path = args1.Path;
                Console.WriteLine("SubscribeDataChange:" + path + "*****" + args1.Type.ToString() + ":" + DateTime.Now.ToString());
                Watcher.Event.EventType eventType = args1.Type;
                return(Task.CompletedTask);
            });

            var data = Encoding.UTF8.GetBytes("2016");

            //Fast create temporary nodes
            client.CreateEphemeralAsync("/year", data);
            client.CreateEphemeralAsync("/year", data, ZooDefs.Ids.OPEN_ACL_UNSAFE);

            //Fast create permanent nodes
            client.CreatePersistentAsync("/year", data);
            client.CreatePersistentAsync("/year", data, ZooDefs.Ids.OPEN_ACL_UNSAFE);

            //Full call
            client.CreateAsync("/year", data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);

            //Recursively created
            client.CreateRecursiveAsync("/microsoft/netcore/aspnet", data);
            Console.WriteLine("start .....");
            while (true)
            {
                Console.WriteLine("请输入内容!");
                switch (Console.ReadLine())
                {
                case "1":
                {
                    client.SetDataAsync("/microsoft", Encoding.UTF8.GetBytes("2018"));
                }; break;

                case "2":
                {
                    var abc = client.SetDataAsync("/year", Encoding.UTF8.GetBytes("2018"));
                }; break;
                }
            }
            Console.ReadKey();
        }
Exemple #14
0
 internal WatchedEvent(Watcher.Event.EventType eventType, Watcher.Event.KeeperState keeperState, string path)
 {
     this.keeperState = keeperState;
     this.eventType   = eventType;
     this.path        = path;
 }
        private async Task Watcher_OnChange(string path, Watcher.Event.KeeperState keeperState, Watcher.Event.EventType eventType)
        {
            switch (keeperState)
            {
            case Watcher.Event.KeeperState.Expired:
                Logger.LogWarning($"ZooKeeper has been {keeperState},Reconnecting...");
                ZooKeeperSessionId = 0;
                CreateZooKeeperClient();
                break;

            case Watcher.Event.KeeperState.Disconnected:
                Logger.LogWarning($"ZooKeeper has been {keeperState},Reconnecting...");
                CreateZooKeeperClient();
                break;

            case Watcher.Event.KeeperState.SyncConnected:
                if (ZooKeeperSessionId == 0)
                {
                    ZooKeeperSessionId = ZooKeeper.getSessionId();
                }
                await SubscribeNodes(path, eventType);

                break;
            }
        }
Exemple #16
0
 /// <summary>
 /// 创建一个新的节点子节点变更参数。
 /// </summary>
 /// <param name="path">节点路径。</param>
 /// <param name="type">事件类型。</param>
 /// <param name="currentChildrenDatas">最新的子节点集合。</param>
 public NodeChildrenChangeArgs(string path, Watcher.Event.EventType type, Dictionary <string, DataResult> currentChildrenDatas) : base(path, type)
 {
     CurrentChildrenDatas = currentChildrenDatas;
 }