Skip to content

Commit 024dba4

Browse files
fmbenhassinesnicoll
authored andcommitted
Adapt to latest changes in Spring Batch 6
See gh-46447
1 parent 55de634 commit 024dba4

File tree

4 files changed

+33
-71
lines changed

4 files changed

+33
-71
lines changed

module/spring-boot-batch/src/main/java/org/springframework/boot/batch/autoconfigure/BatchAutoConfiguration.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.springframework.batch.core.converter.JobParametersConverter;
2727
import org.springframework.batch.core.launch.JobOperator;
2828
import org.springframework.batch.core.repository.ExecutionContextSerializer;
29-
import org.springframework.batch.core.repository.JobRepository;
3029
import org.springframework.beans.factory.ObjectProvider;
3130
import org.springframework.boot.ExitCodeGenerator;
3231
import org.springframework.boot.autoconfigure.AutoConfiguration;
@@ -82,9 +81,8 @@ public class BatchAutoConfiguration {
8281
@Bean
8382
@ConditionalOnMissingBean
8483
@ConditionalOnBooleanProperty(name = "spring.batch.job.enabled", matchIfMissing = true)
85-
public JobLauncherApplicationRunner jobLauncherApplicationRunner(JobOperator jobOperator,
86-
JobRepository jobRepository, BatchProperties properties) {
87-
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(jobOperator, jobRepository);
84+
public JobLauncherApplicationRunner jobLauncherApplicationRunner(JobOperator jobOperator, BatchProperties properties) {
85+
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(jobOperator);
8886
String jobName = properties.getJob().getName();
8987
if (StringUtils.hasText(jobName)) {
9088
runner.setJobName(jobName);

module/spring-boot-batch/src/main/java/org/springframework/boot/batch/autoconfigure/JobLauncherApplicationRunner.java

Lines changed: 2 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,23 @@
1919
import java.util.Arrays;
2020
import java.util.Collection;
2121
import java.util.Collections;
22-
import java.util.LinkedHashMap;
23-
import java.util.Map;
2422
import java.util.Properties;
2523

2624
import org.apache.commons.logging.Log;
2725
import org.apache.commons.logging.LogFactory;
2826

29-
import org.springframework.batch.core.BatchStatus;
3027
import org.springframework.batch.core.configuration.JobRegistry;
3128
import org.springframework.batch.core.converter.DefaultJobParametersConverter;
3229
import org.springframework.batch.core.converter.JobParametersConverter;
3330
import org.springframework.batch.core.job.Job;
3431
import org.springframework.batch.core.job.JobExecution;
3532
import org.springframework.batch.core.job.JobExecutionException;
36-
import org.springframework.batch.core.job.parameters.JobParameter;
3733
import org.springframework.batch.core.job.parameters.JobParameters;
38-
import org.springframework.batch.core.job.parameters.JobParametersBuilder;
3934
import org.springframework.batch.core.job.parameters.JobParametersInvalidException;
4035
import org.springframework.batch.core.launch.JobOperator;
4136
import org.springframework.batch.core.launch.NoSuchJobException;
4237
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
4338
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
44-
import org.springframework.batch.core.repository.JobRepository;
4539
import org.springframework.batch.core.repository.JobRestartException;
4640
import org.springframework.beans.factory.InitializingBean;
4741
import org.springframework.beans.factory.annotation.Autowired;
@@ -80,8 +74,6 @@ public class JobLauncherApplicationRunner
8074

8175
private final JobOperator jobOperator;
8276

83-
private final JobRepository jobRepository;
84-
8577
private JobRegistry jobRegistry;
8678

8779
private String jobName;
@@ -95,14 +87,10 @@ public class JobLauncherApplicationRunner
9587
/**
9688
* Create a new {@link JobLauncherApplicationRunner}.
9789
* @param jobOperator to launch jobs
98-
* @param jobRepository to check if a job instance exists with the given parameters
99-
* when running a job
10090
*/
101-
public JobLauncherApplicationRunner(JobOperator jobOperator, JobRepository jobRepository) {
91+
public JobLauncherApplicationRunner(JobOperator jobOperator) {
10292
Assert.notNull(jobOperator, "'jobOperator' must not be null");
103-
Assert.notNull(jobRepository, "'jobRepository' must not be null");
10493
this.jobOperator = jobOperator;
105-
this.jobRepository = jobRepository;
10694
}
10795

10896
@Override
@@ -197,46 +185,10 @@ private void executeRegisteredJobs(JobParameters jobParameters) throws JobExecut
197185
protected void execute(Job job, JobParameters jobParameters)
198186
throws JobExecutionAlreadyRunningException, NoSuchJobException, JobRestartException,
199187
JobInstanceAlreadyCompleteException, JobParametersInvalidException {
200-
JobParameters parameters = getNextJobParameters(job, jobParameters);
201-
JobExecution execution = this.jobOperator.start(job, parameters);
188+
JobExecution execution = this.jobOperator.start(job, jobParameters);
202189
if (this.publisher != null) {
203190
this.publisher.publishEvent(new JobExecutionEvent(execution));
204191
}
205192
}
206193

207-
private JobParameters getNextJobParameters(Job job, JobParameters jobParameters) {
208-
if (this.jobRepository != null && this.jobRepository.getJobInstance(job.getName(), jobParameters) != null) {
209-
return getNextJobParametersForExisting(job, jobParameters);
210-
}
211-
if (job.getJobParametersIncrementer() == null) {
212-
return jobParameters;
213-
}
214-
JobParameters nextParameters = new JobParametersBuilder(jobParameters, this.jobRepository)
215-
.getNextJobParameters(job)
216-
.toJobParameters();
217-
return merge(nextParameters, jobParameters);
218-
}
219-
220-
private JobParameters getNextJobParametersForExisting(Job job, JobParameters jobParameters) {
221-
JobExecution lastExecution = this.jobRepository.getLastJobExecution(job.getName(), jobParameters);
222-
if (isStoppedOrFailed(lastExecution) && job.isRestartable()) {
223-
JobParameters previousIdentifyingParameters = new JobParameters(
224-
lastExecution.getJobParameters().getIdentifyingParameters());
225-
return merge(previousIdentifyingParameters, jobParameters);
226-
}
227-
return jobParameters;
228-
}
229-
230-
private boolean isStoppedOrFailed(JobExecution execution) {
231-
BatchStatus status = (execution != null) ? execution.getStatus() : null;
232-
return (status == BatchStatus.STOPPED || status == BatchStatus.FAILED);
233-
}
234-
235-
private JobParameters merge(JobParameters parameters, JobParameters additionals) {
236-
Map<String, JobParameter<?>> merged = new LinkedHashMap<>();
237-
merged.putAll(parameters.getParameters());
238-
merged.putAll(additionals.getParameters());
239-
return new JobParameters(merged);
240-
}
241-
242194
}

module/spring-boot-batch/src/test/java/org/springframework/boot/batch/autoconfigure/BatchAutoConfigurationTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -533,8 +533,7 @@ void defaultJobParametersConverterIsUsed() {
533533
}
534534

535535
private JobLauncherApplicationRunner createInstance(String... registeredJobNames) {
536-
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(mock(JobOperator.class),
537-
mock(JobRepository.class));
536+
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(mock(JobOperator.class));
538537
JobRegistry jobRegistry = mock(JobRegistry.class);
539538
given(jobRegistry.getJobNames()).willReturn(Arrays.asList(registeredJobNames));
540539
runner.setJobRegistry(jobRegistry);

module/spring-boot-batch/src/test/java/org/springframework/boot/batch/autoconfigure/JobLauncherApplicationRunnerTests.java

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,15 @@ void incrementExistingExecution() {
8686
this.contextRunner.run((context) -> {
8787
JobLauncherApplicationRunnerContext jobLauncherContext = new JobLauncherApplicationRunnerContext(context);
8888
Job job = jobLauncherContext.configureJob().incrementer(new RunIdIncrementer()).build();
89-
jobLauncherContext.runner.execute(job, new JobParameters());
90-
jobLauncherContext.runner.execute(job, new JobParameters());
89+
JobParameters jobParameters = new JobParametersBuilder().addString("name", "foo").toJobParameters();
90+
jobLauncherContext.runner.execute(job, jobParameters);
91+
jobLauncherContext.runner.execute(job, jobParameters);
9192
assertThat(jobLauncherContext.jobInstances()).hasSize(2);
9293
});
9394
}
9495

9596
@Test
96-
void retryFailedExecution() {
97+
void retryFailedExecutionWithIncrementer() {
9798
this.contextRunner.run((context) -> {
9899
PlatformTransactionManager transactionManager = context.getBean(PlatformTransactionManager.class);
99100
JobLauncherApplicationRunnerContext jobLauncherContext = new JobLauncherApplicationRunnerContext(context);
@@ -102,7 +103,23 @@ void retryFailedExecution() {
102103
.incrementer(new RunIdIncrementer())
103104
.build();
104105
jobLauncherContext.runner.execute(job, new JobParameters());
105-
jobLauncherContext.runner.execute(job, new JobParametersBuilder().addLong("run.id", 1L).toJobParameters());
106+
jobLauncherContext.runner.execute(job, new JobParameters());
107+
// with an incrementer, we always create a new job instance
108+
assertThat(jobLauncherContext.jobInstances()).hasSize(2);
109+
});
110+
}
111+
112+
@Test
113+
void retryFailedExecutionWithoutIncrementer() {
114+
this.contextRunner.run((context) -> {
115+
PlatformTransactionManager transactionManager = context.getBean(PlatformTransactionManager.class);
116+
JobLauncherApplicationRunnerContext jobLauncherContext = new JobLauncherApplicationRunnerContext(context);
117+
Job job = jobLauncherContext.jobBuilder()
118+
.start(jobLauncherContext.stepBuilder().tasklet(throwingTasklet(), transactionManager).build())
119+
.build();
120+
JobParameters jobParameters = new JobParametersBuilder().addLong("run.id", 1L).toJobParameters();
121+
jobLauncherContext.runner.execute(job, jobParameters);
122+
jobLauncherContext.runner.execute(job, jobParameters);
106123
assertThat(jobLauncherContext.jobInstances()).hasSize(1);
107124
});
108125
}
@@ -134,17 +151,14 @@ void retryFailedExecutionOnNonRestartableJob() {
134151
Job job = jobLauncherContext.jobBuilder()
135152
.preventRestart()
136153
.start(jobLauncherContext.stepBuilder().tasklet(throwingTasklet(), transactionManager).build())
137-
.incrementer(new RunIdIncrementer())
138154
.build();
139-
jobLauncherContext.runner.execute(job, new JobParameters());
140-
jobLauncherContext.runner.execute(job, new JobParameters());
141-
// A failed job that is not restartable does not re-use the job params of
142-
// the last execution, but creates a new job instance when running it again.
143-
assertThat(jobLauncherContext.jobInstances()).hasSize(2);
155+
JobParameters jobParameters = new JobParametersBuilder()
156+
.addString("name", "foo").toJobParameters();
157+
jobLauncherContext.runner.execute(job, jobParameters);
158+
assertThat(jobLauncherContext.jobInstances()).hasSize(1);
144159
assertThatExceptionOfType(JobRestartException.class).isThrownBy(() -> {
145160
// try to re-run a failed execution
146-
jobLauncherContext.runner.execute(job,
147-
new JobParametersBuilder().addLong("run.id", 1L).toJobParameters());
161+
jobLauncherContext.runner.execute(job, jobParameters);
148162
fail("expected JobRestartException");
149163
}).withMessageContaining("JobInstance already exists and is not restartable");
150164
});
@@ -157,9 +171,8 @@ void retryFailedExecutionWithNonIdentifyingParameters() {
157171
JobLauncherApplicationRunnerContext jobLauncherContext = new JobLauncherApplicationRunnerContext(context);
158172
Job job = jobLauncherContext.jobBuilder()
159173
.start(jobLauncherContext.stepBuilder().tasklet(throwingTasklet(), transactionManager).build())
160-
.incrementer(new RunIdIncrementer())
161174
.build();
162-
JobParameters jobParameters = new JobParametersBuilder().addLong("id", 1L, false)
175+
JobParameters jobParameters = new JobParametersBuilder().addLong("run.id", 1L, true)
163176
.addLong("foo", 2L, false)
164177
.toJobParameters();
165178
jobLauncherContext.runner.execute(job, jobParameters);
@@ -200,7 +213,7 @@ static class JobLauncherApplicationRunnerContext {
200213
this.jobBuilder = new JobBuilder("job", jobRepository);
201214
this.job = this.jobBuilder.start(this.step).build();
202215
this.jobRepository = context.getBean(JobRepository.class);
203-
this.runner = new JobLauncherApplicationRunner(jobOperator, jobRepository);
216+
this.runner = new JobLauncherApplicationRunner(jobOperator);
204217
}
205218

206219
List<JobInstance> jobInstances() {

0 commit comments

Comments
 (0)