|
30 | 30 | import org.springframework.batch.core.job.Job; |
31 | 31 | import org.springframework.batch.core.job.JobExecution; |
32 | 32 | import org.springframework.batch.core.job.JobExecutionException; |
| 33 | +import org.springframework.batch.core.job.JobInstance; |
33 | 34 | import org.springframework.batch.core.job.parameters.JobParameter; |
34 | 35 | import org.springframework.batch.core.job.parameters.JobParameters; |
35 | | -import org.springframework.batch.core.job.parameters.JobParametersBuilder; |
36 | 36 | import org.springframework.batch.core.job.parameters.JobParametersIncrementer; |
37 | 37 | import org.springframework.batch.core.job.parameters.JobParametersInvalidException; |
38 | 38 | import org.springframework.batch.core.launch.JobOperator; |
|
50 | 50 | import org.springframework.cloud.task.listener.TaskException; |
51 | 51 | import org.springframework.context.ApplicationEventPublisher; |
52 | 52 | import org.springframework.core.task.TaskExecutor; |
| 53 | +import org.springframework.util.Assert; |
53 | 54 | import org.springframework.util.StringUtils; |
54 | 55 |
|
55 | 56 | /** |
@@ -90,7 +91,7 @@ public class TaskJobLauncherApplicationRunner extends JobLauncherApplicationRunn |
90 | 91 | */ |
91 | 92 | public TaskJobLauncherApplicationRunner(JobOperator jobOperator, JobRepository jobRepository, |
92 | 93 | TaskBatchProperties taskBatchProperties) { |
93 | | - super(jobOperator, jobRepository); |
| 94 | + super(jobOperator); |
94 | 95 | this.taskJobOperator = jobOperator; |
95 | 96 | this.taskJobRepository = jobRepository; |
96 | 97 | this.taskBatchProperties = taskBatchProperties; |
@@ -136,9 +137,12 @@ protected void execute(Job job, JobParameters jobParameters) |
136 | 137 | else { |
137 | 138 | JobParametersIncrementer incrementer = job.getJobParametersIncrementer(); |
138 | 139 | if (incrementer != null) { |
139 | | - JobParameters nextParameters = new JobParametersBuilder(jobParameters, this.taskJobRepository) |
140 | | - .getNextJobParameters(job) |
141 | | - .toJobParameters(); |
| 140 | + // JobParameters nextParameters = new JobParametersBuilder(jobParameters, |
| 141 | + // this.taskJobRepository) |
| 142 | + // .getNextJobParameters(job) |
| 143 | + // .toJobParameters(); |
| 144 | + JobParameters nextParameters = getNextJobParameters(job, new HashMap<>(jobParameters.getParameters()), |
| 145 | + this.taskJobRepository); |
142 | 146 | parameters = merge(nextParameters, jobParameters); |
143 | 147 | } |
144 | 148 | } |
@@ -223,4 +227,51 @@ private JobParameters merge(JobParameters parameters, JobParameters additionals) |
223 | 227 | return new JobParameters(merged); |
224 | 228 | } |
225 | 229 |
|
| 230 | + /** |
| 231 | + * Initializes the {@link JobParameters} based on the state of the {@link Job}. This |
| 232 | + * should be called after all parameters have been entered into the builder. All |
| 233 | + * parameters already set on this builder instance are appended to those retrieved |
| 234 | + * from the job incrementer, overriding any with the same key (this is the same |
| 235 | + * behavior as |
| 236 | + * {@link org.springframework.batch.core.launch.support.CommandLineJobRunner} with the |
| 237 | + * {@code -next} option and |
| 238 | + * {@link org.springframework.batch.core.launch.JobOperator#startNextInstance(String)}). |
| 239 | + * @param job The job for which the {@link JobParameters} are being constructed. |
| 240 | + * @return a reference to this object. |
| 241 | + * |
| 242 | + * @since 4.0 |
| 243 | + */ |
| 244 | + public JobParameters getNextJobParameters(Job job, Map<String, JobParameter<?>> parameterMap, |
| 245 | + JobRepository taskJobRepository) { |
| 246 | + Assert.notNull(job, "Job must not be null"); |
| 247 | + Assert.notNull(job.getJobParametersIncrementer(), |
| 248 | + "No job parameters incrementer found for job=" + job.getName()); |
| 249 | + |
| 250 | + String name = job.getName(); |
| 251 | + JobParameters nextParameters; |
| 252 | + JobInstance lastInstance = taskJobRepository.getLastJobInstance(name); |
| 253 | + JobParametersIncrementer incrementer = job.getJobParametersIncrementer(); |
| 254 | + if (lastInstance == null) { |
| 255 | + // Start from a completely clean sheet |
| 256 | + nextParameters = incrementer.getNext(new JobParameters()); |
| 257 | + } |
| 258 | + else { |
| 259 | + JobExecution previousExecution = taskJobRepository.getLastJobExecution(lastInstance); |
| 260 | + if (previousExecution == null) { |
| 261 | + // Normally this will not happen - an instance exists with no executions |
| 262 | + nextParameters = incrementer.getNext(new JobParameters()); |
| 263 | + } |
| 264 | + else { |
| 265 | + nextParameters = incrementer.getNext(previousExecution.getJobParameters()); |
| 266 | + } |
| 267 | + } |
| 268 | + |
| 269 | + // start with parameters from the incrementer |
| 270 | + Map<String, JobParameter<?>> nextParametersMap = new HashMap<>(nextParameters.getParameters()); |
| 271 | + // append new parameters (overriding those with the same key) |
| 272 | + nextParametersMap.putAll(parameterMap); |
| 273 | + parameterMap = nextParametersMap; |
| 274 | + return new JobParameters(parameterMap); |
| 275 | + } |
| 276 | + |
226 | 277 | } |
0 commit comments