Skip to content

Commit 1d9536c

Browse files
quafffmbenhassine
authored andcommitted
Improve JobRepositoryTestUtils to mitigate OptimisticLockingFailureException while removing JobExecution
It's safe to remove stale version of JobExecution for testing purpose, this commit mitigate OptimisticLockingFailureException but cannot avoid since race condition may happen. Fix GH-5161 Signed-off-by: Yanming Zhou <[email protected]>
1 parent b024116 commit 1d9536c

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

spring-batch-test/src/main/java/org/springframework/batch/test/JobRepositoryTestUtils.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,11 @@ public void removeJobExecutions(Collection<JobExecution> jobExecutions) {
151151
* @param jobExecution the {@link JobExecution} to delete
152152
*/
153153
public void removeJobExecution(JobExecution jobExecution) {
154-
this.jobRepository.deleteJobExecution(jobExecution);
154+
// query latest version of JobExecution to avoid OptimisticLockingFailureException
155+
jobExecution = this.jobRepository.getJobExecution(jobExecution.getId());
156+
if (jobExecution != null) {
157+
this.jobRepository.deleteJobExecution(jobExecution);
158+
}
155159
}
156160

157161
/**
@@ -165,7 +169,7 @@ public void removeJobExecutions() {
165169
List<JobInstance> jobInstances = this.jobRepository.findJobInstances(jobName);
166170
for (JobInstance jobInstance : jobInstances) {
167171
List<JobExecution> jobExecutions = this.jobRepository.getJobExecutions(jobInstance);
168-
if (jobExecutions != null && !jobExecutions.isEmpty()) {
172+
if (!jobExecutions.isEmpty()) {
169173
removeJobExecutions(jobExecutions);
170174
}
171175
}

spring-batch-test/src/test/java/org/springframework/batch/test/JobRepositoryTestUtilsTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
/**
4242
* @author Dave Syer
4343
* @author Mahmoud Ben Hassine
44+
* @author Yanming Zhou
4445
*
4546
*/
4647
@SpringJUnitConfig(locations = "/simple-job-launcher-context.xml")
@@ -139,4 +140,33 @@ void testRemoveJobExecutions() throws Exception {
139140
assertEquals(0, JdbcTestUtils.countRowsInTable(jdbcTemplate, "BATCH_JOB_EXECUTION"));
140141
}
141142

143+
@Test
144+
void testRemoveJobExecution() throws Exception {
145+
// given
146+
utils = new JobRepositoryTestUtils(jobRepository);
147+
JobExecution jobExecution = utils.createJobExecutions(1).get(0);
148+
assertEquals(1, JdbcTestUtils.countRowsInTable(jdbcTemplate, "BATCH_JOB_EXECUTION"));
149+
assertEquals(1, JdbcTestUtils.countRowsInTable(jdbcTemplate, "BATCH_STEP_EXECUTION"));
150+
151+
// when
152+
jobExecution.setVersion(-1); // simulate stale version
153+
utils.removeJobExecution(jobExecution);
154+
155+
// then
156+
assertEquals(0, JdbcTestUtils.countRowsInTable(jdbcTemplate, "BATCH_STEP_EXECUTION"));
157+
assertEquals(0, JdbcTestUtils.countRowsInTable(jdbcTemplate, "BATCH_JOB_EXECUTION"));
158+
159+
List<JobExecution> jobExecutions = utils.createJobExecutions("test", new String[] { "step1", "step2" }, 2);
160+
assertEquals(2, JdbcTestUtils.countRowsInTable(jdbcTemplate, "BATCH_JOB_EXECUTION"));
161+
assertEquals(4, JdbcTestUtils.countRowsInTable(jdbcTemplate, "BATCH_STEP_EXECUTION"));
162+
163+
// when
164+
jobExecutions.forEach(je -> je.setVersion(-1)); // simulate stale version
165+
utils.removeJobExecutions(jobExecutions);
166+
167+
// then
168+
assertEquals(0, JdbcTestUtils.countRowsInTable(jdbcTemplate, "BATCH_STEP_EXECUTION"));
169+
assertEquals(0, JdbcTestUtils.countRowsInTable(jdbcTemplate, "BATCH_JOB_EXECUTION"));
170+
}
171+
142172
}

0 commit comments

Comments
 (0)