RESOLVED - issue BATCH-1171: Interrupted step does not fail job.

Added check for STOPPED status in AbstractJob.
This commit is contained in:
dsyer
2009-03-23 10:52:55 +00:00
parent 6b1e440a67
commit 56de18f884
7 changed files with 213 additions and 27 deletions

View File

@@ -341,26 +341,13 @@ public class SimpleJobTests {
"no steps configured") >= 0);
}
// public void testNoStepsExecuted() throws Exception {
// StepExecution completedExecution = new
// StepExecution("completedExecution", jobExecution);
// completedExecution.setStatus(BatchStatus.COMPLETED);
//
// job.execute(jobExecution);
// ExitStatus exitStatus = jobExecution.getExitStatus();
// assertEquals(ExitStatus.NOOP.getExitCode(), exitStatus.getExitCode());
// assertTrue("Wrong message in execution: " + exitStatus,
// exitStatus.getExitDescription().contains(
// "steps already completed"));
// }
@Test
public void testNotExecutedIfAlreadyStopped() throws Exception {
jobExecution.stop();
job.execute(jobExecution);
assertEquals(0, list.size());
checkRepository(BatchStatus.FAILED, ExitStatus.NOOP);
checkRepository(BatchStatus.STOPPED, ExitStatus.NOOP);
ExitStatus exitStatus = jobExecution.getExitStatus();
assertEquals(ExitStatus.NOOP.getExitCode(), exitStatus.getExitCode());
}
@@ -454,7 +441,7 @@ public class SimpleJobTests {
assertNull("Second step was not supposed to be executed", step2.passedInStepContext);
}
@Test
public void testGetStepExists() {
step1 = new StubStep("step1", jobRepository);
@@ -546,7 +533,7 @@ public class SimpleJobTests {
stepExecution.setExitStatus(ExitStatus.FAILED);
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.addFailureException(exception);
throw (JobInterruptedException)exception;
throw (JobInterruptedException) exception;
}
if (exception instanceof RuntimeException) {
stepExecution.setExitStatus(ExitStatus.FAILED);

View File

@@ -28,6 +28,7 @@ import org.junit.Test;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobInterruptedException;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.Step;
@@ -38,7 +39,13 @@ import org.springframework.batch.core.job.flow.support.state.DecisionState;
import org.springframework.batch.core.job.flow.support.state.EndState;
import org.springframework.batch.core.job.flow.support.state.StepState;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.dao.JobExecutionDao;
import org.springframework.batch.core.repository.dao.MapExecutionContextDao;
import org.springframework.batch.core.repository.dao.MapJobExecutionDao;
import org.springframework.batch.core.repository.dao.MapJobInstanceDao;
import org.springframework.batch.core.repository.dao.MapStepExecutionDao;
import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean;
import org.springframework.batch.core.repository.support.SimpleJobRepository;
import org.springframework.batch.core.step.StepSupport;
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
@@ -53,15 +60,19 @@ public class FlowJobTests {
private JobExecution jobExecution;
private JobRepository jobRepository;
private boolean fail = false;
private JobExecutionDao jobExecutionDao;
@Before
public void setUp() throws Exception {
MapJobRepositoryFactoryBean.clear();
MapJobRepositoryFactoryBean factory = new MapJobRepositoryFactoryBean();
factory.setTransactionManager(new ResourcelessTransactionManager());
factory.afterPropertiesSet();
jobExecutionDao = new MapJobExecutionDao();
jobRepository = new SimpleJobRepository(new MapJobInstanceDao(), jobExecutionDao, new MapStepExecutionDao(), new MapExecutionContextDao());
jobRepository = (JobRepository) factory.getObject();
job.setJobRepository(jobRepository);
jobExecution = jobRepository.createJobExecution("job", new JobParameters());
@@ -181,6 +192,29 @@ public class FlowJobTests {
assertEquals(BatchStatus.STOPPED, jobExecution.getStatus());
}
@Test
public void testInterrupted() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1") {
@Override
public void execute(StepExecution stepExecution) throws JobInterruptedException {
stepExecution.setStatus(BatchStatus.STOPPING);
jobRepository.update(stepExecution);
}
}), "end0"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0")));
flow.setStateTransitions(transitions);
flow.afterPropertiesSet();
job.setFlow(flow);
job.afterPropertiesSet();
job.execute(jobExecution);
assertEquals(BatchStatus.STOPPED, jobExecution.getStatus());
checkRepository(BatchStatus.STOPPED, ExitStatus.STOPPED);
assertEquals(1, jobExecution.getAllFailureExceptions().size());
assertEquals(JobInterruptedException.class, jobExecution.getFailureExceptions().get(0).getClass());
}
@Test
public void testEndStateStopped() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
@@ -418,4 +452,15 @@ public class FlowJobTests {
return null;
}
private void checkRepository(BatchStatus status, ExitStatus exitStatus) {
// because map dao stores in memory, it can be checked directly
JobInstance jobInstance = jobExecution.getJobInstance();
JobExecution other = (JobExecution) jobExecutionDao.findJobExecutions(jobInstance).get(0);
assertEquals(jobInstance.getId(), other.getJobId());
assertEquals(status, other.getStatus());
if (exitStatus != null) {
assertEquals(exitStatus.getExitCode(), other.getExitStatus().getExitCode());
}
}
}