docs: private JobPushResult send(final RemotingServerDelegate remotingServer, int size, final TaskTrackerNode taskTrackerNode) {
  
          final String nodeGroup = taskTrackerNode.getNodeGroup();
          final String identity = taskTrackerNode.getIdentity();
  
          JobSender.SendResult sendResult = appContext.getJobSender().send(nodeGroup, identity, size, new JobSender.SendInvoker() {
              @Override
              public JobSender.SendResult invoke(final List<JobPo> jobPos) {
  
                  // 发送给TaskTracker执行
                  JobPushRequest body = appContext.getCommandBodyWrapper().wrapper(new JobPushRequest());
                  body.setJobMetaList(JobDomainConverter.convert(jobPos));
                  RemotingCommand commandRequest = RemotingCommand.createRequestCommand(JobProtos.RequestCode.PUSH_JOB.code(), body);
  
                  // 是否分发推送任务成功
                  final Holder<Boolean> pushSuccess = new Holder<Boolean>(false);
  
                  final CountDownLatch latch = new CountDownLatch(1);
                  try {
                      remotingServer.invokeAsync(taskTrackerNode.getChannel().getChannel(), commandRequest, new AsyncCallback() {
                          @Override
                          public void operationComplete(ResponseFuture responseFuture) {
                              try {
                                  RemotingCommand responseCommand = responseFuture.getResponseCommand();
                                  if (responseCommand == null) {
                                      LOGGER.warn("Job push failed! response command is null!");
                                      return;
                                  }
                                  if (responseCommand.getCode() == JobProtos.ResponseCode.JOB_PUSH_SUCCESS.code()) {
                                      if (LOGGER.isDebugEnabled()) {
                                          LOGGER.debug("Job push success! nodeGroup=" + nodeGroup + ", identity=" + identity + ", jobList=" + JSON.toJSONString(jobPos));
                                      }
                                      pushSuccess.set(true);
                                      stat.incPushJobNum(jobPos.size());
                                  } else if (responseCommand.getCode() == JobProtos.ResponseCode.NO_AVAILABLE_JOB_RUNNER.code()) {
                                      JobPushResponse jobPushResponse = responseCommand.getBody();
                                      if (jobPushResponse != null && CollectionUtils.isNotEmpty(jobPushResponse.getFailedJobIds())) {
                                          // 修复任务
                                          for (String jobId : jobPushResponse.getFailedJobIds()) {
                                              for (JobPo jobPo : jobPos) {
                                                  if (jobId.equals(jobPo.getJobId())) {
                                                      resumeJob(jobPo);
                                                      break;
                                                  }
                                              }
                                          }
                                          stat.incPushJobNum(jobPos.size() - jobPushResponse.getFailedJobIds().size());
                                      } else {
                                          stat.incPushJobNum(jobPos.size());
                                      }
                                      pushSuccess.set(true);
                                  }
  
                              } finally {
                                  latch.countDown();
                              }
                          }
                      });
  
                  } catch (RemotingSendException e) {
                      LOGGER.error("Remoting send error, jobPos={}", JSON.toJSONObject(jobPos), e);
                      return new JobSender.SendResult(false, JobPushResult.SENT_ERROR);
                  }
  
                  try {
                      latch.await(Constants.LATCH_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
                  } catch (InterruptedException e) {
                      throw new RequestTimeoutException(e);
                  }
  
                  if (!pushSuccess.get()) {
                      if (LOGGER.isDebugEnabled()) {
                          LOGGER.debug("Job push failed! nodeGroup=" + nodeGroup + ", identity=" + identity + ", jobs=" + JSON.toJSONObject(jobPos));
                      }
                      for (JobPo jobPo : jobPos) {
                          resumeJob(jobPo);
                      }
                      return new JobSender.SendResult(false, JobPushResult.SENT_ERROR);
                  }
  
                  return new JobSender.SendResult(true, JobPushResult.SUCCESS);
              }
          });
  
          return (JobPushResult) sendResult.getReturnValue();
      }