/**
  * 获取运行在本作业服务器的被失效转移的序列号.
  *
  * @return 运行在本作业服务器的被失效转移的序列号
  */
 public List<Integer> getLocalHostTakeOffItems() {
   List<Integer> shardingItems = shardingService.getLocalHostShardingItems();
   List<Integer> result = new ArrayList<>(shardingItems.size());
   for (int each : shardingItems) {
     if (jobNodeStorage.isJobNodeExisted(FailoverNode.getExecutionFailoverNode(each))) {
       result.add(each);
     }
   }
   return result;
 }
 /**
  * 获取运行在本作业服务器的失效转移序列号.
  *
  * @return 运行在本作业服务器的失效转移序列号
  */
 public List<Integer> getLocalHostFailoverItems() {
   List<String> items = jobNodeStorage.getJobNodeChildrenKeys(ExecutionNode.ROOT);
   List<Integer> result = new ArrayList<>(items.size());
   String ip = localHostService.getIp();
   for (String each : items) {
     int item = Integer.parseInt(each);
     String node = FailoverNode.getExecutionFailoverNode(item);
     if (jobNodeStorage.isJobNodeExisted(node)
         && ip.equals(jobNodeStorage.getJobNodeDataDirectly(node))) {
       result.add(item);
     }
   }
   Collections.sort(result);
   return result;
 }
 private boolean isFailoverAssigned(final Integer item) {
   return jobNodeStorage.isJobNodeExisted(FailoverNode.getExecutionFailoverNode(item));
 }
 /**
  * 设置失效的分片项标记.
  *
  * @param item 崩溃的作业项
  */
 public void setCrashedFailoverFlag(final int item) {
   if (!isFailoverAssigned(item)) {
     jobNodeStorage.createJobNodeIfNeeded(FailoverNode.getItemsNode(item));
   }
 }
 /** 删除作业失效转移信息. */
 public void removeFailoverInfo() {
   for (String each : jobNodeStorage.getJobNodeChildrenKeys(ExecutionNode.ROOT)) {
     jobNodeStorage.removeJobNodeIfExisted(
         FailoverNode.getExecutionFailoverNode(Integer.parseInt(each)));
   }
 }
 /**
  * 更新执行完毕失效转移的分片项状态.
  *
  * @param items 执行完毕失效转移的分片项列表
  */
 public void updateFailoverComplete(final List<Integer> items) {
   for (int each : items) {
     jobNodeStorage.removeJobNodeIfExisted(FailoverNode.getExecutionFailoverNode(each));
   }
 }