BATCH-1503: UNKNOWN status has to propagate up to JobExecution in FlowJob (works already in SimpleJob).
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user