Ejemplo n.º 1
0
        /// <summary>
        /// 将当前的节点转换为一系列的递进式的节点
        /// Eg.  /App/Configs/Add
        /// ==>  /App ,/App/Configs , /App/Configs/Add
        /// </summary>
        /// <returns></returns>
        public ZookeeperPathString[] ToSpliter()
        {
            var array = Path.Split("/")
                        .Where(x => !string.IsNullOrWhiteSpace(x))
                        .ToArray();

            var result = new List <ZookeeperPathString>();

            ZookeeperPathString iteration = null;

            foreach (var a in array)
            {
                if (iteration == null)
                {
                    iteration = a;
                }
                else
                {
                    iteration += a;
                }
                result.Add(iteration);
            }

            return(result.ToArray());
        }
        private async Task Loop(ZooKeeper keeper, ZookeeperPathString path)
        {
            var data = await keeper.getDataAsync(path, true);

            var sValue = Source.DataEncoding.GetString(data.Data);

            Data.TryAdd(path.ToKeyString(), sValue);

            if (data.Stat.getNumChildren() > 0)
            {
                var childs = await keeper.getChildrenAsync(path, true);

                foreach (var c in childs.Children)
                {
                    await Loop(keeper, path + c);
                }
            }
        }
        public override void Set(string key, string value)
        {
            if (Source.ReadOnlyConfiguration)
            {
                return;
            }
            // set zookeeper
            var path = ZookeeperPathString.ParseFrom(key);

            if (!path.Path.StartsWith(Source.Path))
            {
                path = Source.Path + path;
            }

            //ZooKeeper.Using(Source.ConnectionString, Source.SessionTimeout, null, LoadAsync);
            _client.SetDataAsync(path, Source.DataEncoding.GetBytes(value))
            .ConfigureAwait(false)
            .GetAwaiter()
            .GetResult();

            base.Set(key, value);
        }
        private async Task OnKeyChanged(WatchedEvent args)
        {
            var eventType            = args.get_Type();
            ZookeeperPathString path = args.getPath();
            var        key           = path.ToKeyString();
            string     value;
            DataResult result;

            switch (eventType)
            {
            case Watcher.Event.EventType.None:
                break;

            case Watcher.Event.EventType.NodeCreated:
                result = await _client.getDataAsync(path);

                value = Source.DataEncoding.GetString(result.Data);
                Data.TryAdd(key, value);
                break;

            case Watcher.Event.EventType.NodeDeleted:
                Data.Remove(key);
                break;

            case Watcher.Event.EventType.NodeDataChanged:
                result = await _client.getDataAsync(path);

                value     = Source.DataEncoding.GetString(result.Data);
                Data[key] = value;
                break;

            // ignore nochild changed every node was be watched
            case Watcher.Event.EventType.NodeChildrenChanged:
            default:
                break;
            }
        }