diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java
index 73f9ae3c6..bcdb742e9 100644
--- a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java
+++ b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java
@@ -32,19 +32,16 @@ import org.springframework.core.task.TaskExecutor;
import org.springframework.util.Assert;
/**
- * Simple implementation of the {@link JobLauncher} interface. The Spring Core
- * {@link TaskExecutor} interface is used to launch a {@link Job}. This means
- * that the type of executor set is very important. If a
- * {@link SyncTaskExecutor} is used, then the job will be processed
- * within the same thread that called the launcher. Care
- * should be taken to ensure any users of this class understand fully whether or
- * not the implementation of TaskExecutor used will start tasks synchronously or
- * asynchronously. The default setting uses a synchronous task executor.
+ * Simple implementation of the {@link JobLauncher} interface. The Spring Core {@link TaskExecutor}
+ * interface is used to launch a {@link Job}. This means that the type of executor set is very
+ * important. If a {@link SyncTaskExecutor} is used, then the job will be processed within
+ * the same thread that called the launcher. Care should be taken to ensure any users of
+ * this class understand fully whether or not the implementation of TaskExecutor used will start
+ * tasks synchronously or asynchronously. The default setting uses a synchronous task executor.
*
- * There is only one required dependency of this Launcher, a
- * {@link JobRepository}. The JobRepository is used to obtain a valid
- * JobExecution. The Repository must be used because the provided {@link Job}
- * could be a restart of an existing {@link JobInstance}, and only the
+ * There is only one required dependency of this Launcher, a {@link JobRepository}. The
+ * JobRepository is used to obtain a valid JobExecution. The Repository must be used because the
+ * provided {@link Job} could be a restart of an existing {@link JobInstance}, and only the
* Repository can reliably recreate it.
*
* @author Lucas Ward
@@ -58,24 +55,23 @@ public class SimpleJobLauncher implements JobLauncher, InitializingBean {
private JobRepository jobRepository;
- private TaskExecutor taskExecutor = new SyncTaskExecutor();
+ private TaskExecutor taskExecutor;
/**
- * Run the provided job with the given {@link JobParameters}. The
- * {@link JobParameters} will be used to determine if this is an execution
- * of an existing job instance, or if a new one should be created.
+ * Run the provided job with the given {@link JobParameters}. The {@link JobParameters} will be
+ * used to determine if this is an execution of an existing job instance, or if a new one should
+ * be created.
*
* @param job, the job to be run.
- * @param jobParameters, the {@link JobParameters} for this particular
- * execution.
- * @return JobExecutionAlreadyRunningException if the JobInstance already
- * exists and has an execution already running.
- * @throws JobRestartException if the execution would be a re-start, but a
- * re-start is either not allowed or not needed.
- * @throws JobInstanceAlreadyCompleteException
+ * @param jobParameters, the {@link JobParameters} for this particular execution.
+ * @return JobExecutionAlreadyRunningException if the JobInstance already exists and has an
+ * execution already running.
+ * @throws JobRestartException if the execution would be a re-start, but a re-start is either
+ * not allowed or not needed.
+ * @throws JobInstanceAlreadyCompleteException
*/
public JobExecution run(final Job job, final JobParameters jobParameters)
- throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
+ throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {
Assert.notNull(job, "The Job must not be null.");
Assert.notNull(jobParameters, "The JobParameters must not be null.");
@@ -89,9 +85,8 @@ public class SimpleJobLauncher implements JobLauncher, InitializingBean {
logger.info("Job: [" + job + "] launched with the following parameters: [" + jobParameters + "]");
job.execute(jobExecution);
logger.info("Job: [" + job + "] completed successfully with the following parameters: ["
- + jobParameters + "]");
- }
- catch (Throwable t) {
+ + jobParameters + "]");
+ } catch (Throwable t) {
logger.info("Job: [" + job + "] failed with the following parameters: [" + jobParameters + "]", t);
rethrow(t);
}
@@ -127,12 +122,14 @@ public class SimpleJobLauncher implements JobLauncher, InitializingBean {
}
/**
- * Ensure the required dependencies of a {@link JobRepository} have been
- * set.
+ * Ensure the required dependencies of a {@link JobRepository} have been set.
*/
public void afterPropertiesSet() throws Exception {
Assert.state(jobRepository != null, "A JobRepository has not been set.");
- logger.info("No TaskExecutor has been set, defaulting to synchronous executor.");
+ if (taskExecutor == null) {
+ logger.info("No TaskExecutor has been set, defaulting to synchronous executor.");
+ taskExecutor = new SyncTaskExecutor();
+ }
}
}