LeaderSelector

让所有 client 竞争,成功竞争成功(也就是获取锁)的就是 Leader

  1. public class LeaderSelectorExample {
  2. public static void main(String[] args) throws Exception {
  3. List<CuratorFramework> clients = Lists.newArrayList();
  4. List<LeaderSelector> leaderSelectors = Lists.newArrayList();
  5. for (int i = 0; i < 10; i++) {
  6. CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", 5000, 5000, new RetryNTimes(3, 1000));
  7. clients.add(client);
  8. client.start();
  9. LeaderSelector leaderSelector = new LeaderSelector(client, "/leaderSelector", new LeaderSelectorListener() {
  10. @Override
  11. public void takeLeadership(CuratorFramework curatorFramework) throws Exception {
  12. // 当 client 被选举为 leader 时,就会回调这个方法
  13. // 利用锁来实现,让所有 client 竞争锁,也就是竞争 leader
  14. System.out.println("当前的 Leader 是 = " + client);
  15. // TODO
  16. TimeUnit.SECONDS.sleep(5);
  17. }
  18. @Override
  19. public void stateChanged(CuratorFramework curatorFramework, ConnectionState connectionState) {
  20. }
  21. });
  22. leaderSelectors.add(leaderSelector);
  23. leaderSelector.start();
  24. }
  25. TimeUnit.SECONDS.sleep(5);
  26. System.out.println("按任意键退出...");
  27. System.in.read();
  28. for (LeaderSelector leaderSelector : leaderSelectors) {
  29. leaderSelector.close();
  30. }
  31. for (CuratorFramework client : clients) {
  32. client.close();
  33. }
  34. }
  35. }

LeaderLatch

获取临时顺序节点中序号最小的值,就是 Leader

public class LeaderLatchExample {

    public static void main(String[] args) throws Exception {
        List<CuratorFramework> clients = Lists.newArrayList();
        List<LeaderLatch> leaderLatches = Lists.newArrayList();

        for (int i = 0; i < 10; i++) {
            CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", 5000, 5000, new RetryNTimes(3, 1000));
            clients.add(client);
            client.start();

            LeaderLatch leaderLatch = new LeaderLatch(client, "/leaderLatch", "leaderLatch#" + i);
            leaderLatches.add(leaderLatch);
            leaderLatch.start();
        }

        TimeUnit.SECONDS.sleep(5);

        // 获取临时顺序节点中序号最小的值,就是 Leader
        for (LeaderLatch leaderLatch : leaderLatches) {
            if (leaderLatch.hasLeadership()) {
                System.out.println("当前 Leader 是" + leaderLatch.getId());
                break;
            }
        }

        System.out.println("按任意键退出...");
        System.in.read();

        for (CuratorFramework client : clients) {
            client.close();
        }
    }
}