标签:
1、原理
2、架构图
3、流程图
4、核心代码
public WorkServer(final ServerData serverData) { this.serverData = serverData; dataListener = new IZkDataListener() { @Override public void handleDataChange(String s, Object o) throws Exception { } @Override public void handleDataDeleted(String s) throws Exception { //toBeMaster(); //适应网络抖动 if(null!=masterData && masterData.getName().equals(serverData.getName())) { toBeMaster(); }else{ executorService.schedule(new Runnable() { @Override public void run() { toBeMaster(); } },10, TimeUnit.SECONDS); } } }; }
适应网络抖动:当网络发生异常可能会出现短时间的断开,发生此情况时给予节点创建的延时,如果上次保存Master信息为当前节点,则此次Master节点争抢会有10秒钟的优势
public void toBeMaster() { if(!running) return; //创建临时节点,session连接失败自动删除 try{ zkClient.create(MASTER_NOTE,serverData, CreateMode.EPHEMERAL); masterData = serverData; System.out.println("当前master:"+masterData.getName()); //测试使用,每5秒释放master节点 if(checkMaster()) { executorService.schedule(new Runnable() { @Override public void run() { releaseMaster(); } },detay,TimeUnit.SECONDS); } }catch (ZkNodeExistsException e){ //如果master节点已经存在 读取 ServerData data = zkClient.readData(MASTER_NOTE,true); //数据为空说明此时master 宕机 if(null==data){ toBeMaster(); }else{ masterData = data; } } }
ZkNodeExistsException :说明已存在Master节点
标签:
原文地址:http://www.cnblogs.com/shengkejava/p/5726794.html