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