Пример #1
0
 /// <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();
             }
         }
     });
 }
Пример #2
0
 /// <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());
             }
         }
     };
 }
Пример #3
0
        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);
        }
Пример #4
0
        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();
        }