public async Task EnusreInit() { if (_zk != null) { return; } await _semaphoreSlim.WaitAsync(); try { if (_zk == null) { var client = new ZookeeperClient(_sessionTimeout); _watcher = new LeaderWatcher(); _zk = await client.CreateClient(_hostPort); await EnsureExists(ROOT); //确保root已存在 await EnsureLocalNodeExists(); //确保创建当前节点 _watcher.NodeDeletedEvent += () => { return(ElectionLeader()); }; } } finally { _semaphoreSlim.Release(); } }
//static async Task Main(string[] args) //{ // var services = new ServiceCollection() // .AddLogging(builder => builder.AddConsole()); // var serviceProvider = services.BuildServiceProvider(); // var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>(); // var leaderClient = new ZookeeperLeaderClient("192.168.70.131:2181", loggerFactory); // var logger = loggerFactory.CreateLogger<Program>(); // leaderClient.ElectedLeaderEvent += () => // { // logger.LogInformation("成功竞选成为leader"); // return Task.CompletedTask; // }; // await leaderClient.ElectionLeader(); // Console.WriteLine("press any key to exists."); // Console.Read(); // await leaderClient.Close(); //} static async Task Main(string[] args) { string nodeIdentity = Guid.NewGuid().ToString(); Console.WriteLine($"当前节点:{nodeIdentity}"); var client = new ZookeeperClient(); var zk = await client.CreateClient("192.168.70.131:2181"); var electionSupport = new LeaderElectionSupport(zk, "/fairprice/leader", nodeIdentity); int sleepDuration = 3000; await electionSupport.start(); await Task.Delay(sleepDuration); var leader = await electionSupport.getLeaderHostName(); LeaderElectionAwareImp watcher = null; if (leader == nodeIdentity) { Console.WriteLine("当前节点成为leader"); } else { watcher = new LeaderElectionAwareImp(); watcher.ElectionComplted += () => { Console.WriteLine("ELECTED_COMPLETE,当前节点成为leader"); return(Task.CompletedTask); }; electionSupport.addListener(watcher); } //Console.WriteLine("press any key to exists."); Console.Read(); if (watcher != null) { electionSupport.removeListener(watcher); } await electionSupport.stop(); }