@Override
  public RemotingCommand processRequest(ChannelHandlerContext ctx, RemotingCommand request)
      throws RemotingCommandException {

    BizLogSendRequest requestBody = request.getBody();

    List<BizLog> bizLogs = requestBody.getBizLogs();
    if (CollectionUtils.isNotEmpty(bizLogs)) {
      for (BizLog bizLog : bizLogs) {
        JobLogPo jobLogPo = new JobLogPo();
        jobLogPo.setGmtCreated(SystemClock.now());
        jobLogPo.setLogTime(bizLog.getLogTime());
        jobLogPo.setTaskTrackerNodeGroup(bizLog.getTaskTrackerNodeGroup());
        jobLogPo.setTaskTrackerIdentity(bizLog.getTaskTrackerIdentity());
        jobLogPo.setJobId(bizLog.getJobId());
        jobLogPo.setTaskId(bizLog.getTaskId());
        jobLogPo.setMsg(bizLog.getMsg());
        jobLogPo.setSuccess(true);
        jobLogPo.setLevel(bizLog.getLevel());
        jobLogPo.setLogType(LogType.BIZ);
        application.getJobLogger().log(jobLogPo);
      }
    }

    return RemotingCommand.createResponseCommand(
        JobProtos.ResponseCode.BIZ_LOG_SEND_SUCCESS.code(), "");
  }
 public JobPo take(String taskTrackerNodeGroup, String taskTrackerIdentity) {
   while (true) {
     JobPo jobPo = get(taskTrackerNodeGroup);
     if (jobPo == null) {
       return null;
     }
     // update jobPo
     if (lockJob(
         taskTrackerNodeGroup, jobPo.getJobId(), taskTrackerIdentity, jobPo.getTriggerTime())) {
       jobPo.setTaskTrackerIdentity(taskTrackerIdentity);
       jobPo.setIsRunning(true);
       jobPo.setGmtModified(SystemClock.now());
       return jobPo;
     }
   }
 }
    @Override
    public JobWrapper runComplete(Response response) {
      // 发送消息给 JobTracker
      final TaskTrackerJobResult taskTrackerJobResult = new TaskTrackerJobResult();
      taskTrackerJobResult.setTime(SystemClock.now());
      taskTrackerJobResult.setJobWrapper(response.getJobWrapper());
      taskTrackerJobResult.setAction(response.getAction());
      taskTrackerJobResult.setMsg(response.getMsg());
      TtJobFinishedRequest requestBody =
          application.getCommandBodyWrapper().wrapper(new TtJobFinishedRequest());
      requestBody.addJobResult(taskTrackerJobResult);
      requestBody.setReceiveNewJob(response.isReceiveNewJob()); // 设置可以接受新任务

      int requestCode = JobProtos.RequestCode.JOB_FINISHED.code();

      RemotingCommand request = RemotingCommand.createRequestCommand(requestCode, requestBody);

      final Response returnResponse = new Response();

      try {
        final CountDownLatch latch = new CountDownLatch(1);
        remotingClient.invokeAsync(
            request,
            new InvokeCallback() {
              @Override
              public void operationComplete(ResponseFuture responseFuture) {
                try {
                  RemotingCommand commandResponse = responseFuture.getResponseCommand();

                  if (commandResponse != null
                      && commandResponse.getCode() == RemotingProtos.ResponseCode.SUCCESS.code()) {
                    JobPushRequest jobPushRequest = commandResponse.getBody();
                    if (jobPushRequest != null) {
                      LOGGER.info("Get new job :{}", jobPushRequest.getJobWrapper());
                      returnResponse.setJobWrapper(jobPushRequest.getJobWrapper());
                    }
                  } else {
                    LOGGER.info("Job feedback failed, save local files。{}", taskTrackerJobResult);
                    try {
                      retryScheduler.inSchedule(
                          taskTrackerJobResult.getJobWrapper().getJobId().concat("_")
                              + SystemClock.now(),
                          taskTrackerJobResult);
                    } catch (Exception e) {
                      LOGGER.error("Job feedback failed", e);
                    }
                  }
                } finally {
                  latch.countDown();
                }
              }
            });

        try {
          latch.await(Constants.LATCH_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
          throw new RequestTimeoutException(e);
        }
      } catch (JobTrackerNotFoundException e) {
        try {
          LOGGER.warn("No job tracker available! save local files.");
          retryScheduler.inSchedule(
              taskTrackerJobResult.getJobWrapper().getJobId().concat("_") + SystemClock.now(),
              taskTrackerJobResult);
        } catch (Exception e1) {
          LOGGER.error("Save files failed, {}", taskTrackerJobResult.getJobWrapper(), e1);
        }
      }

      return returnResponse.getJobWrapper();
    }