/// <summary>
        /// 创建指定的节点
        /// </summary>
        /// <param name="keeper"></param>
        /// <param name="path">路径</param>
        /// <param name="data">数据</param>
        /// <returns></returns>
        public static async Task CreateAsync(this ZooKeeper keeper, ZookeeperPathString path, byte[] data)
        {
            if (keeper == null)
            {
                throw new ArgumentNullException(nameof(keeper));
            }

            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }

            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }
            if (!await keeper.ExistAsync(path))
            {
                await keeper.createAsync(path, data, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            }
            //var spliter = path.ToSpliter();

            //foreach (var spl in spliter)
            //{
            //    if (!await keeper.ExistAsync(spl))
            //    {
            //        await keeper.createAsync(path, data, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            //    }
            //}
        }
 /// <summary>
 /// 设置指定的节点为指定值,如果不存在,会创建该节点
 /// </summary>
 /// <param name="keeper"></param>
 /// <param name="path"></param>
 /// <param name="values"></param>
 /// <returns></returns>
 public static async Task SetDataAsync(this ZooKeeper keeper, ZookeeperPathString path, byte[] values)
 {
     if (await keeper.ExistAsync(path))
     {
         await keeper.setDataAsync(path, values);
     }
     else
     {
         await keeper.CreateAsync(path, values);
     }
 }
        /// <summary>
        /// 获取指定节点上的数据,如果不存在,则创建并添加
        /// </summary>
        /// <param name="keeper"></param>
        /// <param name="path"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static async Task <byte[]> GetOrAddAsync(this ZooKeeper keeper, ZookeeperPathString path, byte[] data)
        {
            if (await keeper.ExistAsync(path))
            {
                return((await keeper.getDataAsync(path, true)).Data);
            }
            else
            {
                await keeper.CreateAsync(path, data);

                return(data);
            }
        }
        /// <summary>
        /// 是否存在指定的节点
        /// </summary>
        /// <param name="keeper"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        public static async Task <bool> ExistAsync(this ZooKeeper keeper, ZookeeperPathString path)
        {
            if (keeper == null)
            {
                throw new ArgumentNullException(nameof(keeper));
            }

            if (path == null)
            {
                throw new ArgumentNullException(nameof(path));
            }
            return((await keeper.existsAsync(path)) != null);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 添加Zookeeper的配置中心
        /// </summary>
        /// <param name="builder"></param>
        /// <param name="connectionString">连接字符串</param>
        /// <param name="path">配置中心的配置节点,该节点下的所有子节点会被递归作为配置</param>
        /// <param name="sessionTimeout">session的过期时间</param>
        /// <param name="encoding">数据的编码格式</param>
        /// <param name="readOnly">是否是只读的,对于管理配置的,设置为false,对于使用配置的应用,则为true</param>
        /// <returns></returns>
        public static IConfigurationBuilder AddZookeeper(this IConfigurationBuilder builder,
                                                         string connectionString,
                                                         ZookeeperPathString path,
                                                         Encoding encoding,
                                                         int sessionTimeout,
                                                         bool readOnly)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            var source = new ZookeeperConfigurationSource
            {
                ConnectionString      = connectionString,
                DataEncoding          = encoding,
                SessionTimeout        = sessionTimeout,
                Path                  = path,
                ReadOnlyConfiguration = readOnly
            };

            return(builder.Add(source));
        }
        /// <summary>
        /// 获取指定父节点下的子节点
        /// </summary>
        /// <param name="keeper"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        public static async Task <IReadOnlyList <string> > GetChildren(this ZooKeeper keeper, ZookeeperPathString path)
        {
            if (await keeper.ExistAsync(path))
            {
                var chid = await keeper.getChildrenAsync(path, true);

                return(chid.Children);
            }
            return(Array.Empty <string>());
        }