docs: private boolean send0(String nodeGroup, final List<JobRunResult> results) {
          // 得到 可用的客户端节点
          JobClientNode jobClientNode = appContext.getJobClientManager().getAvailableJobClient(nodeGroup);
  
          if (jobClientNode == null) {
              return false;
          }
          List<JobResult> jobResults = new ArrayList<JobResult>(results.size());
          for (JobRunResult result : results) {
              JobResult jobResult = new JobResult();
  
              Job job = JobUtils.copy(result.getJobMeta().getJob());
              job.setTaskId(result.getJobMeta().getRealTaskId());
              jobResult.setJob(job);
              jobResult.setSuccess(Action.EXECUTE_SUCCESS.equals(result.getAction()));
              jobResult.setMsg(result.getMsg());
              jobResult.setTime(result.getTime());
              jobResult.setExeSeqId(result.getJobMeta().getInternalExtParam(Constants.EXE_SEQ_ID));
              jobResults.add(jobResult);
          }
  
          JobFinishedRequest requestBody = appContext.getCommandBodyWrapper().wrapper(new JobFinishedRequest());
          requestBody.setJobResults(jobResults);
          RemotingCommand commandRequest = RemotingCommand.createRequestCommand(JobProtos.RequestCode.JOB_COMPLETED.code(), requestBody);
  
          final Holder<Boolean> result = new Holder<Boolean>();
          try {
              final CountDownLatch latch = new CountDownLatch(1);
              getRemotingServer().invokeAsync(jobClientNode.getChannel().getChannel(), commandRequest, new AsyncCallback() {
                  @Override
                  public void operationComplete(ResponseFuture responseFuture) {
                      try {
                          RemotingCommand commandResponse = responseFuture.getResponseCommand();
  
                          if (commandResponse != null && commandResponse.getCode() == JobProtos.ResponseCode.JOB_NOTIFY_SUCCESS.code()) {
                              clientNotifyHandler.handleSuccess(results);
                              result.set(true);
                          } else {
                              result.set(false);
                          }
                      } finally {
                          latch.countDown();
                      }
                  }
              });
  
              try {
                  latch.await(Constants.LATCH_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
              } catch (InterruptedException e) {
                  throw new RequestTimeoutException(e);
              }
  
          } catch (RemotingSendException e) {
              LOGGER.error("Notify client failed!", e);
          }
          return result.get() == null ? false : result.get();
      }