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:
@@ -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());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ public class EndStateTests {
|
||||
}
|
||||
});
|
||||
|
||||
assertEquals(BatchStatus.UNKNOWN, jobExecution.getStatus());
|
||||
assertEquals(BatchStatus.STARTING, jobExecution.getStatus());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user