BATCH-1067:

* FlowJob waits until the Job is finished before updating BatchStatus and ExitStatus.  This is required so that individual flows in a split don't modifify the JobExecution prematurely.
* Removed FlowExecution$Status and replaced it with FlowExecutionStatus, a class that holds both a BatchStatus and an ExitStatus.  This is required by the EndState because the handle() method needs to be able to return both BatchStatus and ExitStatus so that they can be applied correctly to the JobExecution when ending the job.
This commit is contained in:
dhgarrette
2009-02-08 18:32:03 +00:00
parent 1e1c78408f
commit 7c4953f2be
22 changed files with 270 additions and 157 deletions

View File

@@ -40,12 +40,13 @@ public class SplitDifferentResultsFailSecondJobParserTests extends AbstractJobPa
JobExecution jobExecution = createJobExecution();
job.execute(jobExecution);
assertEquals(2, stepNamesList.size());
assertEquals(3, stepNamesList.size());
assertTrue(stepNamesList.contains("step1"));
assertTrue(stepNamesList.contains("failingStep"));
assertTrue(stepNamesList.contains("step3"));
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals(ExitStatus.FAILED, jobExecution.getExitStatus());
assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
StepExecution stepExecution1 = getStepExecution(jobExecution, "step1");
assertEquals(BatchStatus.COMPLETED, stepExecution1.getStatus());
@@ -55,6 +56,10 @@ public class SplitDifferentResultsFailSecondJobParserTests extends AbstractJobPa
assertEquals(BatchStatus.FAILED, stepExecution2.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode());
StepExecution stepExecution3 = getStepExecution(jobExecution, "step3");
assertEquals(BatchStatus.COMPLETED, stepExecution3.getStatus());
assertEquals(ExitStatus.COMPLETED, stepExecution3.getExitStatus());
}
}

View File

