Beispiel #1
0
        /// <summary>
        /// 通知节点发生变化。
        /// </summary>
        /// <param name="watchedEvent">zookeeper sdk监听事件参数。</param>
        /// <param name="isFirstConnection">是否是zk第一次连接上服务器。</param>
        internal async Task OnChange(WatchedEvent watchedEvent, bool isFirstConnection)
        {
            //得到节点路径(如果只是状态发送变化则路径为null)
            var path = watchedEvent.getPath();
            //是否是zk连接状态变更
            var stateChanged = path == null;

            //如果只是状态变更则进行状态变更处理
            if (stateChanged)
            {
                await OnStatusChangeHandle(watchedEvent, isFirstConnection);
            }
            else if (path == Path) //如果变化的节点属于自己
            {
                var eventType = watchedEvent.get_Type();

                //是否属于数据变更
                var dataChanged = new[]
                {
                    Watcher.Event.EventType.NodeCreated,
                    Watcher.Event.EventType.NodeDataChanged,
                    Watcher.Event.EventType.NodeDeleted
                }.Contains(eventType);

                if (dataChanged)
                {
                    //如果子节点刚刚被创建并且该节点有注册子节点变更监听,则通知zk进行子节点监听(延迟监听)
                    if (eventType == Watcher.Event.EventType.NodeCreated && HasChildrenChangeHandler)
                    {
                        await _client.RetryUntilConnected(() => GetChildrenAsync(true));
                    }

                    //进行数据变更处理
                    await OnDataChangeHandle(watchedEvent);
                }
                else
                {
                    //进行子节点变更处理
                    await OnChildrenChangeHandle(watchedEvent);
                }
            }
        }