LeaderSelector
让所有 client 竞争,成功竞争成功(也就是获取锁)的就是 Leader
public class LeaderSelectorExample {public static void main(String[] args) throws Exception {List<CuratorFramework> clients = Lists.newArrayList();List<LeaderSelector> leaderSelectors = 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();LeaderSelector leaderSelector = new LeaderSelector(client, "/leaderSelector", new LeaderSelectorListener() {@Overridepublic void takeLeadership(CuratorFramework curatorFramework) throws Exception {// 当 client 被选举为 leader 时,就会回调这个方法// 利用锁来实现,让所有 client 竞争锁,也就是竞争 leaderSystem.out.println("当前的 Leader 是 = " + client);// TODOTimeUnit.SECONDS.sleep(5);}@Overridepublic void stateChanged(CuratorFramework curatorFramework, ConnectionState connectionState) {}});leaderSelectors.add(leaderSelector);leaderSelector.start();}TimeUnit.SECONDS.sleep(5);System.out.println("按任意键退出...");System.in.read();for (LeaderSelector leaderSelector : leaderSelectors) {leaderSelector.close();}for (CuratorFramework client : clients) {client.close();}}}
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();
}
}
}
