/** 如果需要失效转移, 则设置作业失效转移. */
  public void failoverIfNecessary() {
    if (!needFailover()) {
      return;
    }
    jobNodeStorage.executeInLeader(
        FailoverNode.LATCH,
        new LeaderExecutionCallback() {

          @Override
          public void execute() {
            if (!needFailover()) {
              return;
            }
            int crashedItem =
                Integer.parseInt(
                    jobNodeStorage.getJobNodeChildrenKeys(FailoverNode.ITEMS_ROOT).get(0));
            jobNodeStorage.fillEphemeralJobNode(
                FailoverNode.getExecutionFailoverNode(crashedItem), localHostService.getIp());
            jobNodeStorage.removeJobNodeIfExisted(FailoverNode.getItemsNode(crashedItem));
            JobRegistry.getInstance().getJob(jobConfiguration.getJobName()).triggerJob();
          }
        });
  }