Exemplo n.º 1
0
        private async Task OnChildrenChangeHandle(WatchedEvent watchedEvent)
        {
            if (!HasChildrenChangeHandler)
            {
                return;
            }

            //获取当前节点最新的子节点信息
            var getCurrentChildrens = new Func <Task <Dictionary <string, DataResult> > >(() => _client.RetryUntilConnected(
                                                                                              async() =>
            {
                try
                {
                    return(await GetChildrenDatasAsync());
                }
                catch (KeeperException.NoNodeException)
                {
                    return(null);
                }
            }));

            //根据事件类型构建节点子节点变更事件参数
            NodeChildrenChangeArgs args;

            switch (watchedEvent.get_Type())
            {
            case Watcher.Event.EventType.NodeCreated:
                args = new NodeChildrenChangeArgs(Path, Watcher.Event.EventType.NodeCreated,
                                                  await getCurrentChildrens());
                break;

            case Watcher.Event.EventType.NodeDeleted:
                args = new NodeChildrenChangeArgs(Path, Watcher.Event.EventType.NodeDeleted, null);
                break;

            case Watcher.Event.EventType.NodeChildrenChanged:
            case Watcher.Event.EventType.None:     //重连时触发
                args = new NodeChildrenChangeArgs(Path, Watcher.Event.EventType.NodeChildrenChanged,
                                                  await getCurrentChildrens());
                break;

            default:
                throw new NotSupportedException($"不支持的事件类型:{watchedEvent.get_Type()}");
            }

            await _childrenChangeHandler(_client, args);

            //重新监听
            await WatchChildrenChange();
        }
Exemplo n.º 2
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;
            }
        }