Skip to content

Commit bae01cf

Browse files
committed
代码优化和注释完善。
1 parent 490e6ee commit bae01cf

File tree

6 files changed

+337
-44
lines changed

6 files changed

+337
-44
lines changed

src/Rabbit.Zookeeper/Delegates.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ namespace Rabbit.Zookeeper
99
/// </summary>
1010
public class ConnectionStateChangeArgs
1111
{
12+
/// <summary>
13+
/// 连接状态。
14+
/// </summary>
1215
public Watcher.Event.KeeperState State { get; set; }
1316
}
1417

@@ -17,6 +20,11 @@ public class ConnectionStateChangeArgs
1720
/// </summary>
1821
public abstract class NodeChangeArgs
1922
{
23+
/// <summary>
24+
/// 创建一个新的节点变更参数。
25+
/// </summary>
26+
/// <param name="path">节点路径。</param>
27+
/// <param name="type">事件类型。</param>
2028
protected NodeChangeArgs(string path, Watcher.Event.EventType type)
2129
{
2230
Path = path;
@@ -34,8 +42,17 @@ protected NodeChangeArgs(string path, Watcher.Event.EventType type)
3442
public string Path { get; private set; }
3543
}
3644

45+
/// <summary>
46+
/// 节点数据变更参数。
47+
/// </summary>
3748
public sealed class NodeDataChangeArgs : NodeChangeArgs
3849
{
50+
/// <summary>
51+
/// 创建一个新的节点数据变更参数。
52+
/// </summary>
53+
/// <param name="path">节点路径。</param>
54+
/// <param name="type">事件类型。</param>
55+
/// <param name="currentData">最新的节点数据。</param>
3956
public NodeDataChangeArgs(string path, Watcher.Event.EventType type, IEnumerable<byte> currentData) : base(path, type)
4057
{
4158
CurrentData = currentData;
@@ -47,8 +64,17 @@ public NodeDataChangeArgs(string path, Watcher.Event.EventType type, IEnumerable
4764
public IEnumerable<byte> CurrentData { get; private set; }
4865
}
4966

67+
/// <summary>
68+
/// 节点子节点变更参数。
69+
/// </summary>
5070
public sealed class NodeChildrenChangeArgs : NodeChangeArgs
5171
{
72+
/// <summary>
73+
/// 创建一个新的节点子节点变更参数。
74+
/// </summary>
75+
/// <param name="path">节点路径。</param>
76+
/// <param name="type">事件类型。</param>
77+
/// <param name="currentChildrens">最新的子节点集合。</param>
5278
public NodeChildrenChangeArgs(string path, Watcher.Event.EventType type, IEnumerable<string> currentChildrens) : base(path, type)
5379
{
5480
CurrentChildrens = currentChildrens;
@@ -60,9 +86,24 @@ public NodeChildrenChangeArgs(string path, Watcher.Event.EventType type, IEnumer
6086
public IEnumerable<string> CurrentChildrens { get; private set; }
6187
}
6288

89+
/// <summary>
90+
/// 节点数据变更委托。
91+
/// </summary>
92+
/// <param name="client">ZooKeeper客户端。</param>
93+
/// <param name="args">节点数据变更参数。</param>
6394
public delegate Task NodeDataChangeHandler(IZookeeperClient client, NodeDataChangeArgs args);
6495

96+
/// <summary>
97+
/// 节点子节点变更委托。
98+
/// </summary>
99+
/// <param name="client">ZooKeeper客户端。</param>
100+
/// <param name="args">节点子节点变更参数。</param>
65101
public delegate Task NodeChildrenChangeHandler(IZookeeperClient client, NodeChildrenChangeArgs args);
66102

103+
/// <summary>
104+
/// 连接状态变更委托。
105+
/// </summary>
106+
/// <param name="client">ZooKeeper客户端。</param>
107+
/// <param name="args">连接状态变更参数。</param>
67108
public delegate Task ConnectionStateChangeHandler(IZookeeperClient client, ConnectionStateChangeArgs args);
68109
}

src/Rabbit.Zookeeper/IZookeeperClient.cs

Lines changed: 168 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66

77
namespace Rabbit.Zookeeper
88
{
9+
/// <summary>
10+
/// 一个抽象的ZooKeeper客户端。
11+
/// </summary>
912
public interface IZookeeperClient : IDisposable
1013
{
1114
/// <summary>
12-
/// 具体的zookeeper连接
15+
/// 具体的ZooKeeper连接
1316
/// </summary>
1417
ZooKeeper ZooKeeper { get; }
1518

@@ -34,53 +37,174 @@ public interface IZookeeperClient : IDisposable
3437
/// <returns>执行结果。</returns>
3538
Task<T> RetryUntilConnected<T>(Func<Task<T>> callable);
3639

40+
/// <summary>
41+
/// 获取指定节点的数据。
42+
/// </summary>
43+
/// <param name="path">节点路径。</param>
44+
/// <returns>节点数据。</returns>
3745
Task<IEnumerable<byte>> GetDataAsync(string path);
3846

47+
/// <summary>
48+
/// 获取指定节点下的所有子节点。
49+
/// </summary>
50+
/// <param name="path">节点路径。</param>
51+
/// <returns>子节点集合。</returns>
3952
Task<IEnumerable<string>> GetChildrenAsync(string path);
4053

54+
/// <summary>
55+
/// 判断节点是否存在。
56+
/// </summary>
57+
/// <param name="path">节点路径。</param>
58+
/// <returns>如果存在则返回true,否则返回false。</returns>
4159
Task<bool> ExistsAsync(string path);
4260

43-
Task CreateAsync(string path, byte[] data, List<ACL> acls, CreateMode createMode);
61+
/// <summary>
62+
/// 创建节点。
63+
/// </summary>
64+
/// <param name="path">节点路径。</param>
65+
/// <param name="data">节点数据。</param>
66+
/// <param name="acls">权限。</param>
67+
/// <param name="createMode">创建模式。</param>
68+
/// <returns>节点路径。</returns>
69+
/// <remarks>
70+
/// 因为使用序列方式创建节点zk会修改节点name,所以需要返回真正的节点路径。
71+
/// </remarks>
72+
Task<string> CreateAsync(string path, byte[] data, List<ACL> acls, CreateMode createMode);
4473

74+
/// <summary>
75+
/// 设置节点数据。
76+
/// </summary>
77+
/// <param name="path">节点路径。</param>
78+
/// <param name="data">节点数据。</param>
79+
/// <param name="version">版本号。</param>
80+
/// <returns>节点状态。</returns>
4581
Task<Stat> SetDataAsync(string path, byte[] data, int version = -1);
4682

83+
/// <summary>
84+
/// 删除节点。
85+
/// </summary>
86+
/// <param name="path">节点路径。</param>
87+
/// <param name="version">版本号。</param>
4788
Task DeleteAsync(string path, int version = -1);
4889

90+
/// <summary>
91+
/// 订阅节点数据变更。
92+
/// </summary>
93+
/// <param name="path">节点路径。</param>
94+
/// <param name="listener">监听者。</param>
4995
Task SubscribeDataChange(string path, NodeDataChangeHandler listener);
5096

97+
/// <summary>
98+
/// 取消订阅节点数据变更。
99+
/// </summary>
100+
/// <param name="path">节点路径。</param>
101+
/// <param name="listener">监听者。</param>
51102
void UnSubscribeDataChange(string path, NodeDataChangeHandler listener);
52103

104+
/// <summary>
105+
/// 订阅连接状态变更。
106+
/// </summary>
107+
/// <param name="listener">监听者。</param>
53108
void SubscribeStatusChange(ConnectionStateChangeHandler listener);
54109

110+
/// <summary>
111+
/// 取消订阅连接状态变更。
112+
/// </summary>
113+
/// <param name="listener">监听者。</param>
55114
void UnSubscribeStatusChange(ConnectionStateChangeHandler listener);
56115

116+
/// <summary>
117+
/// 订阅节点子节点变更。
118+
/// </summary>
119+
/// <param name="path">节点路径。</param>
120+
/// <param name="listener">监听者。</param>
57121
Task<IEnumerable<string>> SubscribeChildrenChange(string path, NodeChildrenChangeHandler listener);
58122

123+
/// <summary>
124+
/// 取消订阅节点子节点变更。
125+
/// </summary>
126+
/// <param name="path">节点路径。</param>
127+
/// <param name="listener">监听者。</param>
59128
void UnSubscribeChildrenChange(string path, NodeChildrenChangeHandler listener);
60129
}
61130

131+
/// <summary>
132+
/// ZooKeeper客户端扩展方法。
133+
/// </summary>
62134
public static class ZookeeperClientExtensions
63135
{
64-
public static Task CreateEphemeralAsync(this IZookeeperClient client, string path, byte[] data)
136+
/// <summary>
137+
/// 创建短暂的节点。
138+
/// </summary>
139+
/// <param name="client">ZooKeeper客户端。</param>
140+
/// <param name="path">节点路径。</param>
141+
/// <param name="data">节点数据。</param>
142+
/// <param name="isSequential">是否按顺序创建。</param>
143+
/// <returns>节点路径。</returns>
144+
/// <remarks>
145+
/// 因为使用序列方式创建节点zk会修改节点name,所以需要返回真正的节点路径。
146+
/// </remarks>
147+
public static Task<string> CreateEphemeralAsync(this IZookeeperClient client, string path, byte[] data, bool isSequential = false)
65148
{
66-
return client.CreateEphemeralAsync(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE);
149+
return client.CreateEphemeralAsync(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, isSequential);
67150
}
68151

69-
public static Task CreateEphemeralAsync(this IZookeeperClient client, string path, byte[] data, List<ACL> acls)
152+
/// <summary>
153+
/// 创建短暂的节点。
154+
/// </summary>
155+
/// <param name="client">ZooKeeper客户端。</param>
156+
/// <param name="path">节点路径。</param>
157+
/// <param name="data">节点数据。</param>
158+
/// <param name="acls">权限。</param>
159+
/// <param name="isSequential">是否按顺序创建。</param>
160+
/// <returns>节点路径。</returns>
161+
/// <remarks>
162+
/// 因为使用序列方式创建节点zk会修改节点name,所以需要返回真正的节点路径。
163+
/// </remarks>
164+
public static Task<string> CreateEphemeralAsync(this IZookeeperClient client, string path, byte[] data, List<ACL> acls, bool isSequential = false)
70165
{
71-
return client.CreateAsync(path, data, acls, CreateMode.EPHEMERAL);
166+
return client.CreateAsync(path, data, acls, isSequential ? CreateMode.EPHEMERAL_SEQUENTIAL : CreateMode.EPHEMERAL);
72167
}
73168

74-
public static Task CreatePersistentAsync(this IZookeeperClient client, string path, byte[] data)
169+
/// <summary>
170+
/// 创建节点。
171+
/// </summary>
172+
/// <param name="client">ZooKeeper客户端。</param>
173+
/// <param name="path">节点路径。</param>
174+
/// <param name="data">节点数据。</param>
175+
/// <param name="isSequential">是否按顺序创建。</param>
176+
/// <returns>节点路径。</returns>
177+
/// <remarks>
178+
/// 因为使用序列方式创建节点zk会修改节点name,所以需要返回真正的节点路径。
179+
/// </remarks>
180+
public static Task<string> CreatePersistentAsync(this IZookeeperClient client, string path, byte[] data, bool isSequential = false)
75181
{
76-
return client.CreatePersistentAsync(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE);
182+
return client.CreatePersistentAsync(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, isSequential);
77183
}
78184

79-
public static Task CreatePersistentAsync(this IZookeeperClient client, string path, byte[] data, List<ACL> acls)
185+
/// <summary>
186+
/// 创建节点。
187+
/// </summary>
188+
/// <param name="client">ZooKeeper客户端。</param>
189+
/// <param name="path">节点路径。</param>
190+
/// <param name="data">节点数据。</param>
191+
/// <param name="acls">权限。</param>
192+
/// <param name="isSequential">是否按顺序创建。</param>
193+
/// <returns>节点路径。</returns>
194+
/// <remarks>
195+
/// 因为使用序列方式创建节点zk会修改节点name,所以需要返回真正的节点路径。
196+
/// </remarks>
197+
public static Task<string> CreatePersistentAsync(this IZookeeperClient client, string path, byte[] data, List<ACL> acls, bool isSequential = false)
80198
{
81-
return client.CreateAsync(path, data, acls, CreateMode.PERSISTENT);
199+
return client.CreateAsync(path, data, acls, isSequential ? CreateMode.PERSISTENT_SEQUENTIAL : CreateMode.PERSISTENT);
82200
}
83201

202+
/// <summary>
203+
/// 递归删除该节点下的所有子节点和该节点本身。
204+
/// </summary>
205+
/// <param name="client">ZooKeeper客户端。</param>
206+
/// <param name="path">节点路径。</param>
207+
/// <returns>如果成功则返回true,false。</returns>
84208
public static async Task<bool> DeleteRecursiveAsync(this IZookeeperClient client, string path)
85209
{
86210
IEnumerable<string> children;
@@ -93,7 +217,7 @@ public static async Task<bool> DeleteRecursiveAsync(this IZookeeperClient client
93217
return true;
94218
}
95219

96-
foreach (string subPath in children)
220+
foreach (var subPath in children)
97221
{
98222
if (!await client.DeleteRecursiveAsync(path + "/" + subPath))
99223
{
@@ -104,25 +228,52 @@ public static async Task<bool> DeleteRecursiveAsync(this IZookeeperClient client
104228
return true;
105229
}
106230

107-
public static Task CreateRecursiveAsync(this IZookeeperClient client, string path, byte[] data, CreateMode createMode)
231+
/// <summary>
232+
/// 递归创建该节点下的所有子节点和该节点本身。
233+
/// </summary>
234+
/// <param name="client">ZooKeeper客户端。</param>
235+
/// <param name="path">节点路径。</param>
236+
/// <param name="data">节点数据。</param>
237+
public static Task CreateRecursiveAsync(this IZookeeperClient client, string path, byte[] data)
238+
{
239+
return client.CreateRecursiveAsync(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE);
240+
}
241+
242+
/// <summary>
243+
/// 递归创建该节点下的所有子节点和该节点本身。
244+
/// </summary>
245+
/// <param name="client">ZooKeeper客户端。</param>
246+
/// <param name="path">节点路径。</param>
247+
/// <param name="data">节点数据。</param>
248+
/// <param name="acls">权限。</param>
249+
public static Task CreateRecursiveAsync(this IZookeeperClient client, string path, byte[] data, List<ACL> acls)
108250
{
109-
return client.CreateRecursiveAsync(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, createMode);
251+
return client.CreateRecursiveAsync(path, p => data, p => acls);
110252
}
111253

112-
public static async Task CreateRecursiveAsync(this IZookeeperClient client, string path, byte[] data, List<ACL> acls, CreateMode createMode)
254+
/// <summary>
255+
/// 递归创建该节点下的所有子节点和该节点本身。
256+
/// </summary>
257+
/// <param name="client">ZooKeeper客户端。</param>
258+
/// <param name="path">节点路径。</param>
259+
/// <param name="getNodeData">获取当前被创建节点数据的委托。</param>
260+
/// <param name="getNodeAcls">获取当前被创建节点权限的委托。</param>
261+
public static async Task CreateRecursiveAsync(this IZookeeperClient client, string path, Func<string, byte[]> getNodeData, Func<string, List<ACL>> getNodeAcls)
113262
{
263+
var data = getNodeData(path);
264+
var acls = getNodeAcls(path);
114265
try
115266
{
116-
await client.CreateAsync(path, data, acls, createMode);
267+
await client.CreateAsync(path, data, acls, CreateMode.PERSISTENT);
117268
}
118269
catch (KeeperException.NodeExistsException)
119270
{
120271
}
121272
catch (KeeperException.NoNodeException)
122273
{
123274
var parentDir = path.Substring(0, path.LastIndexOf('/'));
124-
await CreateRecursiveAsync(client, parentDir, null, acls, CreateMode.PERSISTENT);
125-
await client.CreateAsync(path, data, acls, createMode);
275+
await CreateRecursiveAsync(client, parentDir, getNodeData, getNodeAcls);
276+
await client.CreateAsync(path, data, acls, CreateMode.PERSISTENT);
126277
}
127278
}
128279

src/Rabbit.Zookeeper/Implementation/NodeEntry.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,10 @@ public async Task<bool> ExistsAsync(bool watch = false)
6767
return data != null;
6868
}
6969

70-
public async Task CreateAsync(byte[] data, List<ACL> acls, CreateMode createMode)
70+
public async Task<string> CreateAsync(byte[] data, List<ACL> acls, CreateMode createMode)
7171
{
7272
var zooKeeper = _client.ZooKeeper;
73-
await zooKeeper.createAsync(Path, data, acls, createMode);
73+
return await zooKeeper.createAsync(Path, data, acls, createMode);
7474
}
7575

7676
public Task<Stat> SetDataAsync(byte[] data, int version = -1)

0 commit comments

Comments
 (0)