Make the meaning of running status consistent

- A running status is STARTING, STARTED, or STOPPING.
- Update related tests.

 Resolves #1483
This commit is contained in:
Marvin Deng
2022-05-11 23:50:19 +08:00
committed by Mahmoud Ben Hassine
parent 930bb0243c
commit bbf35b79f7
12 changed files with 79 additions and 12 deletions

View File

@@ -71,6 +71,7 @@ class BatchStatusTests {
assertFalse(BatchStatus.COMPLETED.isRunning());
assertTrue(BatchStatus.STARTED.isRunning());
assertTrue(BatchStatus.STARTING.isRunning());
assertTrue(BatchStatus.STOPPING.isRunning());
}
@Test

View File

@@ -56,14 +56,19 @@ class JobExecutionTests {
}
/**
* Test method for {@link org.springframework.batch.core.JobExecution#getEndTime()}.
* Test method for {@link org.springframework.batch.core.JobExecution#isRunning()}.
*/
@Test
void testIsRunning() {
LocalDateTime now = LocalDateTime.now();
execution.setStartTime(now);
execution.setStatus(BatchStatus.STARTING);
assertTrue(execution.isRunning());
execution.setEndTime(now.plus(10, ChronoUnit.SECONDS));
execution.setStatus(BatchStatus.STARTED);
assertTrue(execution.isRunning());
execution.setStatus(BatchStatus.STOPPING);
assertTrue(execution.isRunning());
execution.setStatus(BatchStatus.COMPLETED);
assertFalse(execution.isRunning());
execution.setStatus(BatchStatus.FAILED);
assertFalse(execution.isRunning());
}

View File

@@ -363,6 +363,7 @@ class SimpleJobTests {
stepExecution1.setStatus(BatchStatus.COMPLETED);
jobRepository.add(stepExecution1);
jobExecution.setEndTime(LocalDateTime.now());
jobExecution.setStatus(BatchStatus.COMPLETED);
jobRepository.update(jobExecution);
jobExecution = jobRepository.createJobExecution(job.getName(), jobParameters);
job.execute(jobExecution);

View File

@@ -204,6 +204,7 @@ public abstract class AbstractJobExecutionDaoTests {
exec.setCreateTime(now);
exec.setStartTime(now.plus(1, ChronoUnit.SECONDS));
exec.setEndTime(now.plus(2, ChronoUnit.SECONDS));
exec.setStatus(BatchStatus.COMPLETED);
exec.setLastUpdated(now.plus(3, ChronoUnit.SECONDS));
dao.saveJobExecution(exec);
@@ -215,9 +216,17 @@ public abstract class AbstractJobExecutionDaoTests {
exec.setLastUpdated(now.plus(3, ChronoUnit.SECONDS));
dao.saveJobExecution(exec);
// Stopping JobExecution as status is STOPPING
exec = new JobExecution(jobInstance, jobParameters);
exec.setStartTime(now.plus(6, ChronoUnit.SECONDS));
exec.setStatus(BatchStatus.STOPPING);
exec.setLastUpdated(now.plus(7, ChronoUnit.SECONDS));
dao.saveJobExecution(exec);
// Running JobExecution as StartTime is populated but EndTime is null
exec = new JobExecution(jobInstance, jobParameters);
exec.setStartTime(now.plus(2, ChronoUnit.SECONDS));
exec.setStatus(BatchStatus.STARTED);
exec.setLastUpdated(now.plus(3, ChronoUnit.SECONDS));
exec.createStepExecution("step");
dao.saveJobExecution(exec);
@@ -231,7 +240,7 @@ public abstract class AbstractJobExecutionDaoTests {
Set<JobExecution> values = dao.findRunningJobExecutions(exec.getJobInstance().getJobName());
assertEquals(1, values.size());
assertEquals(3, values.size());
JobExecution value = values.iterator().next();
assertEquals(exec, value);
assertEquals(now.plus(3, ChronoUnit.SECONDS), value.getLastUpdated());

View File

@@ -37,6 +37,7 @@ import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.fail;
/**
* Repository tests using JDBC DAOs (rather than mocks).
@@ -76,6 +77,7 @@ class SimpleJobRepositoryIntegrationTests {
assertEquals(job.getName(), firstExecution.getJobInstance().getJobName());
jobRepository.update(firstExecution);
firstExecution.setStatus(BatchStatus.FAILED);
firstExecution.setEndTime(LocalDateTime.now());
jobRepository.update(firstExecution);
JobExecution secondExecution = jobRepository.createJobExecution(job.getName(), jobParams);
@@ -97,6 +99,7 @@ class SimpleJobRepositoryIntegrationTests {
LocalDateTime now = LocalDateTime.now();
firstExecution.setStartTime(now);
firstExecution.setEndTime(now.plus(1, ChronoUnit.SECONDS));
firstExecution.setStatus(BatchStatus.COMPLETED);
jobRepository.update(firstExecution);
JobExecution secondExecution = jobRepository.createJobExecution(job.getName(), jobParameters);
@@ -224,4 +227,48 @@ class SimpleJobRepositoryIntegrationTests {
assertNotNull(jobExecution2);
}
/*
* When a job execution is running, JobExecutionAlreadyRunningException should be
* thrown if trying to create any other ones with same job parameters.
*/
@Transactional
@Test
public void testReExecuteWithSameJobParametersWhenRunning() throws Exception {
JobParameters jobParameters = new JobParametersBuilder().addString("stringKey", "stringValue")
.toJobParameters();
// jobExecution with status STARTING
JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), jobParameters);
try {
jobRepository.createJobExecution(job.getName(), jobParameters);
fail();
}
catch (JobExecutionAlreadyRunningException e) {
// expected
}
// jobExecution with status STARTED
jobExecution.setStatus(BatchStatus.STARTED);
jobExecution.setStartTime(LocalDateTime.now());
jobRepository.update(jobExecution);
try {
jobRepository.createJobExecution(job.getName(), jobParameters);
fail();
}
catch (JobExecutionAlreadyRunningException e) {
// expected
}
// jobExecution with status STOPPING
jobExecution.setStatus(BatchStatus.STOPPING);
jobRepository.update(jobExecution);
try {
jobRepository.createJobExecution(job.getName(), jobParameters);
fail();
}
catch (JobExecutionAlreadyRunningException e) {
// expected
}
}
}

View File

@@ -163,6 +163,7 @@ class JobStepTests {
assertEquals("FOO", stepExecution.getFailureExceptions().get(0).getMessage());
JobExecution jobExecution = stepExecution.getJobExecution();
jobExecution.setEndTime(LocalDateTime.now());
jobExecution.setStatus(BatchStatus.FAILED);
jobRepository.update(jobExecution);
jobExecution = jobRepository.createJobExecution("job", new JobParameters());