@Override // @wjw_note: 在Zookeeper上注册ScheduleServer public void registerScheduleServer(ScheduleServer server) throws Exception { if (server.isRegisted() == true) { throw new Exception(server.getUuid() + " 被重复注册"); } String realPath = null; // 此处必须增加UUID作为唯一性保障 StringBuilder id = new StringBuilder(); id.append(server.getIp()) .append("$") .append(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase()); String zkServerPath = pathServer + "/" + id.toString() + "$"; realPath = this.getZooKeeper() .create(zkServerPath, null, this.zkManager.getAcl(), CreateMode.PERSISTENT_SEQUENTIAL); server.setUuid(realPath.substring(realPath.lastIndexOf("/") + 1)); Timestamp heartBeatTime = new Timestamp(getSystemTime()); server.setHeartBeatTime(heartBeatTime); String valueString = this.gson.toJson(server); this.getZooKeeper().setData(realPath, valueString.getBytes(), -1); server.setRegisted(true); }
/** * x发送心跳信息 * * @param server * @throws Exception */ @Override public boolean refreshScheduleServer(ScheduleServer server) throws Exception { Timestamp heartBeatTime = new Timestamp(this.getSystemTime()); String zkPath = this.pathServer + "/" + server.getUuid(); if (this.getZooKeeper().exists(zkPath, false) == null) { // 数据可能被清除,先清除内存数据后,重新注册数据 server.setRegisted(false); return false; } Timestamp oldHeartBeatTime = server.getHeartBeatTime(); server.setHeartBeatTime(heartBeatTime); server.setVersion(server.getVersion() + 1); String valueString = this.gson.toJson(server); try { this.getZooKeeper().setData(zkPath, valueString.getBytes(), -1); } catch (Exception e) { // 恢复上次的心跳时间 server.setHeartBeatTime(oldHeartBeatTime); server.setVersion(server.getVersion() - 1); throw e; } return true; }