/// <summary> /// 创建Leader选举对象 /// </summary> /// <param name="id"> 每个Leader选举的参与者都有一个ID标识,用于区分各个参与者。</param> /// <param name="autoRequue"> 是否在由于网络问题造成与服务器断开连接后,自动参与到选举队列中。</param> /// <param name="client"> ZKClient</param> /// <param name="leaderPath"> 选举的路径</param> /// <param name="listener"> 成为Leader后执行的的监听器</param> public ZKLeaderSelector(string id, bool autoRequue, ZKClient client, string leaderPath, IZKLeaderSelectorListener listener) { this.id = id; this.client = client; this.autoRequeue = autoRequue; this.leaderPath = leaderPath; this._lock = ZKDistributedLock.NewInstance(client, leaderPath); this._lock.lockNodeData = id; this.listener = listener; SetFactory(); this.stateListener = new ZKStateListener().StateChanged( (state) => { if (state == KeeperState.SyncConnected) { //如果重新连接 if (!isInterrupted) { Requeue(); } } }); }
/// <summary> /// 创建Leader选举对象 /// </summary> /// <param name="id"> 每个Leader选举的参与者都有一个ID标识,用于区分各个参与者。</param> /// <param name="autoRequeue"> 是否在由于网络问题造成与服务器断开连接后,自动参与到选举队列中。</param> /// <param name="client"> ZooKeeperClient</param> /// <param name="leaderPath"> 选举的路径</param> /// <param name="listener"> 成为Leader后执行的的监听器</param> public ZKLeaderSelector(string id, bool autoRequeue, ZKClient zkClient, string leaderPath, IZKLeaderSelectorListener listener) { this.id = id; this._zkClient = zkClient; this.autoRequeue = autoRequeue; this.leaderPath = leaderPath; this._lock = new ZKDistributedLock(_zkClient, leaderPath); this._lock.lockNodeData = id; this.listener = listener; this.cancellationTokenSource = new CancellationTokenSource(); this.stateListener = new ZKStateListener(); stateListener.StateChangedHandler = async(state) => { if (state == KeeperState.SyncConnected) { //如果重新连接 if (!isInterrupted) { await Task.Run(() => Requeue()); } } }; }
public void TestDistributedLock() { _zkClient.CreateRecursive(lockPath, null, CreateMode.Persistent); int integer = 0; List <string> msgList = new List <string>(); for (int i = 0; i < 20; i++) { Task.Factory.StartNew(() => { try { ZKDistributedLock _lock = ZKDistributedLock.NewInstance(_zkClient, lockPath); _lock.Lock(0); Interlocked.Increment(ref integer); msgList.Add("thread " + integer); Console.WriteLine("Thread " + integer + " got lock........"); Console.WriteLine(string.Join(".", _lock.GetParticipantNodes())); if (integer == 3) { Thread.Sleep(1000); } if (integer == 5) { Thread.Sleep(700); } if (integer == 6 || integer == 11) { Thread.Sleep(500); } if (integer == 10) { Thread.Sleep(500); } if (integer == 15) { Thread.Sleep(400); } _lock.UnLock(); Console.WriteLine("thread " + integer + " unlock........"); } catch (ThreadInterruptedException) { } }); } int size = TestUtil.WaitUntil(20, () => { return(msgList.Count); }, new TimeSpan(0, 0, 200)); Assert.True(size == 20); bool flag = true; for (int i = 0; i < 20; i++) { if (msgList[i] != ("thread " + (i + 1))) { flag = false; } } Assert.True(flag); }
public async Task TestDistributedLock() { LOG.Info("------------ BEFORE -------------"); _zkClient = new ZKClient(TestUtil.zkServers); await TestUtil.ReSetPathUnCreate(_zkClient, lockPath); await _zkClient.CreateRecursiveAsync(lockPath, null, CreateMode.PERSISTENT); var integer = 0; var msgList = new List <string>(); for (int i = 0; i < 20; i++) { await Task.Run(async() => { try { var _lock = new ZKDistributedLock(_zkClient, lockPath); await _lock.LockAsync(); Interlocked.Increment(ref integer); msgList.Add("thread " + integer); Console.WriteLine("Thread " + integer + " got lock........"); Console.WriteLine(string.Join(".", _lock.GetParticipantNodes())); if (integer == 3) { await Task.Delay(1000); } if (integer == 5) { await Task.Delay(700); } if (integer == 6 || integer == 11) { await Task.Delay(500); } if (integer == 10) { await Task.Delay(500); } if (integer == 15) { await Task.Delay(400); } await _lock.UnLockAsync(); Console.WriteLine("thread " + integer + " unlock........"); } catch (ThreadInterruptedException) { } }); } int size = TestUtil.WaitUntil(20, () => { return(msgList.Count); }, TimeSpan.FromSeconds(200)); Assert.True(size == 20); bool flag = true; for (int i = 0; i < 20; i++) { if (msgList[i] != ("thread " + (i + 1))) { flag = false; } } Assert.True(flag); LOG.Info("------------ AFTER -------------"); _zkClient.Close(); }