BATCH-1503: UNKNOWN status has to propagate up to JobExecution in FlowJob (works already in SimpleJob).

This commit is contained in:
dsyer
2010-02-07 15:30:59 +00:00
parent 2c66ca1140
commit 025828fa4c
6 changed files with 254 additions and 86 deletions

View File

@@ -1,19 +1,61 @@
package org.springframework.batch.core.job;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInterruptedException;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean;
import org.springframework.batch.core.step.StepSupport;
/**
* Test suite for various failure scenarios during job processing.
*
* @author Lucas Ward
*
* @author Dave Syer
*
*/
public class SimpleJobFailureTests {
@Test
public void testStepFailure(){
private SimpleJob job = new SimpleJob("job");
private JobExecution execution;
@Before
public void init() throws Exception {
JobRepository jobRepository = new MapJobRepositoryFactoryBean().getJobRepository();
job.setJobRepository(jobRepository);
execution = jobRepository.createJobExecution("job", new JobParameters());
}
@Test
public void testStepFailure() throws Exception {
job.setSteps(Arrays.<Step> asList(new StepSupport("step")));
job.execute(execution);
assertEquals(BatchStatus.FAILED, execution.getStatus());
}
@Test
public void testStepStatusUnknown() throws Exception {
job.setSteps(Arrays.<Step> asList(new StepSupport("step") {
@Override
public void execute(StepExecution stepExecution) throws JobInterruptedException,
UnexpectedJobExecutionException {
// This is what happens if the repository meta-data cannot be updated
stepExecution.setStatus(BatchStatus.UNKNOWN);
}
}));
job.execute(execution);
assertEquals(BatchStatus.UNKNOWN, execution.getStatus());
}
}

View File

@@ -0,0 +1,86 @@
package org.springframework.batch.core.job.flow;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
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.JobInterruptedException;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.batch.core.job.flow.support.SimpleFlow;
import org.springframework.batch.core.job.flow.support.StateTransition;
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.support.MapJobRepositoryFactoryBean;
import org.springframework.batch.core.step.StepSupport;
/**
* Test suite for various failure scenarios during job processing.
*
* @author Lucas Ward
* @author Dave Syer
*
*/
public class FlowJobFailureTests {
private FlowJob job = new FlowJob();
private JobExecution execution;
@Before
public void init() throws Exception {
JobRepository jobRepository = new MapJobRepositoryFactoryBean().getJobRepository();
job.setJobRepository(jobRepository);
execution = jobRepository.createJobExecution("job", new JobParameters());
}
@Test
public void testStepFailure() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
StepState step = new StepState(new StepSupport("step"));
transitions.add(StateTransition.createStateTransition(step, ExitStatus.FAILED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(step, ExitStatus.COMPLETED.getExitCode(), "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end1")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
job.execute(execution);
assertEquals(BatchStatus.FAILED, execution.getStatus());
}
@Test
public void testStepStatusUnknown() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
StepState step = new StepState(new StepSupport("step") {
@Override
public void execute(StepExecution stepExecution) throws JobInterruptedException,
UnexpectedJobExecutionException {
// This is what happens if the repository meta-data cannot be
// updated
stepExecution.setExitStatus(ExitStatus.UNKNOWN);
stepExecution.setStatus(BatchStatus.UNKNOWN);
}
});
transitions.add(StateTransition.createStateTransition(step, ExitStatus.FAILED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(step, "*", "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end1")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
job.execute(execution);
assertEquals(BatchStatus.UNKNOWN, execution.getStatus());
}
}

View File

@@ -222,7 +222,7 @@ public class TaskletStepExceptionTests {
}
@Test
public void testRepositoryError() throws Exception {
public void testRepositoryErrorOnExecutionContext() throws Exception {
taskletStep.setTasklet(new Tasklet() {
@@ -232,7 +232,7 @@ public class TaskletStepExceptionTests {
});
jobRepository.setFailOnUpdate(true);
jobRepository.setFailOnUpdateExecutionContext(true);
taskletStep.execute(stepExecution);
assertEquals(UNKNOWN, stepExecution.getStatus());
Throwable e = stepExecution.getFailureExceptions().get(0);
@@ -240,6 +240,25 @@ public class TaskletStepExceptionTests {
}
@Test
public void testRepositoryErrorOnUpdateStepExecution() throws Exception {
taskletStep.setTasklet(new Tasklet() {
public RepeatStatus execute(StepContribution contribution, ChunkContext attributes) throws Exception {
return RepeatStatus.FINISHED;
}
});
jobRepository.setFailOnUpdateStepExecution(1);
taskletStep.execute(stepExecution);
assertEquals(UNKNOWN, stepExecution.getStatus());
Throwable e = stepExecution.getFailureExceptions().get(0);
assertEquals("Expected exception in step execution persistence", e.getMessage());
}
@Test
public void testRepositoryErrorOnFailure() throws Exception {
@@ -251,7 +270,7 @@ public class TaskletStepExceptionTests {
});
jobRepository.setFailOnUpdate(true);
jobRepository.setFailOnUpdateExecutionContext(true);
taskletStep.execute(stepExecution);
assertEquals(UNKNOWN, stepExecution.getStatus());
Throwable e = stepExecution.getFailureExceptions().get(0);
@@ -301,10 +320,16 @@ public class TaskletStepExceptionTests {
private int updateCount = 0;
private boolean failOnUpdate = false;
private boolean failOnUpdateContext = false;
public void setFailOnUpdate(boolean failOnUpdate) {
this.failOnUpdate = failOnUpdate;
private int failOnUpdateExecution = -1;
public void setFailOnUpdateExecutionContext(boolean failOnUpdate) {
this.failOnUpdateContext = failOnUpdate;
}
public void setFailOnUpdateStepExecution(int failOnUpdate) {
this.failOnUpdateExecution = failOnUpdate;
}
public void add(StepExecution stepExecution) {
@@ -331,11 +356,14 @@ public class TaskletStepExceptionTests {
}
public void update(StepExecution stepExecution) {
if (updateCount==failOnUpdateExecution) {
throw new RuntimeException("Expected exception in step execution persistence");
}
updateCount++;
}
public void updateExecutionContext(StepExecution stepExecution) {
if (failOnUpdate) {
if (failOnUpdateContext) {
throw new RuntimeException("Expected exception in step execution context persistence");
}
}