@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;
  }