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(); }
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; } }