code: private CloseableJobListener getParallelCombinedJobListener(JobState jobState, JobListener jobListener) {
      List<JobListener> jobListeners = Lists.newArrayList(this.mandatoryJobListeners);
      jobListeners.add(jobListener);
  
      Set<String> jobListenerClassNames = jobState.getPropAsSet(ConfigurationKeys.JOB_LISTENERS_KEY, StringUtils.EMPTY);
      for (String jobListenerClassName : jobListenerClassNames) {
        try {
          @SuppressWarnings("unchecked")
          Class<? extends JobListener> jobListenerClass =
              (Class<? extends JobListener>) Class.forName(jobListenerClassName);
          jobListeners.add(jobListenerClass.newInstance());
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
          LOG.warn(String.format("JobListener could not be created due to %s", jobListenerClassName), e);
        }
      }
  
      return JobListeners.parallelJobListener(jobListeners);
    }
docs: Combines the specified {@link JobListener} with the {@link #mandatoryJobListeners} for this job. Uses
  {@link JobListeners#parallelJobListener(List)} to create a {@link CloseableJobListener} that will execute all
  the {@link JobListener}s in parallel.