RESOLVED - issue BATCH-1011: Need distinction between "stop" and "end" transitions?

Push JobExecution status update out of the EndState and back into FlowJob (via FlowExecutor).
This commit is contained in:
dsyer
2009-02-17 13:11:33 +00:00
parent 3836cd9597
commit 365fd46744
23 changed files with 263 additions and 399 deletions

View File

@@ -26,6 +26,7 @@ import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
import org.springframework.batch.core.job.flow.JobExecutionDecider;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean;
@@ -34,22 +35,21 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Dave Syer
*
*
*/
@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class DecisionJobParserTests {
@Autowired
@Qualifier("job")
private Job job;
@Autowired
private JobRepository jobRepository;
@Before
public void setUp() {
MapJobRepositoryFactoryBean.clear();
@@ -63,10 +63,10 @@ public class DecisionJobParserTests {
assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
assertEquals(1, jobExecution.getStepExecutions().size());
}
public static class TestDecider implements JobExecutionDecider {
public String decide(JobExecution jobExecution, StepExecution stepExecution) {
return "FOO";
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
return new FlowExecutionStatus("FOO");
}
}

View File

@@ -50,7 +50,7 @@ public class EndTransitionJobParserTests extends AbstractJobParserTests {
assertTrue(stepNamesList.contains("fail"));
assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
assertEquals("EARLY TERMINATION (FAIL)", jobExecution.getExitStatus().getExitCode());
assertEquals("COMPLETED EARLY TERMINATION", jobExecution.getExitStatus().getExitCode());
StepExecution stepExecution1 = getStepExecution(jobExecution, "s1");
assertEquals(BatchStatus.COMPLETED, stepExecution1.getStatus());

View File

@@ -48,7 +48,7 @@ public class FailTransitionJobParserTests extends AbstractJobParserTests {
assertTrue(stepNamesList.contains("fail"));
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals("EARLY TERMINATION (FAIL)", jobExecution.getExitStatus()
assertEquals("FAILED EARLY TERMINATION", jobExecution.getExitStatus()
.getExitCode());
StepExecution stepExecution1 = getStepExecution(jobExecution, "s1");

View File

@@ -24,6 +24,7 @@ import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
import org.springframework.batch.core.job.flow.JobExecutionDecider;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -73,8 +74,8 @@ public class StopJobParserTests extends AbstractJobParserTests {
}
public static class TestDecider implements JobExecutionDecider {
public String decide(JobExecution jobExecution, StepExecution stepExecution) {
return "FOO";
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
return new FlowExecutionStatus("FOO");
}
}

View File

@@ -64,26 +64,20 @@ public class FlowJobTests {
factory.afterPropertiesSet();
jobRepository = (JobRepository) factory.getObject();
job.setJobRepository(jobRepository);
jobExecution = jobRepository.createJobExecution("job",
new JobParameters());
jobExecution = jobRepository.createJobExecution("job", new JobParameters());
}
@Test
public void testTwoSteps() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "step2"));
transitions.add(StateTransition
.createStateTransition(new StepState(new StubStep("step2")),
ExitStatus.FAILED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(),
"end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end1")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.FAILED
.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")),
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();
@@ -97,18 +91,14 @@ public class FlowJobTests {
public void testFailedStep() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StateSupport(
"step1", FlowExecutionStatus.FAILED), "step2"));
transitions.add(StateTransition
.createStateTransition(new StepState(new StubStep("step2")),
ExitStatus.FAILED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(),
"end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end1")));
transitions.add(StateTransition.createStateTransition(new StateSupport("step1", FlowExecutionStatus.FAILED),
"step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.FAILED
.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")),
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();
@@ -123,30 +113,24 @@ public class FlowJobTests {
public void testFailedStepRestarted() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2"));
State step2State = new StateSupport("step2") {
@Override
public FlowExecutionStatus handle(FlowExecutor executor)
throws Exception {
public FlowExecutionStatus handle(FlowExecutor executor) throws Exception {
JobExecution jobExecution = executor.getJobExecution();
jobExecution.getStepExecutions().add(
new StepExecution(getName(), jobExecution));
jobExecution.getStepExecutions().add(new StepExecution(getName(), jobExecution));
if (fail) {
return FlowExecutionStatus.FAILED;
} else {
}
else {
return FlowExecutionStatus.COMPLETED;
}
}
};
transitions.add(StateTransition.createStateTransition(step2State,
ExitStatus.COMPLETED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(step2State,
ExitStatus.FAILED.getExitCode(), "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end1")));
transitions.add(StateTransition.createStateTransition(step2State, ExitStatus.COMPLETED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(step2State, ExitStatus.FAILED.getExitCode(), "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end1")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
@@ -155,8 +139,7 @@ public class FlowJobTests {
assertEquals(ExitStatus.FAILED, jobExecution.getExitStatus());
assertEquals(2, jobExecution.getStepExecutions().size());
jobRepository.update(jobExecution);
jobExecution = jobRepository.createJobExecution("job",
new JobParameters());
jobExecution = jobRepository.createJobExecution("job", new JobParameters());
fail = false;
job.execute(jobExecution);
assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
@@ -167,21 +150,15 @@ public class FlowJobTests {
public void testStoppingStep() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2"));
State state2 = new StateSupport("step2", FlowExecutionStatus.FAILED);
transitions.add(StateTransition.createStateTransition(state2,
ExitStatus.FAILED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(state2,
ExitStatus.COMPLETED.getExitCode(), "end1"));
transitions.add(StateTransition.createStateTransition(new EndState(
BatchStatus.STOPPED, ExitStatus.STOPPED, "end0"), "step3"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end1")));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step3")), "end2"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end2")));
transitions.add(StateTransition.createStateTransition(state2, ExitStatus.FAILED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(state2, ExitStatus.COMPLETED.getExitCode(), "end1"));
transitions.add(StateTransition.createStateTransition(new EndState(FlowExecutionStatus.STOPPED, "end0"),
"step3"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end1")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step3")), "end2"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end2")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
@@ -194,20 +171,15 @@ public class FlowJobTests {
public void testEndStateStopped() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "end"));
transitions.add(StateTransition.createStateTransition(new EndState(
BatchStatus.STOPPED, ExitStatus.STOPPED, "end"), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "end"));
transitions.add(StateTransition
.createStateTransition(new StepState(new StubStep("step2")),
ExitStatus.FAILED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(),
"end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end1")));
.createStateTransition(new EndState(FlowExecutionStatus.STOPPED, "end"), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.FAILED
.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")),
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();
@@ -219,20 +191,15 @@ public class FlowJobTests {
public void testEndStateFailed() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "end"));
transitions.add(StateTransition.createStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end"), "step2"));
transitions.add(StateTransition
.createStateTransition(new StepState(new StubStep("step2")),
ExitStatus.FAILED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(),
"end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end1")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "end"));
transitions
.add(StateTransition.createStateTransition(new EndState(FlowExecutionStatus.FAILED, "end"), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.FAILED
.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")),
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();
@@ -245,20 +212,15 @@ public class FlowJobTests {
public void testEndStateStoppedWithRestart() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "end"));
transitions.add(StateTransition.createStateTransition(new EndState(
BatchStatus.STOPPED, ExitStatus.STOPPED, "end"), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(),
"end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "end"));
transitions.add(StateTransition
.createStateTransition(new StepState(new StubStep("step2")),
ExitStatus.FAILED.getExitCode(), "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end1")));
.createStateTransition(new EndState(FlowExecutionStatus.STOPPED, "end"), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")),
ExitStatus.COMPLETED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.FAILED
.getExitCode(), "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end1")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
@@ -268,8 +230,7 @@ public class FlowJobTests {
assertEquals(BatchStatus.STOPPED, jobExecution.getStatus());
assertEquals(1, jobExecution.getStepExecutions().size());
jobExecution = jobRepository.createJobExecution("job",
new JobParameters());
jobExecution = jobRepository.createJobExecution("job", new JobParameters());
job.execute(jobExecution);
assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
assertEquals(1, jobExecution.getStepExecutions().size());
@@ -280,30 +241,21 @@ public class FlowJobTests {
public void testBranching() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "COMPLETED", "step3"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(),
"end0"));
transitions.add(StateTransition
.createStateTransition(new StepState(new StubStep("step2")),
ExitStatus.FAILED.getExitCode(), "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end1")));
transitions.add(StateTransition
.createStateTransition(new StepState(new StubStep("step3")),
ExitStatus.FAILED.getExitCode(), "end2"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step3")), ExitStatus.COMPLETED.getExitCode(),
"end3"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end2")));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end3")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "COMPLETED",
"step3"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")),
ExitStatus.COMPLETED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.FAILED
.getExitCode(), "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end1")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step3")), ExitStatus.FAILED
.getExitCode(), "end2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step3")),
ExitStatus.COMPLETED.getExitCode(), "end3"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end2")));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end3")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
@@ -317,10 +269,8 @@ public class FlowJobTests {
public void testBasicFlow() throws Throwable {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step")), "end0"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step")), "end0"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.execute(jobExecution);
@@ -335,40 +285,29 @@ public class FlowJobTests {
SimpleFlow flow = new SimpleFlow("job");
JobExecutionDecider decider = new JobExecutionDecider() {
public String decide(JobExecution jobExecution,
StepExecution stepExecution) {
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
assertNotNull(stepExecution);
return "SWITCH";
return new FlowExecutionStatus("SWITCH");
}
};
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "decision"));
transitions.add(StateTransition.createStateTransition(
new DecisionState(decider, "decision"), "step2"));
transitions.add(StateTransition.createStateTransition(
new DecisionState(decider, "decision"), "SWITCH", "step3"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(),
"end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "decision"));
transitions.add(StateTransition.createStateTransition(new DecisionState(decider, "decision"), "step2"));
transitions.add(StateTransition
.createStateTransition(new StepState(new StubStep("step2")),
ExitStatus.FAILED.getExitCode(), "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end1")));
transitions.add(StateTransition
.createStateTransition(new StepState(new StubStep("step3")),
ExitStatus.FAILED.getExitCode(), "end2"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step3")), ExitStatus.COMPLETED.getExitCode(),
"end3"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.FAILED, ExitStatus.FAILED, "end2")));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end3")));
.createStateTransition(new DecisionState(decider, "decision"), "SWITCH", "step3"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")),
ExitStatus.COMPLETED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.FAILED
.getExitCode(), "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end1")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step3")), ExitStatus.FAILED
.getExitCode(), "end2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step3")),
ExitStatus.COMPLETED.getExitCode(), "end3"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end2")));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end3")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
@@ -387,12 +326,9 @@ public class FlowJobTests {
public void testGetStepExists() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step2")), "end0"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), "end0"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0")));
flow.setStateTransitions(transitions);
flow.afterPropertiesSet();
job.setFlow(flow);
@@ -407,12 +343,9 @@ public class FlowJobTests {
public void testGetStepNotExists() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step2")), "end0"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), "end0"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0")));
flow.setStateTransitions(transitions);
flow.afterPropertiesSet();
job.setFlow(flow);
@@ -426,12 +359,9 @@ public class FlowJobTests {
public void testGetStepNotStepState() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(
new StubStep("step2")), "end0"));
transitions.add(StateTransition.createEndStateTransition(new EndState(
BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), "end0"));
transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0")));
flow.setStateTransitions(transitions);
flow.afterPropertiesSet();
job.setFlow(flow);
@@ -451,8 +381,7 @@ public class FlowJobTests {
super(name);
}
public void execute(StepExecution stepExecution)
throws JobInterruptedException {
public void execute(StepExecution stepExecution) throws JobInterruptedException {
stepExecution.setStatus(BatchStatus.COMPLETED);
stepExecution.setExitStatus(ExitStatus.COMPLETED);
jobRepository.update(stepExecution);
@@ -465,8 +394,7 @@ public class FlowJobTests {
* @param stepName
* @return the StepExecution corresponding to the specified step
*/
private StepExecution getStepExecution(JobExecution jobExecution,
String stepName) {
private StepExecution getStepExecution(JobExecution jobExecution, String stepName) {
for (StepExecution stepExecution : jobExecution.getStepExecutions()) {
if (stepExecution.getStepName().equals(stepName)) {
return stepExecution;

View File

@@ -17,13 +17,10 @@ package org.springframework.batch.core.job.flow;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
import org.springframework.batch.core.job.flow.FlowExecutor;
import org.springframework.batch.core.job.flow.State;
import org.springframework.batch.core.job.flow.support.state.AbstractState;
/**
* Base class for {@link State} implementations.
* Base class for {@link State} implementations in test cases.
*
* @author Dave Syer
*
@@ -49,7 +46,9 @@ public class StateSupport extends AbstractState {
}
return this.status;
}
public void validate(String pattern, String nextState) {
public boolean isEndState() {
return false;
}
}

View File

@@ -22,6 +22,7 @@ import org.springframework.batch.core.StartLimitExceededException;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.job.flow.FlowExecution;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
import org.springframework.batch.core.job.flow.FlowExecutor;
import org.springframework.batch.core.repository.JobRestartException;
@@ -31,8 +32,6 @@ import org.springframework.batch.core.repository.JobRestartException;
*/
public class JobFlowExecutorSupport implements FlowExecutor {
private volatile boolean nested = false;
public String executeStep(Step step) throws JobInterruptedException, JobRestartException,
StartLimitExceededException {
return ExitStatus.COMPLETED.getExitCode();
@@ -49,19 +48,10 @@ public class JobFlowExecutorSupport implements FlowExecutor {
public void close(FlowExecution result) {
}
public void updateStepExecutionStatus() {
public void abandonStepExecution() {
}
public boolean isNested() {
return nested;
}
public void nest() {
nested= true;
}
public void unnest() {
nested = false;
public void updateJobExecutionStatus(FlowExecutionStatus status) {
}
}

View File

@@ -20,11 +20,10 @@ import static org.junit.Assert.assertEquals;
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.job.flow.FlowExecutionStatus;
import org.springframework.batch.core.job.flow.FlowExecutor;
import org.springframework.batch.core.job.flow.support.JobFlowExecutorSupport;
import org.springframework.batch.core.job.flow.support.state.EndState;
/**
* @author Dave Syer
@@ -48,7 +47,7 @@ public class EndStateTests {
BatchStatus status = jobExecution.getStatus();
EndState state = new EndState(BatchStatus.UNKNOWN, ExitStatus.UNKNOWN, "end");
EndState state = new EndState(FlowExecutionStatus.UNKNOWN, "end");
state.handle(new JobFlowExecutorSupport() {
@Override
public JobExecution getJobExecution() {
@@ -69,38 +68,15 @@ public class EndStateTests {
jobExecution.createStepExecution("foo");
EndState state = new EndState(BatchStatus.UNKNOWN, ExitStatus.UNKNOWN, "end");
state.handle(new JobFlowExecutorSupport() {
EndState state = new EndState(FlowExecutionStatus.UNKNOWN, "end");
FlowExecutionStatus status = state.handle(new JobFlowExecutorSupport() {
@Override
public JobExecution getJobExecution() {
return jobExecution;
}
});
assertEquals(BatchStatus.UNKNOWN, jobExecution.getStatus());
}
/**
* Test method for {@link EndState#handle(FlowExecutor)}.
* @throws Exception
*/
@Test
public void testHandleOngoingAttemptedDowngrade() throws Exception {
jobExecution.setStatus(BatchStatus.FAILED);
jobExecution.createStepExecution("foo");
EndState state = new EndState(BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end");
state.handle(new JobFlowExecutorSupport() {
@Override
public JobExecution getJobExecution() {
return jobExecution;
}
});
// An EndState can downgrade a status - if it failed then it can be unfailed
assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
assertEquals(FlowExecutionStatus.UNKNOWN, status);
}