-
Notifications
You must be signed in to change notification settings - Fork 41.4k
Description
Expected Behavior:
A JobParametersIncrementer
is expected to modify the given JobParameters
to provide a modified set of JobParameters
. If the new set of JobParameters
is unique for the Job
then a new JobInstance
will be created.
Actual Behavior:
Before the JobParametersIncrementer
is executed, a JobInstance
is found in the "if" statement on line 206 in method getNextJobParameters(Job job, JobParameters jobParameters)
of JobLauncherApplicationRunner
.
private JobParameters getNextJobParameters(Job job, JobParameters jobParameters) {
if (this.jobRepository != null && this.jobRepository.isJobInstanceExists(job.getName(), jobParameters)) {
return getNextJobParametersForExisting(job, jobParameters);
}
if (job.getJobParametersIncrementer() == null) {
return jobParameters;
}
JobParameters nextParameters = new JobParametersBuilder(jobParameters, this.jobExplorer)
.getNextJobParameters(job).toJobParameters();
return merge(nextParameters, jobParameters);
}
The method getNextJobParametersForExisting(Job job, JobParameters jobParameters)
is then executed which in the case of a 'COMPLETED' JobExecution
will return the original JobParameters
object.
private JobParameters getNextJobParametersForExisting(Job job, JobParameters jobParameters) {
JobExecution lastExecution = this.jobRepository.getLastJobExecution(job.getName(), jobParameters);
if (isStoppedOrFailed(lastExecution) && job.isRestartable()) {
JobParameters previousIdentifyingParameters = getGetIdentifying(lastExecution.getJobParameters());
return merge(previousIdentifyingParameters, jobParameters);
}
return jobParameters;
}
Use Case
Restarting a 'COMPLETED' job using a JobParameterIncrementer
. Below is the JobParameterIncrementer
expected to provide a unique set of JobParameters
for each execution.
package util;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.JobParametersIncrementer;
public class ForceRestart implements JobParametersIncrementer {
private static final long JOB_PARAMETER_MAXIMUM = 1000000;
@Override
public JobParameters getNext(JobParameters params) {
Long random = (long) (Math.random() * JOB_PARAMETER_MAXIMUM);
return new JobParametersBuilder(params).addLong("random", random).toJobParameters();
}
}
Version: 2.2.6.RELEASE