@@ -31,7 +31,7 @@ public class FlowExecutionTests {
public void testBasicProperties() throws Exception {
FlowExecution execution = new FlowExecution("foo", "BAR");
assertEquals("foo",execution.getName());
assertEquals("BAR",execution.getStatus());
assertEquals("BAR",execution.getStatus().getStatus());
}
@Test
@@ -44,8 +44,8 @@ public class FlowExecutionTests {
@Test
public void testEnumOrdering() throws Exception {
FlowExecution first = new FlowExecution("foo", FlowExecution.COMPLETED);
FlowExecution second = new FlowExecution("foo", FlowExecution.FAILED);
FlowExecution first = new FlowExecution("foo", FlowExecutionStatus.COMPLETED);
FlowExecution second = new FlowExecution("foo", FlowExecutionStatus.FAILED);
assertTrue("Should be negative",first.compareTo(second)<0);
assertTrue("Should be positive",second.compareTo(first)>0);
}

View File

@@ -15,6 +15,7 @@
*/
package org.springframework.batch.core.job.flow.support;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInterruptedException;
import org.springframework.batch.core.StartLimitExceededException;
@@ -26,13 +27,13 @@ import org.springframework.batch.core.repository.JobRestartException;
/**
* @author Dave Syer
*
*
*/
public class JobFlowExecutorSupport implements FlowExecutor {
public String executeStep(Step step) throws JobInterruptedException, JobRestartException,
StartLimitExceededException {
return FlowExecution.COMPLETED;
return ExitStatus.COMPLETED.getExitCode();
}
public JobExecution getJobExecution() {

View File

@@ -26,9 +26,13 @@ import java.util.Collections;
import java.util.List;
import org.junit.Test;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.job.flow.FlowExecution;
import org.springframework.batch.core.job.flow.FlowExecutionException;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
import org.springframework.batch.core.job.flow.FlowExecutor;
import org.springframework.batch.core.job.flow.support.state.EndState;
/**
* @author Dave Syer
@@ -56,17 +60,17 @@ public class SimpleFlowTests {
@Test
public void testStepLoop() throws Exception {
flow.setStateTransitions(collect(StateTransition.createStateTransition(new StateSupport("step"),
FlowExecution.FAILED, "step"), StateTransition.createEndStateTransition(new StateSupport("step"))));
ExitStatus.FAILED.getExitCode(), "step"), StateTransition.createEndStateTransition(new StateSupport("step"))));
flow.afterPropertiesSet();
FlowExecution execution = flow.start(executor);
assertEquals(FlowExecution.COMPLETED, execution.getStatus());
assertEquals(FlowExecutionStatus.COMPLETED, execution.getStatus());
assertEquals("step", execution.getName());
}
@Test(expected = IllegalArgumentException.class)
public void testNoEndStep() throws Exception {
flow.setStateTransitions(Collections.singletonList(StateTransition.createStateTransition(new StateSupport(
"step"), FlowExecution.FAILED, "step")));
"step"), ExitStatus.FAILED.getExitCode(), "step")));
flow.afterPropertiesSet();
}
@@ -76,7 +80,7 @@ public class SimpleFlowTests {
StateTransition.createEndStateTransition(new StubState("step2"))));
flow.afterPropertiesSet();
FlowExecution execution = flow.start(executor);
assertEquals(FlowExecution.COMPLETED, execution.getStatus());
assertEquals(FlowExecutionStatus.COMPLETED, execution.getStatus());
assertEquals("step1", execution.getName());
}
@@ -102,7 +106,7 @@ public class SimpleFlowTests {
"step1"))));
flow.afterPropertiesSet();
FlowExecution execution = flow.start(executor);
assertEquals(FlowExecution.COMPLETED, execution.getStatus());
assertEquals(FlowExecutionStatus.COMPLETED, execution.getStatus());
assertEquals("step1", execution.getName());
}
@@ -120,17 +124,17 @@ public class SimpleFlowTests {
};
FlowExecution execution = flow.start(executor);
assertEquals(1, list.size());
assertEquals(FlowExecution.COMPLETED, execution.getStatus());
assertEquals(FlowExecutionStatus.COMPLETED, execution.getStatus());
assertEquals("step1", execution.getName());
}
@Test
public void testExplicitStartStep() throws Exception {
flow.setStateTransitions(collect(StateTransition.createStateTransition(new StubState("step"),
FlowExecution.FAILED, "step"), StateTransition.createEndStateTransition(new StubState("step"))));
ExitStatus.FAILED.getExitCode(), "step"), StateTransition.createEndStateTransition(new StubState("step"))));
flow.afterPropertiesSet();
FlowExecution execution = flow.start(executor);
assertEquals(FlowExecution.COMPLETED, execution.getStatus());
assertEquals(FlowExecutionStatus.COMPLETED, execution.getStatus());
assertEquals("step", execution.getName());
}
@@ -140,7 +144,7 @@ public class SimpleFlowTests {
StateTransition.createEndStateTransition(new StubState("step2"))));
flow.afterPropertiesSet();
FlowExecution execution = flow.start(executor);
assertEquals(FlowExecution.COMPLETED, execution.getStatus());
assertEquals(FlowExecutionStatus.COMPLETED, execution.getStatus());
assertEquals("step2", execution.getName());
}
@@ -150,7 +154,7 @@ public class SimpleFlowTests {
StateTransition.createEndStateTransition(new StubState("step2"))));
flow.afterPropertiesSet();
FlowExecution execution = flow.resume("step2", executor);
assertEquals(FlowExecution.COMPLETED, execution.getStatus());
assertEquals(FlowExecutionStatus.COMPLETED, execution.getStatus());
assertEquals("step2", execution.getName());
}
@@ -158,54 +162,28 @@ public class SimpleFlowTests {
public void testFailedStep() throws Exception {
flow.setStateTransitions(collect(StateTransition.createStateTransition(new StubState("step1") {
@Override
public String handle(FlowExecutor executor) {
return FlowExecution.FAILED;
public FlowExecutionStatus handle(FlowExecutor executor) {
return FlowExecutionStatus.FAILED;
}
}, "step2"), StateTransition.createEndStateTransition(new StubState("step2"))));
flow.afterPropertiesSet();
FlowExecution execution = flow.start(executor);
assertEquals(FlowExecution.COMPLETED, execution.getStatus());
assertEquals(FlowExecutionStatus.COMPLETED, execution.getStatus());
assertEquals("step2", execution.getName());
}
@Test
public void testBranching() throws Exception {
flow.setStateTransitions(collect(StateTransition.createStateTransition(new StubState("step1"), "step2"),
StateTransition.createStateTransition(new StubState("step1"), FlowExecution.COMPLETED, "step3"),
StateTransition.createStateTransition(new StubState("step1"), ExitStatus.COMPLETED.getExitCode(), "step3"),
StateTransition.createEndStateTransition(new StubState("step2")), StateTransition
.createEndStateTransition(new StubState("step3"))));
flow.afterPropertiesSet();
FlowExecution execution = flow.start(executor);
assertEquals(FlowExecution.COMPLETED, execution.getStatus());
assertEquals(FlowExecutionStatus.COMPLETED, execution.getStatus());
assertEquals("step3", execution.getName());
}
@Test
public void testPause() throws Exception {
flow.setStateTransitions(collect(StateTransition.createStateTransition(new StubState("step1"), "step2"),
StateTransition.createStateTransition(new StubState("step2") {
private boolean paused = false;
@Override
public String handle(FlowExecutor executor) throws Exception {
if (!paused) {
paused = true;
return FlowExecution.PAUSED;
}
paused = false;
return FlowExecution.COMPLETED;
}
}, "step3"), StateTransition.createEndStateTransition(new StubState("step3"))));
flow.afterPropertiesSet();
FlowExecution execution = flow.start(executor);
assertEquals(FlowExecution.PAUSED, execution.getStatus());
assertEquals("step2", execution.getName());
execution = flow.resume(execution.getName(), executor);
assertEquals(FlowExecution.COMPLETED, execution.getStatus());
assertEquals("step3", execution.getName());
}
@Test
public void testGetStateExists() throws Exception {
flow.setStateTransitions(Collections.singletonList(StateTransition.createEndStateTransition(new StubState(

View File

@@ -15,9 +15,8 @@
*/
package org.springframework.batch.core.job.flow.support;
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.job.flow.support.State;
import org.springframework.batch.core.job.flow.support.state.AbstractState;
/**
@@ -36,8 +35,8 @@ public class StateSupport extends AbstractState {
}
@Override
public String handle(FlowExecutor executor) throws Exception {
return FlowExecution.COMPLETED;
public FlowExecutionStatus handle(FlowExecutor executor) throws Exception {
return FlowExecutionStatus.COMPLETED;
}
}

View File

@@ -76,7 +76,7 @@ public class EndStateTests {
}
});
assertEquals(BatchStatus.UNKNOWN, jobExecution.getStatus());
assertEquals(BatchStatus.STARTING, jobExecution.getStatus());
}

View File

@@ -23,7 +23,7 @@ import java.util.Collections;
import org.junit.Test;
import org.springframework.batch.core.job.flow.FlowExecution;
import org.springframework.batch.core.job.flow.support.state.MaxValueFlowExecutionAggregator;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
/**
* @author Dave Syer
@@ -35,16 +35,16 @@ public class SimpleFlowExecutionAggregatorTests {
@Test
public void testFailed() throws Exception {
FlowExecution first = new FlowExecution("foo", FlowExecution.COMPLETED);
FlowExecution second = new FlowExecution("foo", FlowExecution.FAILED);
FlowExecution first = new FlowExecution("foo", FlowExecutionStatus.COMPLETED);
FlowExecution second = new FlowExecution("foo", FlowExecutionStatus.FAILED);
assertTrue("Should be negative", first.compareTo(second)<0);
assertTrue("Should be positive", second.compareTo(first)>0);
assertEquals(FlowExecution.FAILED, aggregator.aggregate(Arrays.asList(first, second)));
assertEquals(FlowExecutionStatus.FAILED, aggregator.aggregate(Arrays.asList(first, second)));
}
@Test
public void testEmpty() throws Exception {
assertEquals(FlowExecution.UNKNOWN, aggregator.aggregate(Collections.<FlowExecution> emptySet()));
assertEquals(FlowExecutionStatus.UNKNOWN, aggregator.aggregate(Collections.<FlowExecution> emptySet()));
}
}

View File

@@ -24,7 +24,7 @@ import org.easymock.EasyMock;
import org.junit.Test;
import org.springframework.batch.core.job.flow.Flow;
import org.springframework.batch.core.job.flow.FlowExecution;
import org.springframework.batch.core.job.flow.support.state.SplitState;
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
@@ -45,12 +45,12 @@ public class SplitStateTests {
SplitState state = new SplitState(flows, "foo");
EasyMock.expect(flow1.start(null)).andReturn(new FlowExecution("step1", FlowExecution.COMPLETED));
EasyMock.expect(flow2.start(null)).andReturn(new FlowExecution("step1", FlowExecution.COMPLETED));
EasyMock.expect(flow1.start(null)).andReturn(new FlowExecution("step1", FlowExecutionStatus.COMPLETED));
EasyMock.expect(flow2.start(null)).andReturn(new FlowExecution("step1", FlowExecutionStatus.COMPLETED));
EasyMock.replay(flow1, flow2);
String result = state.handle(null);
assertEquals(FlowExecution.COMPLETED, result);
FlowExecutionStatus result = state.handle(null);
assertEquals(FlowExecutionStatus.COMPLETED, result);
EasyMock.verify(flow1, flow2);
@@ -68,12 +68,12 @@ public class SplitStateTests {
SplitState state = new SplitState(flows, "foo");
state.setTaskExecutor(new SimpleAsyncTaskExecutor());
EasyMock.expect(flow1.start(null)).andReturn(new FlowExecution("step1", FlowExecution.COMPLETED));
EasyMock.expect(flow2.start(null)).andReturn(new FlowExecution("step1", FlowExecution.COMPLETED));
EasyMock.expect(flow1.start(null)).andReturn(new FlowExecution("step1", FlowExecutionStatus.COMPLETED));
EasyMock.expect(flow2.start(null)).andReturn(new FlowExecution("step1", FlowExecutionStatus.COMPLETED));
EasyMock.replay(flow1, flow2);
String result = state.handle(null);
assertEquals(FlowExecution.COMPLETED, result);
FlowExecutionStatus result = state.handle(null);
assertEquals(FlowExecutionStatus.COMPLETED, result);
EasyMock.verify(flow1, flow2);