/// <summary> /// 批量创建一组节点 /// </summary> /// <param name="zk"></param> /// <param name="nodes"></param> /// <param name="index"></param> /// <param name="callback">当所有节点创建完毕时的回调</param> static private void TryEnsureCreate(IZookClient zk, NodeInfo[] nodes, int index, Action callback) { if (index >= nodes.Length) { if (callback != null) { callback(); } return; } var currNode = nodes[index]; zk.Create(currNode.Path, currNode.Data, currNode.ACL, currNode.CreateMode).ContinueWith(c => { if (c.IsFaulted) { var kex = c.Exception.InnerException as KeeperException; if (kex == null || kex.Error != Data.ZoookError.NODEEXISTS) { TaskEx.Delay(new Random().Next(1000, 3000), () => TryEnsureCreate(zk, nodes, index, callback)); return; } } TryEnsureCreate(zk, nodes, index + 1, callback); }); }
/// <summary> /// try create node /// </summary> /// <param name="zk"></param> /// <param name="node"></param> /// <returns></returns> /// <exception cref="ArgumentNullException">zk is null.</exception> /// <exception cref="ArgumentNullException">node is null.</exception> static public Task TryCreate(IZookClient zk, NodeInfo node) { if (zk == null) throw new ArgumentNullException("zk"); if (node == null) throw new ArgumentNullException("node"); return zk.Create(node.Path, node.Data, node.ACL, node.CreateMode).ContinueWith(c => { var ex = c.Exception.InnerException as KeeperException; if (ex != null && ex.Error == Data.ZoookError.NODEEXISTS) return; throw c.Exception.InnerException; }, TaskContinuationOptions.OnlyOnFaulted); }
/// <summary> /// 批量创建一组节点 /// </summary> /// <param name="zk"></param> /// <param name="nodes"></param> /// <param name="index"></param> /// <param name="callback">当所有节点创建完毕时的回调</param> static private void TryEnsureCreate(IZookClient zk, NodeInfo[] nodes, int index, Action callback) { if (index >= nodes.Length) { if (callback != null) callback(); return; } var currNode = nodes[index]; zk.Create(currNode.Path, currNode.Data, currNode.ACL, currNode.CreateMode).ContinueWith(c => { if (c.IsFaulted) { var kex = c.Exception.InnerException as KeeperException; if (kex == null || kex.Error != Data.ZoookError.NODEEXISTS) { TaskEx.Delay(new Random().Next(1000, 3000), () => TryEnsureCreate(zk, nodes, index, callback)); return; } } TryEnsureCreate(zk, nodes, index + 1, callback); }); }
/// <summary> /// try create node /// </summary> /// <param name="zk"></param> /// <param name="node"></param> /// <returns></returns> /// <exception cref="ArgumentNullException">zk is null.</exception> /// <exception cref="ArgumentNullException">node is null.</exception> static public Task TryCreate(IZookClient zk, NodeInfo node) { if (zk == null) { throw new ArgumentNullException("zk"); } if (node == null) { throw new ArgumentNullException("node"); } return(zk.Create(node.Path, node.Data, node.ACL, node.CreateMode).ContinueWith(c => { var ex = c.Exception.InnerException as KeeperException; if (ex != null && ex.Error == Data.ZoookError.NODEEXISTS) { return; } throw c.Exception.InnerException; }, TaskContinuationOptions.OnlyOnFaulted)); }
/// <summary> /// try create nodes /// </summary> /// <param name="zk"></param> /// <param name="nodes"></param> /// <param name="index"></param> /// <param name="source"></param> static private void TryCreate(IZookClient zk, NodeInfo[] nodes, int index, TaskCompletionSource<bool> source) { if (index >= nodes.Length) { source.TrySetResult(true); return; } var node = nodes[index]; zk.Create(node.Path, node.Data, node.ACL, node.CreateMode).ContinueWith(c => { if (c.IsFaulted) { var ex = c.Exception.InnerException as KeeperException; if (ex == null || ex.Error != Data.ZoookError.NODEEXISTS) { source.TrySetException(c.Exception.InnerException); return; } } TryCreate(zk, nodes, index + 1, source); }); }
/// <summary> /// try create nodes /// </summary> /// <param name="zk"></param> /// <param name="nodes"></param> /// <param name="index"></param> /// <param name="source"></param> static private void TryCreate(IZookClient zk, NodeInfo[] nodes, int index, TaskCompletionSource <bool> source) { if (index >= nodes.Length) { source.TrySetResult(true); return; } var node = nodes[index]; zk.Create(node.Path, node.Data, node.ACL, node.CreateMode).ContinueWith(c => { if (c.IsFaulted) { var ex = c.Exception.InnerException as KeeperException; if (ex == null || ex.Error != Data.ZoookError.NODEEXISTS) { source.TrySetException(c.Exception.InnerException); return; } } TryCreate(zk, nodes, index + 1, source); }); }