docs: public Response cancelJob(String taskId, String taskTrackerNodeGroup) {
          checkStart();
  
          final Response response = new Response();
  
          Assert.hasText(taskId, "taskId can not be empty");
          Assert.hasText(taskTrackerNodeGroup, "taskTrackerNodeGroup can not be empty");
  
          JobCancelRequest request = CommandBodyWrapper.wrapper(appContext, new JobCancelRequest());
          request.setTaskId(taskId);
          request.setTaskTrackerNodeGroup(taskTrackerNodeGroup);
  
          RemotingCommand requestCommand = RemotingCommand.createRequestCommand(
                  JobProtos.RequestCode.CANCEL_JOB.code(), request);
  
          try {
              RemotingCommand remotingResponse = remotingClient.invokeSync(requestCommand);
  
              if (JobProtos.ResponseCode.JOB_CANCEL_SUCCESS.code() == remotingResponse.getCode()) {
                  LOGGER.info("Cancel job success taskId={}, taskTrackerNodeGroup={} ", taskId, taskTrackerNodeGroup);
                  response.setSuccess(true);
                  return response;
              }
  
              response.setSuccess(false);
              response.setCode(JobProtos.ResponseCode.valueOf(remotingResponse.getCode()).name());
              response.setMsg(remotingResponse.getRemark());
              LOGGER.warn("Cancel job failed: taskId={}, taskTrackerNodeGroup={}, msg={}", taskId,
                      taskTrackerNodeGroup, remotingResponse.getRemark());
              return response;
  
          } catch (JobTrackerNotFoundException e) {
              response.setSuccess(false);
              response.setCode(ResponseCode.JOB_TRACKER_NOT_FOUND);
              response.setMsg("Can not found JobTracker node!");
              return response;
          }
      }