code: public static String startNewPipeline(
        JobSetting[] settings, Job<?> jobInstance, Object... params) {
      UpdateSpec updateSpec = new UpdateSpec(null);
      Job<?> rootJobInstance = jobInstance;
      // If rootJobInstance has exceptionHandler it has to be wrapped to ensure that root job
      // ends up in finalized state in case of exception of run method and
      // exceptionHandler returning a result.
      if (JobRecord.isExceptionHandlerSpecified(jobInstance)) {
        rootJobInstance = new RootJobInstance(jobInstance, settings, params);
        params = new Object[0];
      }
      // Create the root Job and its associated Barriers and Slots
      // Passing null for parent JobRecord and graphGUID
      // Create HandleSlotFilledTasks for the input parameters.
      JobRecord jobRecord = registerNewJobRecord(
          updateSpec, settings, null, null, rootJobInstance, params);
      updateSpec.setRootJobKey(jobRecord.getRootJobKey());
      // Save the Pipeline model objects and enqueue the tasks that start the Pipeline executing.
      backEnd.save(updateSpec, jobRecord.getQueueSettings());
      return jobRecord.getKey().getName();
    }
docs: Creates and launches a new Pipeline
  <p>
  Creates the root Job with its associated Barriers and Slots and saves them
  to the data store. All slots in the root job are immediately filled with
  the values of the parameters to this method, and
  {@link HandleSlotFilledTask HandleSlotFilledTasks} are enqueued for each of
  the filled slots.
  
  @param settings JobSetting array used to control details of the Pipeline
  @param jobInstance A user-supplied instance of {@link Job} that will serve
  as the root job of the Pipeline.
  @param params Arguments to the root job's run() method
  @return The pipelineID of the newly created pipeline, also known as the
  rootJobID.