docs: @Override
      public Entry<Long, Future<?>> startJob(WSJobInstance jobInstance,
                                             IJobXMLSource jobXML,
                                             Properties jobParameters,
                                             long executionId) throws JobStartException {
  
          traceJobXML(jobXML);
          // Check BatchStatus instead of InstanceState since this narrows the window
          // of a restart changing the status after a stop has occurred.  InstanceState
          // gets changed early; whereas BatchStatus changes right before the job is executed.
          JobInstanceEntity instanceEntity = getPersistenceManagerService().getJobInstance(jobInstance.getInstanceId());
          if (instanceEntity.getBatchStatus() == BatchStatus.STOPPED) {
              // Do not continue with the execution.  Instance has been stopped.
              throw new JobStoppedOnStartException();
          }
  
          RuntimeJobExecution jobExecution = jobExecutionHelper.createJobStartExecution(jobInstance, jobXML, jobParameters, executionId);
  
          BatchJobWorkUnit batchWork = new BatchJobWorkUnit(this, jobExecution, jobExecutionStartCallbacks, jobExecutionEndCallbacks, tranMgr);
          registerExecutingJob(jobExecution.getTopLevelExecutionId(), batchWork);
  
          Future<?> futureWork = null;
  
          try {
              // Set server id and rest URL since this is now a viable execution.
              getPersistenceManagerService().updateJobExecutionServerIdAndRestUrlForStartingJob(jobExecution.getTopLevelExecutionId());
              futureWork = executorService.executeTask(batchWork, null);
          } catch (RuntimeException e) {
              workUnitCompleted(batchWork);
              throw e;
          } catch (JobStoppedException e) {
              workUnitCompleted(batchWork);
              throw new BatchContainerRuntimeException(e);
          }
  
          return new AbstractMap.SimpleEntry<Long, Future<?>>(jobExecution.getTopLevelExecutionId(), futureWork);
      }