BATCH-1064: Switched the semantics of INCOMPLETE and FAILED. Combined INCOMPLETE with STOPPED. INCOMPLETE jobs and steps can be restarted while COMPLETED and FAILED jobs and steps cannot.

This commit is contained in:
dhgarrette
2009-02-13 06:12:28 +00:00
parent a3548b4190
commit b04841548e
63 changed files with 364 additions and 295 deletions

View File

@@ -37,7 +37,7 @@ public enum BatchStatus {
* steps that have finished processing, but were not successful, and where
* they should be skipped on a restart (so FAILED is the wrong status).
*/
INCOMPLETE, COMPLETED, STARTING, STARTED, FAILED, STOPPING, STOPPED, UNKNOWN;
COMPLETED, STARTING, STARTED, FAILED, INCOMPLETE, STOPPING, UNKNOWN;
public static BatchStatus max(BatchStatus status1, BatchStatus status2) {
if (status1.isLessThan(status2)) {
@@ -66,7 +66,7 @@ public enum BatchStatus {
* @return true if the status is FAILED or greater
*/
public boolean isUnsuccessful() {
return this == FAILED || this.isGreaterThan(FAILED);
return this == INCOMPLETE || this.isGreaterThan(INCOMPLETE);
}
/**

View File

@@ -150,8 +150,8 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser {
}
if (!transitionElementExists) {
list.addAll(createTransition(BatchStatus.FAILED, ExitStatus.FAILED.getExitCode(), null, null, stateDef,
parserContext));
list.addAll(createTransition(BatchStatus.INCOMPLETE, ExitStatus.FAILED.getExitCode(), null, null,
stateDef, parserContext));
if (!hasNextAttribute) {
list.addAll(createTransition(BatchStatus.COMPLETED, null, null, null, stateDef, parserContext));
}
@@ -219,15 +219,16 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser {
BeanDefinition endState = null;
if (batchStatus == BatchStatus.STOPPED || batchStatus == BatchStatus.COMPLETED
|| batchStatus == BatchStatus.FAILED) {
if (batchStatus == BatchStatus.FAILED || batchStatus == BatchStatus.COMPLETED
|| batchStatus == BatchStatus.INCOMPLETE) {
BeanDefinitionBuilder endBuilder = BeanDefinitionBuilder
.genericBeanDefinition("org.springframework.batch.core.job.flow.support.state.EndState");
endBuilder.addConstructorArgValue(batchStatus);
boolean exitCodeExists = StringUtils.hasText(exitCode);
endBuilder.addConstructorArgValue(new ExitStatus(exitCodeExists ? exitCode : batchStatus.toString()));
endBuilder.addConstructorArgValue(exitCodeExists ? new ExitStatus(exitCode)
: convertToExitStatus(batchStatus));
String endName = "end" + (endCounter++);
endBuilder.addConstructorArgValue(endName);
@@ -256,7 +257,7 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser {
*/
private static BatchStatus getBatchStatusFromEndTransitionName(String elementName) {
if (PAUSE.equals(elementName)) {
return BatchStatus.STOPPED;
return BatchStatus.INCOMPLETE;
}
else if (END.equals(elementName)) {
return BatchStatus.COMPLETED;
@@ -269,6 +270,19 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser {
}
}
/**
* @param batchStatus A BatchStatus
* @return the ExitStatus corresponding to the BatchStatus
*/
private static ExitStatus convertToExitStatus(BatchStatus batchStatus) {
if (batchStatus == BatchStatus.INCOMPLETE) {
return ExitStatus.FAILED;
}
else {
return new ExitStatus(batchStatus.toString());
}
}
/**
* @param parserContext the parser context
* @param stateDefinition a reference to the state implementation

View File

@@ -241,7 +241,7 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In
// The job was already stopped before we even got this far. Deal
// with it in the same way as any other interruption.
execution.setStatus(BatchStatus.STOPPED);
execution.setStatus(BatchStatus.FAILED);
execution.setExitStatus(ExitStatus.COMPLETED);
}
@@ -250,13 +250,13 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In
catch (JobInterruptedException e) {
logger.error("Encountered interruption executing job", e);
execution.setExitStatus(ExitStatus.FAILED);
execution.setStatus(BatchStatus.STOPPED);
execution.setStatus(BatchStatus.INCOMPLETE);
execution.addFailureException(e);
}
catch (Throwable t) {
logger.error("Encountered error executing job", t);
execution.setExitStatus(ExitStatus.FAILED);
execution.setStatus(BatchStatus.FAILED);
execution.setStatus(BatchStatus.INCOMPLETE);
execution.addFailureException(t);
}
finally {
@@ -293,7 +293,7 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In
* @return the {@link StepExecution} corresponding to this step
*
* @throws JobInterruptedException if the {@link JobExecution} has been
* interrupted, and in particular if {@link BatchStatus#STOPPED} or
* interrupted, and in particular if {@link BatchStatus#FAILED} or
* {@link BatchStatus#STOPPING} is detected
* @throws StartLimitExceededException if the start limit has been exceeded
* for this step
@@ -302,7 +302,7 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In
*/
protected final StepExecution handleStep(Step step, JobExecution execution) throws JobInterruptedException,
JobRestartException, StartLimitExceededException {
if (execution.getStatus() == BatchStatus.STOPPING || execution.getStatus() == BatchStatus.STOPPED) {
if (execution.getStatus() == BatchStatus.STOPPING || execution.getStatus() == BatchStatus.INCOMPLETE) {
throw new JobInterruptedException("JobExecution interrupted.");
}
@@ -331,7 +331,7 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In
jobRepository.updateExecutionContext(execution);
if (currentStepExecution.getStatus() == BatchStatus.STOPPED
if (currentStepExecution.getStatus() == BatchStatus.FAILED
|| currentStepExecution.getStatus() == BatchStatus.STOPPING) {
throw new JobInterruptedException("Job interrupted by step execution");
}
@@ -382,7 +382,8 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In
+ "so it may be dangerous to proceed. " + "Manual intervention is probably necessary.");
}
if (stepStatus.isLessThanOrEqualTo(BatchStatus.COMPLETED) && step.isAllowStartIfComplete() == false) {
if ((stepStatus == BatchStatus.COMPLETED && step.isAllowStartIfComplete() == false)
|| stepStatus == BatchStatus.FAILED) {
// step is complete, false should be returned, indicating that the
// step should not be started
return false;

View File

@@ -34,16 +34,6 @@ public class FlowExecution implements Comparable<FlowExecution> {
this.status = status;
}
/**
* Convenience constructor that converts a String status to a {@link FlowExecutionStatus}.
*
* @param name
* @param status
*/
public FlowExecution(String name, String status) {
this(name, new FlowExecutionStatus(status));
}
/**
* @return the name of the end state reached
*/
@@ -52,7 +42,7 @@ public class FlowExecution implements Comparable<FlowExecution> {
}
/**
* @return the exit status
* @return the FlowExecutionStatus
*/
public FlowExecutionStatus getStatus() {
return status;

View File

@@ -26,7 +26,7 @@ import org.springframework.batch.core.ExitStatus;
*/
public class FlowExecutionStatus implements Comparable<FlowExecutionStatus> {
private final String status;
private final BatchStatus batchStatus;
private final ExitStatus exitStatus;
/**
@@ -38,7 +38,12 @@ public class FlowExecutionStatus implements Comparable<FlowExecutionStatus> {
/**
* Special well-known status value.
*/
public static final FlowExecutionStatus STOPPED = new FlowExecutionStatus(BatchStatus.STOPPED, ExitStatus.FAILED);
public static final FlowExecutionStatus STOPPED = new FlowExecutionStatus(BatchStatus.FAILED, ExitStatus.FAILED);
/**
* Special well-known status value.
*/
public static final FlowExecutionStatus INCOMPLETE = new FlowExecutionStatus(BatchStatus.INCOMPLETE, ExitStatus.FAILED);
/**
* Special well-known status value.
@@ -51,19 +56,11 @@ public class FlowExecutionStatus implements Comparable<FlowExecutionStatus> {
public static final FlowExecutionStatus UNKNOWN = new FlowExecutionStatus(BatchStatus.UNKNOWN, ExitStatus.UNKNOWN);
/**
* @param status
*/
public FlowExecutionStatus(String status) {
this(status, null);
}
/**
* @param status
* @param exitStatus
*/
public FlowExecutionStatus(String status, ExitStatus exitStatus) {
this.status = status;
this.exitStatus = exitStatus;
public FlowExecutionStatus(String exitStatus) {
this.batchStatus = null;
this.exitStatus = new ExitStatus(exitStatus);
}
/**
@@ -74,16 +71,8 @@ public class FlowExecutionStatus implements Comparable<FlowExecutionStatus> {
* @param exitStatus
*/
public FlowExecutionStatus(BatchStatus batchStatus, ExitStatus exitStatus) {
this(batchStatus.toString(), exitStatus);
}
/**
* Convenience getter for the {@link BatchStatus}.
*
* @return a {@link BatchStatus} representing the status
*/
public BatchStatus getBatchStatus() {
return BatchStatus.match(status);
this.batchStatus = batchStatus;
this.exitStatus = exitStatus;
}
/**
@@ -96,13 +85,13 @@ public class FlowExecutionStatus implements Comparable<FlowExecutionStatus> {
* @return negative, zero or positive as per the contract
*/
public int compareTo(FlowExecutionStatus other) {
BatchStatus one = this.getBatchStatus();
BatchStatus two = other.getBatchStatus();
int comparison = one.compareTo(two);
if (comparison == 0) {
return status.compareTo(other.getStatus());
if (batchStatus != null && other.getBatchStatus() != null) {
int order = batchStatus.compareTo(other.getBatchStatus());
if (order != 0) {
return order;
}
}
return comparison;
return exitStatus.compareTo(other.getExitStatus());
}
/**
@@ -118,15 +107,15 @@ public class FlowExecutionStatus implements Comparable<FlowExecutionStatus> {
return false;
}
FlowExecutionStatus flowExecutionStatus = (FlowExecutionStatus) other;
return status.equals(flowExecutionStatus.getStatus());
return batchStatus.equals(flowExecutionStatus.getBatchStatus());
}
public String toString() {
return "FlowExecutionStatus: status=[" + status + "] exitstatus=[" + exitStatus + "]";
return "FlowExecutionStatus: status=[" + batchStatus + "] exitcode=[" + exitStatus.getExitCode() + "]";
}
public String getStatus() {
return status;
public BatchStatus getBatchStatus() {
return batchStatus;
}
public ExitStatus getExitStatus() {

View File

@@ -114,8 +114,8 @@ public class FlowJob extends AbstractJob {
public String executeStep(Step step) throws JobInterruptedException, JobRestartException,
StartLimitExceededException {
StepExecution lastStepExecution = stepExecutionHolder.get();
if (lastStepExecution != null && lastStepExecution.getStatus() == BatchStatus.FAILED) {
lastStepExecution.setStatus(BatchStatus.INCOMPLETE);
if (lastStepExecution != null && lastStepExecution.getStatus() == BatchStatus.INCOMPLETE) {
lastStepExecution.setStatus(BatchStatus.FAILED);
updateStepExecution(lastStepExecution);
}
StepExecution stepExecution = handleStep(step, execution);

View File

@@ -45,4 +45,10 @@ public interface State {
*/
FlowExecutionStatus handle(FlowExecutor executor) throws Exception;
/**
* Validate that the nextState is appropriate for this State.
*
* @param nextState
*/
void validate(String nextState);
}

View File

@@ -158,8 +158,9 @@ public class SimpleFlow implements Flow, InitializingBean {
}
String next = null;
String exitCode = status.getExitStatus().getExitCode();
for (StateTransition stateTransition : set) {
if (stateTransition.matches(status.getStatus())) {
if (stateTransition.matches(exitCode)) {
if (stateTransition.isEnd()) {
// End of job
return null;

View File

@@ -18,6 +18,7 @@ package org.springframework.batch.core.job.flow.support;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.job.flow.State;
import org.springframework.batch.support.PatternMatcher;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
/**
@@ -97,6 +98,10 @@ public class StateTransition implements Comparable<StateTransition> {
else {
this.pattern = pattern;
}
Assert.notNull(state, "A state is required for a StateTransition");
state.validate(next);
this.next = next;
this.state = state;
}

View File

@@ -41,4 +41,13 @@ public class DecisionState extends AbstractState {
return new FlowExecutionStatus(decider.decide(executor.getJobExecution(), executor.getStepExecution()));
}
/* (non-Javadoc)
* @see org.springframework.batch.core.job.flow.State#validate(java.lang.String)
*/
public void validate(String nextState) {
if (nextState == null) {
throw new IllegalStateException("The transition for " + getClass().getSimpleName() + " [" + getName()
+ "] requires a 'next' state.");
}
}
}

View File

@@ -58,7 +58,7 @@ public class EndState extends AbstractState {
/**
* Return the {@link BatchStatus} and {@link ExitStatus} stored. If the
* {@link BatchStatus} is {@link BatchStatus#STOPPED}, then mark it on the
* {@link BatchStatus} is {@link BatchStatus#FAILED}, then mark it on the
* {@link JobExecution} so that the job will know to stop.
*
* @see State#handle(FlowExecutor)
@@ -70,7 +70,7 @@ public class EndState extends AbstractState {
// restart
synchronized (jobExecution) {
if (!jobExecution.getStepExecutions().isEmpty()) {
if (status == BatchStatus.STOPPED) {
if (status == BatchStatus.INCOMPLETE) {
jobExecution.upgradeStatus(status);
jobExecution.setExitStatus(exitStatus);
}
@@ -79,4 +79,24 @@ public class EndState extends AbstractState {
}
}
/* (non-Javadoc)
* @see org.springframework.batch.core.job.flow.State#validate(java.lang.String)
*/
public void validate(String nextState) {
if (status != BatchStatus.INCOMPLETE && nextState != null) {
throw new IllegalStateException("The transition for " + getClass().getSimpleName() + " [" + getName()
+ "] may not have a 'next' state.");
}
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return super.toString() + " status=[" + status + "] exitcode=[" + exitStatus.getExitCode() + "] ";
}
}

View File

@@ -103,4 +103,13 @@ public class SplitState extends AbstractState {
}
/* (non-Javadoc)
* @see org.springframework.batch.core.job.flow.State#validate(java.lang.String)
*/
public void validate(String nextState) {
if (nextState == null) {
throw new IllegalStateException("The transition for " + getClass().getSimpleName() + " [" + getName()
+ "] requires a 'next' state.");
}
}
}

View File

@@ -61,4 +61,14 @@ public class StepState extends AbstractState implements StepHolder {
public Step getStep() {
return step;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.job.flow.State#validate(java.lang.String)
*/
public void validate(String nextState) {
if (nextState == null) {
throw new IllegalStateException("The transition for " + getClass().getSimpleName() + " [" + getName()
+ "] requires a 'next' state.");
}
}
}

View File

@@ -122,7 +122,7 @@ public class TaskExecutorPartitionHandler implements PartitionHandler, Initializ
* Set the status in case the caller is tracking it through the
* JobExecution.
*/
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setStatus(BatchStatus.INCOMPLETE);
stepExecution.setExitStatus(exitStatus);
result.add(stepExecution);
}

View File

@@ -112,7 +112,9 @@ public class SimpleJobRepository implements JobRepository {
throw new JobExecutionAlreadyRunningException("A job execution for this job is already running: "
+ jobInstance);
}
if (execution.getStatus() == BatchStatus.COMPLETED) {
BatchStatus status = execution.getStatus();
if (status == BatchStatus.COMPLETED || status == BatchStatus.FAILED) {
throw new JobInstanceAlreadyCompleteException(
"A job instance already exists and is complete for parameters=" + jobParameters
+ ". If you want to run this job again, change the parameters.");

View File

@@ -194,7 +194,7 @@ public abstract class AbstractStep implements Step, InitializingBean, BeanNameAw
// Check if someone is trying to stop us
if (stepExecution.isTerminateOnly()) {
stepExecution.setStatus(BatchStatus.STOPPED);
stepExecution.setStatus(BatchStatus.FAILED);
throw new JobInterruptedException("JobExecution interrupted.");
}
@@ -263,10 +263,10 @@ public abstract class AbstractStep implements Step, InitializingBean, BeanNameAw
return BatchStatus.UNKNOWN;
}
else if (e instanceof JobInterruptedException || e.getCause() instanceof JobInterruptedException) {
return BatchStatus.STOPPED;
return BatchStatus.FAILED;
}
else {
return BatchStatus.FAILED;
return BatchStatus.INCOMPLETE;
}
}

View File

@@ -257,7 +257,7 @@ public class TaskletStep extends AbstractStep {
locked = true;
}
catch (InterruptedException e) {
stepExecution.setStatus(BatchStatus.STOPPED);
stepExecution.setStatus(BatchStatus.FAILED);
Thread.currentThread().interrupt();
}

View File

@@ -45,17 +45,17 @@ public class BatchStatusTests {
@Test
public void testMaxStatus() {
assertEquals(BatchStatus.FAILED, BatchStatus.max(BatchStatus.FAILED,BatchStatus.COMPLETED));
assertEquals(BatchStatus.FAILED, BatchStatus.max(BatchStatus.COMPLETED, BatchStatus.FAILED));
assertEquals(BatchStatus.FAILED, BatchStatus.max(BatchStatus.FAILED, BatchStatus.FAILED));
assertEquals(BatchStatus.INCOMPLETE, BatchStatus.max(BatchStatus.INCOMPLETE,BatchStatus.COMPLETED));
assertEquals(BatchStatus.INCOMPLETE, BatchStatus.max(BatchStatus.COMPLETED, BatchStatus.INCOMPLETE));
assertEquals(BatchStatus.INCOMPLETE, BatchStatus.max(BatchStatus.INCOMPLETE, BatchStatus.INCOMPLETE));
assertEquals(BatchStatus.STARTED, BatchStatus.max(BatchStatus.STARTED, BatchStatus.STARTING));
assertEquals(BatchStatus.STARTED, BatchStatus.max(BatchStatus.COMPLETED, BatchStatus.STARTED));
}
@Test
public void testUpgradeStatusFinished() {
assertEquals(BatchStatus.FAILED, BatchStatus.FAILED.upgradeTo(BatchStatus.COMPLETED));
assertEquals(BatchStatus.FAILED, BatchStatus.COMPLETED.upgradeTo(BatchStatus.FAILED));
assertEquals(BatchStatus.INCOMPLETE, BatchStatus.INCOMPLETE.upgradeTo(BatchStatus.COMPLETED));
assertEquals(BatchStatus.INCOMPLETE, BatchStatus.COMPLETED.upgradeTo(BatchStatus.INCOMPLETE));
}
@Test
@@ -68,7 +68,7 @@ public class BatchStatusTests {
@Test
public void testIsRunning() {
assertFalse(BatchStatus.FAILED.isRunning());
assertFalse(BatchStatus.INCOMPLETE.isRunning());
assertFalse(BatchStatus.COMPLETED.isRunning());
assertTrue(BatchStatus.STARTED.isRunning());
assertTrue(BatchStatus.STARTING.isRunning());
@@ -76,7 +76,7 @@ public class BatchStatusTests {
@Test
public void testIsUnsuccessful() {
assertTrue(BatchStatus.FAILED.isUnsuccessful());
assertTrue(BatchStatus.INCOMPLETE.isUnsuccessful());
assertFalse(BatchStatus.COMPLETED.isUnsuccessful());
assertFalse(BatchStatus.STARTED.isUnsuccessful());
assertFalse(BatchStatus.STARTING.isUnsuccessful());
@@ -84,7 +84,7 @@ public class BatchStatusTests {
@Test
public void testGetStatus() {
assertEquals(BatchStatus.FAILED, BatchStatus.valueOf(BatchStatus.FAILED.toString()));
assertEquals(BatchStatus.INCOMPLETE, BatchStatus.valueOf(BatchStatus.INCOMPLETE.toString()));
}
@Test

View File

@@ -113,9 +113,9 @@ public class JobExecutionTests {
*/
@Test
public void testDowngradeStatus() {
execution.setStatus(BatchStatus.FAILED);
execution.setStatus(BatchStatus.INCOMPLETE);
execution.upgradeStatus(BatchStatus.COMPLETED);
assertEquals(BatchStatus.FAILED, execution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, execution.getStatus());
}
/**

View File

@@ -286,9 +286,9 @@ public class StepExecutionTests {
*/
@Test
public void testDowngradeStatus() {
execution.setStatus(BatchStatus.FAILED);
execution.setStatus(BatchStatus.INCOMPLETE);
execution.upgradeStatus(BatchStatus.COMPLETED);
assertEquals(BatchStatus.FAILED, execution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, execution.getStatus());
}
private StepExecution newStepExecution(Step step, Long long2) {

View File

@@ -44,15 +44,15 @@ public class DefaultFailureJobParserTests extends AbstractJobParserTests {
assertTrue(stepNamesList.contains("s1"));
assertTrue(stepNamesList.contains("fail"));
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals(ExitStatus.FAILED, jobExecution.getExitStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), jobExecution.getExitStatus().getExitCode());
StepExecution stepExecution1 = getStepExecution(jobExecution, "s1");
assertEquals(BatchStatus.COMPLETED, stepExecution1.getStatus());
assertEquals(ExitStatus.COMPLETED, stepExecution1.getExitStatus());
StepExecution stepExecution2 = getStepExecution(jobExecution, "fail");
assertEquals(BatchStatus.FAILED, stepExecution2.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution2.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode());
}

View File

@@ -47,7 +47,7 @@ public class EndTransitionDefaultStatusJobParserTests extends AbstractJobParserT
assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
StepExecution stepExecution1 = getStepExecution(jobExecution, "fail");
assertEquals(BatchStatus.FAILED, stepExecution1.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution1.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution1.getExitStatus().getExitCode());
}

View File

@@ -57,7 +57,7 @@ public class EndTransitionJobParserTests extends AbstractJobParserTests {
assertEquals(ExitStatus.COMPLETED, stepExecution1.getExitStatus());
StepExecution stepExecution2 = getStepExecution(jobExecution, "fail");
assertEquals(BatchStatus.FAILED, stepExecution2.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution2.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode());
//

View File

@@ -17,6 +17,7 @@ package org.springframework.batch.core.configuration.xml;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -24,6 +25,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.repository.JobInstanceAlreadyCompleteException;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -55,24 +57,21 @@ public class FailTransitionJobParserTests extends AbstractJobParserTests {
assertEquals(ExitStatus.COMPLETED, stepExecution1.getExitStatus());
StepExecution stepExecution2 = getStepExecution(jobExecution, "fail");
assertEquals(BatchStatus.FAILED, stepExecution2.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution2.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode());
//
// Second Launch
//
stepNamesList.clear();
jobExecution = createJobExecution();
job.execute(jobExecution);
assertEquals(1, stepNamesList.size()); // step1 is not executed
assertTrue(stepNamesList.contains("fail"));
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals("EARLY TERMINATION (FAIL)", jobExecution.getExitStatus().getExitCode());
StepExecution stepExecution3 = getStepExecution(jobExecution, "fail");
assertEquals(BatchStatus.FAILED, stepExecution3.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution3.getExitStatus().getExitCode());
try {
jobExecution = createJobExecution();
fail("JobInstanceAlreadyCompleteException expected");
} catch (JobInstanceAlreadyCompleteException e) {
//
// Expected
//
}
}

View File

@@ -55,7 +55,7 @@ public class NextAttributeDefaultFailureJobParserTests {
assertNotNull(job);
JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), new JobParameters());
job.execute(jobExecution);
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
assertEquals(1, jobExecution.getStepExecutions().size());
}

View File

@@ -44,7 +44,7 @@ public class SplitDifferentResultsFailFirstJobParserTests extends AbstractJobPar
assertTrue(stepNamesList.contains("s1"));
assertTrue(stepNamesList.contains("fail"));
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
assertEquals(ExitStatus.FAILED, jobExecution.getExitStatus());
StepExecution stepExecution1 = getStepExecution(jobExecution, "s1");
@@ -52,7 +52,7 @@ public class SplitDifferentResultsFailFirstJobParserTests extends AbstractJobPar
assertEquals(ExitStatus.COMPLETED, stepExecution1.getExitStatus());
StepExecution stepExecution2 = getStepExecution(jobExecution, "fail");
assertEquals(BatchStatus.FAILED, stepExecution2.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution2.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode());
}

View File

@@ -53,7 +53,7 @@ public class SplitDifferentResultsFailSecondJobParserTests extends AbstractJobPa
assertEquals(ExitStatus.COMPLETED, stepExecution1.getExitStatus());
StepExecution stepExecution2 = getStepExecution(jobExecution, "fail");
assertEquals(BatchStatus.FAILED, stepExecution2.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution2.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode());
StepExecution stepExecution3 = getStepExecution(jobExecution, "s3");

View File

@@ -47,11 +47,11 @@ public class StopIncompleteJobParserTests extends AbstractJobParserTests {
assertEquals(1, stepNamesList.size());
assertTrue(stepNamesList.contains("fail"));
assertEquals(BatchStatus.STOPPED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), jobExecution.getExitStatus().getExitCode());
StepExecution stepExecution1 = getStepExecution(jobExecution, "fail");
assertEquals(BatchStatus.INCOMPLETE, stepExecution1.getStatus());
assertEquals(BatchStatus.FAILED, stepExecution1.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution1.getExitStatus().getExitCode());
//

View File

@@ -47,7 +47,7 @@ public class StopJobParserTests extends AbstractJobParserTests {
assertEquals(1, stepNamesList.size());
assertTrue(stepNamesList.contains("s1"));
assertEquals(BatchStatus.STOPPED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), jobExecution.getExitStatus().getExitCode());
StepExecution stepExecution1 = getStepExecution(jobExecution, "s1");

View File

@@ -140,7 +140,7 @@ public class AbstractJobTests {
// simulate restart and check the job execution context's content survives
execution.setEndTime(new Date());
execution.setStatus(BatchStatus.FAILED);
execution.setStatus(BatchStatus.INCOMPLETE);
repository.update(execution);
JobExecution restarted = repository.createJobExecution("testHandleStepJob", new JobParameters());

View File

@@ -251,7 +251,7 @@ public class SimpleJobTests {
assertEquals(2, jobExecution.getAllFailureExceptions().size());
assertEquals(exception, jobExecution.getStepExecutions().iterator().next().getFailureExceptions().get(0));
assertEquals(0, list.size());
checkRepository(BatchStatus.STOPPED, ExitStatus.FAILED);
checkRepository(BatchStatus.INCOMPLETE, ExitStatus.FAILED);
}
@Test
@@ -265,8 +265,8 @@ public class SimpleJobTests {
assertEquals(1, jobExecution.getAllFailureExceptions().size());
assertEquals(exception, jobExecution.getAllFailureExceptions().get(0));
assertEquals(0, list.size());
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
checkRepository(BatchStatus.FAILED, ExitStatus.FAILED);
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
checkRepository(BatchStatus.INCOMPLETE, ExitStatus.FAILED);
}
@Test
@@ -283,7 +283,7 @@ public class SimpleJobTests {
assertEquals(1, jobExecution.getAllFailureExceptions().size());
assertEquals(exception, jobExecution.getAllFailureExceptions().get(0));
assertEquals(1, list.size());
checkRepository(BatchStatus.FAILED, ExitStatus.FAILED);
checkRepository(BatchStatus.INCOMPLETE, ExitStatus.FAILED);
}
@Test
@@ -297,7 +297,7 @@ public class SimpleJobTests {
assertEquals(1, jobExecution.getAllFailureExceptions().size());
assertEquals(exception, jobExecution.getAllFailureExceptions().get(0));
assertEquals(0, list.size());
checkRepository(BatchStatus.FAILED, ExitStatus.FAILED);
checkRepository(BatchStatus.INCOMPLETE, ExitStatus.FAILED);
}
@Test
@@ -352,7 +352,7 @@ public class SimpleJobTests {
job.execute(jobExecution);
assertEquals(0, list.size());
checkRepository(BatchStatus.STOPPED, ExitStatus.NOOP);
checkRepository(BatchStatus.FAILED, ExitStatus.NOOP);
ExitStatus exitStatus = jobExecution.getExitStatus();
assertEquals(ExitStatus.NOOP.getExitCode(), exitStatus.getExitCode());
}
@@ -386,7 +386,7 @@ public class SimpleJobTests {
job.setJobExecutionListeners(new JobExecutionListener[] { listener });
job.execute(jobExecution);
assertEquals(BatchStatus.STOPPED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
verify(listener);
}
@@ -438,7 +438,7 @@ public class SimpleJobTests {
job.setSteps(Arrays.asList(new Step[] { step1, step2 }));
job.execute(jobExecution);
assertEquals(BatchStatus.STOPPED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
assertEquals(1, jobExecution.getAllFailureExceptions().size());
Throwable expected = jobExecution.getAllFailureExceptions().get(0);
assertTrue("Wrong exception " + expected, expected instanceof JobInterruptedException);
@@ -536,19 +536,19 @@ public class SimpleJobTests {
if (exception instanceof RuntimeException) {
stepExecution.setExitStatus(ExitStatus.FAILED);
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setStatus(BatchStatus.INCOMPLETE);
stepExecution.addFailureException(exception);
return;
}
if (exception instanceof Error) {
stepExecution.setExitStatus(ExitStatus.FAILED);
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setStatus(BatchStatus.INCOMPLETE);
stepExecution.addFailureException(exception);
return;
}
if (exception instanceof JobInterruptedException) {
stepExecution.setExitStatus(ExitStatus.FAILED);
stepExecution.setStatus(BatchStatus.STOPPED);
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.addFailureException(exception);
return;
}

View File

@@ -29,15 +29,15 @@ public class FlowExecutionTests {
@Test
public void testBasicProperties() throws Exception {
FlowExecution execution = new FlowExecution("foo", "BAR");
FlowExecution execution = new FlowExecution("foo", new FlowExecutionStatus("BAR"));
assertEquals("foo",execution.getName());
assertEquals("BAR",execution.getStatus().getStatus());
assertEquals("BAR",execution.getStatus().getExitStatus().getExitCode());
}
@Test
public void testAlphaOrdering() throws Exception {
FlowExecution first = new FlowExecution("foo", "BAR");
FlowExecution second = new FlowExecution("foo", "SPAM");
FlowExecution first = new FlowExecution("foo", new FlowExecutionStatus("BAR"));
FlowExecution second = new FlowExecution("foo", new FlowExecutionStatus("SPAM"));
assertTrue("Should be negative",first.compareTo(second)<0);
assertTrue("Should be positive",second.compareTo(first)>0);
}
@@ -45,31 +45,31 @@ public class FlowExecutionTests {
@Test
public void testEnumOrdering() throws Exception {
FlowExecution first = new FlowExecution("foo", FlowExecutionStatus.COMPLETED);
FlowExecution second = new FlowExecution("foo", FlowExecutionStatus.FAILED);
FlowExecution second = new FlowExecution("foo", FlowExecutionStatus.INCOMPLETE);
assertTrue("Should be negative",first.compareTo(second)<0);
assertTrue("Should be positive",second.compareTo(first)>0);
}
@Test
public void testEnumStartsWithOrdering() throws Exception {
FlowExecution first = new FlowExecution("foo", "COMPLETED.BAR");
FlowExecution second = new FlowExecution("foo", "FAILED.FOO");
FlowExecution first = new FlowExecution("foo", new FlowExecutionStatus("COMPLETED.BAR"));
FlowExecution second = new FlowExecution("foo", new FlowExecutionStatus("FAILED.FOO"));
assertTrue("Should be negative",first.compareTo(second)<0);
assertTrue("Should be positive",second.compareTo(first)>0);
}
@Test
public void testEnumStartsWithAlphaOrdering() throws Exception {
FlowExecution first = new FlowExecution("foo", "COMPLETED.BAR");
FlowExecution second = new FlowExecution("foo", "COMPLETED.FOO");
FlowExecution first = new FlowExecution("foo", new FlowExecutionStatus("COMPLETED.BAR"));
FlowExecution second = new FlowExecution("foo", new FlowExecutionStatus("COMPLETED.FOO"));
assertTrue("Should be negative",first.compareTo(second)<0);
assertTrue("Should be positive",second.compareTo(first)>0);
}
@Test
public void testEnumAndAlpha() throws Exception {
FlowExecution first = new FlowExecution("foo", "ZZZZZ");
FlowExecution second = new FlowExecution("foo", "FAILED.FOO");
FlowExecution first = new FlowExecution("foo", new FlowExecutionStatus("ZZZZZ"));
FlowExecution second = new FlowExecution("foo", new FlowExecutionStatus("FAILED.FOO"));
assertTrue("Should be negative",first.compareTo(second)<0);
assertTrue("Should be positive",second.compareTo(first)>0);
}

View File

@@ -32,8 +32,8 @@ 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.job.flow.support.SimpleFlow;
import org.springframework.batch.core.job.flow.support.StateSupport;
import org.springframework.batch.core.job.flow.support.StateTransition;
import org.springframework.batch.core.job.flow.support.state.DecisionState;
import org.springframework.batch.core.job.flow.support.state.EndState;
@@ -73,7 +73,10 @@ public class FlowJobTests {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2"));
transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("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.INCOMPLETE, ExitStatus.FAILED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end1")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
@@ -87,15 +90,11 @@ public class FlowJobTests {
public void testFailedStep() throws Exception {
SimpleFlow flow = new SimpleFlow("job");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(new StepSupport("step1") {
@Override
public void execute(StepExecution stepExecution) throws JobInterruptedException,
UnexpectedJobExecutionException {
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setExitStatus(ExitStatus.FAILED);
}
}), "step2"));
transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step2"))));
transitions.add(StateTransition.createStateTransition(new StateSupport("step1", FlowExecutionStatus.INCOMPLETE), "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.INCOMPLETE, ExitStatus.FAILED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end1")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
@@ -110,43 +109,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 StepSupport("step1") {
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2"));
State step2State = new StateSupport("step2") {
@Override
public void execute(StepExecution stepExecution) throws JobInterruptedException,
UnexpectedJobExecutionException {
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setExitStatus(ExitStatus.FAILED);
jobRepository.update(stepExecution);
}
}), "step2"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2") {
@Override
public void execute(StepExecution stepExecution) throws JobInterruptedException,
UnexpectedJobExecutionException {
public FlowExecutionStatus handle(FlowExecutor executor) throws Exception {
JobExecution jobExecution = executor.getJobExecution();
jobExecution.getStepExecutions().add(new StepExecution(getName(), jobExecution));
if (fail) {
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setExitStatus(ExitStatus.FAILED);
jobRepository.update(stepExecution);
} else {
super.execute(stepExecution);
return FlowExecutionStatus.INCOMPLETE;
}
else {
return FlowExecutionStatus.COMPLETED;
}
}
}), ExitStatus.COMPLETED.getExitCode(), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2") {
@Override
public void execute(StepExecution stepExecution) throws JobInterruptedException,
UnexpectedJobExecutionException {
if (fail) {
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setExitStatus(ExitStatus.FAILED);
jobRepository.update(stepExecution);
} else {
super.execute(stepExecution);
}
}
}), ExitStatus.FAILED.getExitCode(), "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(BatchStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.FAILED, "end1")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.INCOMPLETE, ExitStatus.FAILED, "end1")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
@@ -166,14 +146,14 @@ 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 StepSupport("step1") {
@Override
public void execute(StepExecution stepExecution) throws JobInterruptedException,
UnexpectedJobExecutionException {
stepExecution.setStatus(BatchStatus.STOPPED);
}
}), "step2"));
transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step2"))));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2"));
State state2 = new StateSupport("step2", FlowExecutionStatus.INCOMPLETE);
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.INCOMPLETE, ExitStatus.FAILED, "end0"), "step3"));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end1")));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step3")), "end2"));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end2")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
@@ -184,7 +164,7 @@ public class FlowJobTests {
catch (JobInterruptedException e) {
// expected
}
assertEquals(1, jobExecution.getStepExecutions().size());
assertEquals(2, jobExecution.getStepExecutions().size());
}
@Test
@@ -192,8 +172,11 @@ public class FlowJobTests {
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, "end"), "step2"));
transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step2"))));
transitions.add(StateTransition.createStateTransition(new EndState(BatchStatus.INCOMPLETE, 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.INCOMPLETE, ExitStatus.FAILED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end1")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
@@ -211,13 +194,16 @@ public class FlowJobTests {
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, "end"), "step2"));
transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step2"))));
transitions.add(StateTransition.createStateTransition(new EndState(BatchStatus.INCOMPLETE, 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.INCOMPLETE, ExitStatus.FAILED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end1")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
job.doExecute(jobExecution);
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
assertEquals(1, jobExecution.getStepExecutions().size());
}
@@ -226,18 +212,18 @@ public class FlowJobTests {
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, "end"), "step2"));
transitions.add(StateTransition.createStateTransition(new EndState(BatchStatus.INCOMPLETE, ExitStatus.FAILED, "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(BatchStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.FAILED, "end1")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.INCOMPLETE, ExitStatus.FAILED, "end1")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
// To test a restart we have to use the AbstractJob.execute()...
job.execute(jobExecution);
assertEquals(BatchStatus.STOPPED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
assertEquals(1, jobExecution.getStepExecutions().size());
jobExecution = jobRepository.createJobExecution("job", new JobParameters());
@@ -252,10 +238,15 @@ public class FlowJobTests {
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.createEndStateTransition(new StepState(new StubStep("step2"))));
transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step3"))));
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, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.INCOMPLETE, 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.INCOMPLETE, ExitStatus.FAILED, "end2")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end3")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
job.afterPropertiesSet();
@@ -268,9 +259,8 @@ public class FlowJobTests {
@Test
public void testBasicFlow() throws Throwable {
SimpleFlow flow = new SimpleFlow("job");
Step step = new StubStep("step");
List<StateTransition> transitions = new ArrayList<StateTransition>();
transitions.add(StateTransition.createStateTransition(new StepState(step), "end0"));
transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step")), "end0"));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end0")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
@@ -293,12 +283,17 @@ public class FlowJobTests {
};
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.createEndStateTransition(new StepState(new StubStep("step2")), "*"));
transitions.add(StateTransition.createEndStateTransition(new StepState(new StubStep("step3")), "*"));
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("step2")), ExitStatus.FAILED.getExitCode(), "end1"));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end0")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.INCOMPLETE, 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.INCOMPLETE, ExitStatus.FAILED, "end2")));
transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end3")));
flow.setStateTransitions(transitions);
job.setFlow(flow);
@@ -325,7 +320,6 @@ public class FlowJobTests {
job.setFlow(flow);
job.afterPropertiesSet();
Step step = job.getStep("step2");
assertNotNull(step);
assertEquals("step2", step.getName());

View File

@@ -162,7 +162,7 @@ public class SimpleFlowTests {
flow.setStateTransitions(collect(StateTransition.createStateTransition(new StubState("step1") {
@Override
public FlowExecutionStatus handle(FlowExecutor executor) {
return FlowExecutionStatus.FAILED;
return FlowExecutionStatus.INCOMPLETE;
}
}, "step2"), StateTransition.createEndStateTransition(new StubState("step2"))));
flow.afterPropertiesSet();

View File

@@ -15,6 +15,8 @@
*/
package org.springframework.batch.core.job.flow.support;
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;
@@ -28,16 +30,26 @@ import org.springframework.batch.core.job.flow.support.state.AbstractState;
*/
public class StateSupport extends AbstractState {
/**
* @param name
*/
private FlowExecutionStatus status;
public StateSupport(String name) {
this(name, FlowExecutionStatus.COMPLETED);
}
public StateSupport(String name, FlowExecutionStatus status) {
super(name);
this.status = status;
}
@Override
public FlowExecutionStatus handle(FlowExecutor executor) throws Exception {
return FlowExecutionStatus.COMPLETED;
JobExecution jobExecution = executor.getJobExecution();
if (jobExecution != null) {
jobExecution.getStepExecutions().add(new StepExecution(getName(), jobExecution));
}
return this.status;
}
public void validate(String nextState) {
}
}

View File

@@ -20,7 +20,7 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.springframework.batch.core.job.flow.support.StateTransition;
import org.springframework.batch.core.job.flow.State;
/**
* @author Dave Syer
@@ -28,98 +28,100 @@ import org.springframework.batch.core.job.flow.support.StateTransition;
*/
public class StateTransitionTests {
State state = new StateSupport("state1");
@Test
public void testIsEnd() {
StateTransition transition = StateTransition.createEndStateTransition(null, "");
StateTransition transition = StateTransition.createEndStateTransition(state, "");
assertTrue(transition.isEnd());
assertNull(transition.getNext());
}
@Test
public void testMatchesStar() {
StateTransition transition = StateTransition.createStateTransition(null, "*", "start");
StateTransition transition = StateTransition.createStateTransition(state, "*", "start");
assertTrue(transition.matches("CONTINUABLE"));
}
@Test
public void testMatchesNull() {
StateTransition transition = StateTransition.createStateTransition(null, null, "start");
StateTransition transition = StateTransition.createStateTransition(state, null, "start");
assertTrue(transition.matches("CONTINUABLE"));
}
@Test
public void testMatchesEmpty() {
StateTransition transition = StateTransition.createStateTransition(null, "", "start");
StateTransition transition = StateTransition.createStateTransition(state, "", "start");
assertTrue(transition.matches("CONTINUABLE"));
}
@Test
public void testMatchesExact() {
StateTransition transition = StateTransition.createStateTransition(null, "CONTINUABLE", "start");
StateTransition transition = StateTransition.createStateTransition(state, "CONTINUABLE", "start");
assertTrue(transition.matches("CONTINUABLE"));
}
@Test
public void testMatchesWildcard() {
StateTransition transition = StateTransition.createStateTransition(null, "CONTIN*", "start");
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN*", "start");
assertTrue(transition.matches("CONTINUABLE"));
}
@Test
public void testMatchesPlaceholder() {
StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start");
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN???LE", "start");
assertTrue(transition.matches("CONTINUABLE"));
}
@Test
public void testSimpleOrderingEqual() {
StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start");
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN???LE", "start");
assertEquals(0, transition.compareTo(transition));
}
@Test
public void testSimpleOrderingMoreGeneral() {
StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start");
StateTransition other = StateTransition.createStateTransition(null, "CONTINUABLE", "start");
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN???LE", "start");
StateTransition other = StateTransition.createStateTransition(state, "CONTINUABLE", "start");
assertEquals(1, transition.compareTo(other));
assertEquals(-1, other.compareTo(transition));
}
@Test
public void testSimpleOrderingMostGeneral() {
StateTransition transition = StateTransition.createStateTransition(null, "*", "start");
StateTransition other = StateTransition.createStateTransition(null, "CONTINUABLE", "start");
StateTransition transition = StateTransition.createStateTransition(state, "*", "start");
StateTransition other = StateTransition.createStateTransition(state, "CONTINUABLE", "start");
assertEquals(1, transition.compareTo(other));
assertEquals(-1, other.compareTo(transition));
}
@Test
public void testSubstringAndWildcard() {
StateTransition transition = StateTransition.createStateTransition(null, "CONTIN*", "start");
StateTransition other = StateTransition.createStateTransition(null, "CONTINUABLE", "start");
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN*", "start");
StateTransition other = StateTransition.createStateTransition(state, "CONTINUABLE", "start");
assertEquals(1, transition.compareTo(other));
assertEquals(-1, other.compareTo(transition));
}
@Test
public void testSimpleOrderingMostToNextGeneral() {
StateTransition transition = StateTransition.createStateTransition(null, "*", "start");
StateTransition other = StateTransition.createStateTransition(null, "C?", "start");
StateTransition transition = StateTransition.createStateTransition(state, "*", "start");
StateTransition other = StateTransition.createStateTransition(state, "C?", "start");
assertEquals(1, transition.compareTo(other));
assertEquals(-1, other.compareTo(transition));
}
@Test
public void testSimpleOrderingAdjacent() {
StateTransition transition = StateTransition.createStateTransition(null, "CON*", "start");
StateTransition other = StateTransition.createStateTransition(null, "CON?", "start");
StateTransition transition = StateTransition.createStateTransition(state, "CON*", "start");
StateTransition other = StateTransition.createStateTransition(state, "CON?", "start");
assertEquals(1, transition.compareTo(other));
assertEquals(-1, other.compareTo(transition));
}
@Test
public void testToString() {
StateTransition transition = StateTransition.createStateTransition(null, "CONTIN???LE", "start");
StateTransition transition = StateTransition.createStateTransition(state, "CONTIN???LE", "start");
String string = transition.toString();
assertTrue("Wrong string: " + string, string.contains("Transition"));
assertTrue("Wrong string: " + string, string.contains("start"));

View File

@@ -87,7 +87,7 @@ public class EndStateTests {
@Test
public void testHandleOngoingAttemptedDowngrade() throws Exception {
jobExecution.setStatus(BatchStatus.FAILED);
jobExecution.setStatus(BatchStatus.INCOMPLETE);
jobExecution.createStepExecution("foo");
EndState state = new EndState(BatchStatus.COMPLETED, "end");
@@ -99,7 +99,7 @@ public class EndStateTests {
});
// Can't downgrade a status - if it failed then it failed
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
}

View File

@@ -36,10 +36,10 @@ public class SimpleFlowExecutionAggregatorTests {
@Test
public void testFailed() throws Exception {
FlowExecution first = new FlowExecution("foo", FlowExecutionStatus.COMPLETED);
FlowExecution second = new FlowExecution("foo", FlowExecutionStatus.FAILED);
FlowExecution second = new FlowExecution("foo", FlowExecutionStatus.INCOMPLETE);
assertTrue("Should be negative", first.compareTo(second)<0);
assertTrue("Should be positive", second.compareTo(first)>0);
assertEquals(FlowExecutionStatus.FAILED, aggregator.aggregate(Arrays.asList(first, second)));
assertEquals(FlowExecutionStatus.INCOMPLETE, aggregator.aggregate(Arrays.asList(first, second)));
}
@Test

View File

@@ -78,7 +78,7 @@ public class RestartIntegrationTests {
int beforePartition = jdbcTemplate.queryForInt("SELECT COUNT(*) from BATCH_STEP_EXECUTION where STEP_NAME like 'step1:partition%'");
JobExecution execution = jobLauncher.run(job, jobParameters);
assertEquals(BatchStatus.FAILED,execution.getStatus());
assertEquals(BatchStatus.INCOMPLETE,execution.getStatus());
assertNotNull(jobLauncher.run(job, jobParameters));
int afterMaster = jdbcTemplate.queryForInt("SELECT COUNT(*) from BATCH_STEP_EXECUTION where STEP_NAME='step1:master'");

View File

@@ -88,7 +88,7 @@ public class PartitionStepTests {
throws Exception {
Set<StepExecution> executions = stepSplitter.split(stepExecution, 2);
for (StepExecution execution : executions) {
execution.setStatus(BatchStatus.FAILED);
execution.setStatus(BatchStatus.INCOMPLETE);
execution.setExitStatus(ExitStatus.FAILED);
}
return executions;
@@ -101,7 +101,7 @@ public class PartitionStepTests {
step.execute(stepExecution);
// one master and two workers
assertEquals(3, stepExecution.getJobExecution().getStepExecutions().size());
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
}
}

View File

@@ -45,21 +45,21 @@ public class StepExecutionAggregatorTests {
@Test
public void testAggregateStatusFromFailure() {
result.setStatus(BatchStatus.FAILED);
result.setStatus(BatchStatus.INCOMPLETE);
stepExecution1.setStatus(BatchStatus.COMPLETED);
stepExecution2.setStatus(BatchStatus.COMPLETED);
aggregator.aggregate(result, Arrays.<StepExecution> asList(stepExecution1, stepExecution2));
assertNotNull(result);
assertEquals(BatchStatus.FAILED, result.getStatus());
assertEquals(BatchStatus.INCOMPLETE, result.getStatus());
}
@Test
public void testAggregateStatusIncomplete() {
stepExecution1.setStatus(BatchStatus.COMPLETED);
stepExecution2.setStatus(BatchStatus.FAILED);
stepExecution2.setStatus(BatchStatus.INCOMPLETE);
aggregator.aggregate(result, Arrays.<StepExecution> asList(stepExecution1, stepExecution2));
assertNotNull(result);
assertEquals(BatchStatus.FAILED, result.getStatus());
assertEquals(BatchStatus.INCOMPLETE, result.getStatus());
}
@Test

View File

@@ -184,7 +184,7 @@ public abstract class AbstractStepExecutionDaoTests extends AbstractTransactiona
dao.saveStepExecution(stepExecution);
Integer versionAfterSave = stepExecution.getVersion();
stepExecution.setStatus(BatchStatus.STOPPED);
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setLastUpdated(new Date(System.currentTimeMillis()));
dao.updateStepExecution(stepExecution);
assertEquals(versionAfterSave + 1, stepExecution.getVersion().intValue());
@@ -192,7 +192,7 @@ public abstract class AbstractStepExecutionDaoTests extends AbstractTransactiona
StepExecution retrieved = dao.getStepExecution(jobExecution, stepExecution.getId());
assertEquals(stepExecution, retrieved);
assertEquals(stepExecution.getLastUpdated(), retrieved.getLastUpdated());
assertEquals(BatchStatus.STOPPED, retrieved.getStatus());
assertEquals(BatchStatus.FAILED, retrieved.getStatus());
}
/**

View File

@@ -113,10 +113,10 @@ public class SimpleJobRepositoryIntegrationTests {
// first execution failed
firstJobExec.setStartTime(new Date(4));
firstStepExec.setStartTime(new Date(5));
firstStepExec.setStatus(BatchStatus.FAILED);
firstStepExec.setStatus(BatchStatus.INCOMPLETE);
firstStepExec.setEndTime(new Date(6));
jobRepository.update(firstStepExec);
firstJobExec.setStatus(BatchStatus.FAILED);
firstJobExec.setStatus(BatchStatus.INCOMPLETE);
firstJobExec.setEndTime(new Date(7));
jobRepository.update(firstJobExec);
@@ -182,7 +182,7 @@ public class SimpleJobRepositoryIntegrationTests {
@Test
public void testGetLastJobExecution() throws Exception {
JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), jobParameters);
jobExecution.setStatus(BatchStatus.FAILED);
jobExecution.setStatus(BatchStatus.INCOMPLETE);
jobExecution.setEndTime(new Date());
jobRepository.update(jobExecution);
Thread.sleep(10);

View File

@@ -204,7 +204,7 @@ public class AbstractStepTests {
tested.setStepExecutionListeners(new StepExecutionListener[] { listener1, listener2 });
tested.execute(execution);
assertEquals(BatchStatus.FAILED, execution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, execution.getStatus());
Throwable expected = execution.getFailureExceptions().get(0);
assertEquals("crash!", expected.getMessage());
@@ -242,7 +242,7 @@ public class AbstractStepTests {
tested.setStepExecutionListeners(new StepExecutionListener[] { listener1, listener2 });
tested.execute(execution);
assertEquals(BatchStatus.STOPPED, execution.getStatus());
assertEquals(BatchStatus.FAILED, execution.getStatus());
Throwable expected = execution.getFailureExceptions().get(0);
assertEquals("JobExecution interrupted.", expected.getMessage());

View File

@@ -343,7 +343,7 @@ public class FaultTolerantStepFactoryBeanRetryTests {
StepExecution stepExecution = new StepExecution(step.getName(), jobExecution);
repository.add(stepExecution);
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
List<String> expectedOutput = Arrays.asList(StringUtils.commaDelimitedListToStringArray(""));
assertEquals(expectedOutput, written);
@@ -439,7 +439,7 @@ public class FaultTolerantStepFactoryBeanRetryTests {
StepExecution stepExecution = new StepExecution(step.getName(), jobExecution);
repository.add(stepExecution);
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
List<String> expectedOutput = Arrays.asList(StringUtils.commaDelimitedListToStringArray(""));
assertEquals(expectedOutput, written);
@@ -488,7 +488,7 @@ public class FaultTolerantStepFactoryBeanRetryTests {
StepExecution stepExecution = new StepExecution(step.getName(), jobExecution);
repository.add(stepExecution);
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
// We added a bogus cache so no items are actually skipped
// because they aren't recognised as eligible

View File

@@ -112,7 +112,7 @@ public class FaultTolerantStepFactoryBeanTests {
Step step = (Step) factory.getObject();
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution.getExitStatus().getExitCode());
assertTrue(stepExecution.getExitStatus().getExitDescription().contains("Non-skippable exception during read"));
@@ -141,7 +141,7 @@ public class FaultTolerantStepFactoryBeanTests {
Step step = (Step) factory.getObject();
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals(1, reader.processed.size());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution.getExitStatus().getExitCode());
assertTrue(stepExecution.getExitStatus().getExitDescription().contains("non-skippable exception"));
@@ -335,7 +335,7 @@ public class FaultTolerantStepFactoryBeanTests {
Step step = (Step) factory.getObject();
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals(3, stepExecution.getSkipCount());
assertEquals(2, stepExecution.getReadSkipCount());
@@ -374,7 +374,7 @@ public class FaultTolerantStepFactoryBeanTests {
Step step = (Step) factory.getObject();
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals("oops", stepExecution.getFailureExceptions().get(0).getCause().getMessage());
// listeners are called only once chunk is about to commit, so
@@ -408,7 +408,7 @@ public class FaultTolerantStepFactoryBeanTests {
Step step = (Step) factory.getObject();
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals("oops", stepExecution.getFailureExceptions().get(0).getCause().getMessage());
assertEquals(1, stepExecution.getSkipCount());
assertEquals(0, stepExecution.getReadSkipCount());
@@ -521,7 +521,7 @@ public class FaultTolerantStepFactoryBeanTests {
Step step = (Step) factory.getObject();
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals("bad skip count", 3, stepExecution.getSkipCount());
assertEquals("bad read skip count", 2, stepExecution.getReadSkipCount());
assertEquals("bad write skip count", 1, stepExecution.getWriteSkipCount());

View File

@@ -159,7 +159,7 @@ public class SimpleStepFactoryBeanTests {
job.execute(jobExecution);
assertEquals("Error!", jobExecution.getAllFailureExceptions().get(0).getMessage());
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
assertEquals(0, written.size());
// provider should be at second item
assertEquals("bar", reader.read());
@@ -182,7 +182,7 @@ public class SimpleStepFactoryBeanTests {
job.execute(jobExecution);
assertEquals("Foo", jobExecution.getAllFailureExceptions().get(0).getMessage());
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
}
@Test

View File

@@ -7,8 +7,8 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.springframework.batch.core.BatchStatus.COMPLETED;
import static org.springframework.batch.core.BatchStatus.INCOMPLETE;
import static org.springframework.batch.core.BatchStatus.FAILED;
import static org.springframework.batch.core.BatchStatus.STOPPED;
import static org.springframework.batch.core.BatchStatus.UNKNOWN;
import org.junit.Before;
@@ -73,14 +73,14 @@ public class TaskletStepExceptionTests {
public void testApplicationException() throws Exception {
taskletStep.execute(stepExecution);
assertEquals(FAILED, stepExecution.getStatus());
assertEquals(INCOMPLETE, stepExecution.getStatus());
}
@Test
public void testInterrupted() throws Exception {
taskletStep.setStepExecutionListeners(new StepExecutionListener[] { new InterruptionListener() });
taskletStep.execute(stepExecution);
assertEquals(STOPPED, stepExecution.getStatus());
assertEquals(FAILED, stepExecution.getStatus());
}
@Test
@@ -94,7 +94,7 @@ public class TaskletStepExceptionTests {
} });
taskletStep.execute(stepExecution);
assertEquals(FAILED, stepExecution.getStatus());
assertEquals(INCOMPLETE, stepExecution.getStatus());
assertTrue(stepExecution.getFailureExceptions().contains(exception));
assertEquals(2, jobRepository.getUpdateCount());
}
@@ -110,7 +110,7 @@ public class TaskletStepExceptionTests {
}
} });
taskletStep.execute(stepExecution);
assertEquals(FAILED, stepExecution.getStatus());
assertEquals(INCOMPLETE, stepExecution.getStatus());
assertTrue(stepExecution.getFailureExceptions().contains(exception));
assertEquals(2, jobRepository.getUpdateCount());
}
@@ -152,7 +152,7 @@ public class TaskletStepExceptionTests {
}
} });
taskletStep.execute(stepExecution);
assertEquals(FAILED, stepExecution.getStatus());
assertEquals(INCOMPLETE, stepExecution.getStatus());
assertTrue(stepExecution.getFailureExceptions().contains(taskletException));
assertFalse(stepExecution.getFailureExceptions().contains(exception));
assertEquals(2, jobRepository.getUpdateCount());
@@ -170,7 +170,7 @@ public class TaskletStepExceptionTests {
} });
taskletStep.execute(stepExecution);
assertEquals(FAILED, stepExecution.getStatus());
assertEquals(INCOMPLETE, stepExecution.getStatus());
assertTrue(stepExecution.getFailureExceptions().contains(taskletException));
assertTrue(stepExecution.getFailureExceptions().contains(exception));
assertEquals(2, jobRepository.getUpdateCount());

View File

@@ -114,7 +114,7 @@ public class StepExecutorInterruptionTests extends TestCase {
assertTrue("Timed out waiting for step to be interrupted.", count < 1000);
assertFalse(processingThread.isAlive());
assertEquals(BatchStatus.STOPPED, stepExecution.getStatus());
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
}
@@ -170,7 +170,7 @@ public class StepExecutorInterruptionTests extends TestCase {
assertTrue("Timed out waiting for step to be interrupted.", count < 1000);
assertFalse(processingThread.isAlive());
assertEquals(BatchStatus.STOPPED, stepExecution.getStatus());
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
}
@@ -201,7 +201,7 @@ public class StepExecutorInterruptionTests extends TestCase {
step.execute(stepExecution);
assertEquals("Planned!", stepExecution.getFailureExceptions().get(0).getMessage());
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
}
/**

View File

@@ -541,7 +541,7 @@ public class TaskletStepTests {
stepExecution.setExecutionContext(foobarEc);
step.execute(stepExecution);
assertEquals(BatchStatus.STOPPED, stepExecution.getStatus());
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
String msg = stepExecution.getExitStatus().getExitDescription();
assertTrue("Message does not contain 'JobInterruptedException': " + msg, contains(msg,
"JobInterruptedException"));
@@ -565,7 +565,7 @@ public class TaskletStepTests {
// step.setLastExecution(stepExecution);
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
// The original rollback was caused by this one:
assertEquals("Foo", stepExecution.getFailureExceptions().get(0).getMessage());
}
@@ -588,7 +588,7 @@ public class TaskletStepTests {
// step.setLastExecution(stepExecution);
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
// The original rollback was caused by this one:
assertEquals("Foo", stepExecution.getFailureExceptions().get(0).getMessage());
}
@@ -723,7 +723,7 @@ public class TaskletStepTests {
StepExecution stepExecution = new StepExecution(step.getName(), new JobExecution(jobInstance));
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
Throwable expected = stepExecution.getFailureExceptions().get(0);
assertEquals("CRASH!", expected.getMessage());
assertFalse(stepExecution.getExecutionContext().isEmpty());

View File

@@ -11,7 +11,10 @@
<job id="job">
<split id="split1">
<flow>
<step id="fail" ref="failingStep"/>
<step id="fail" ref="failingStep">
<fail on="FAILED"/>
<end on="*"/>
</step>
</flow>
<flow>
<step id="s1" ref="step1"/>

View File

@@ -17,7 +17,10 @@
<step id="s1" ref="step1"/>
</flow>
<flow>
<step id="fail" ref="failingStep"/>
<step id="fail" ref="failingStep">
<fail on="FAILED"/>
<end on="*"/>
</step>
</flow>
</split>
<step id="s3" ref="step3"/>

View File

@@ -99,11 +99,11 @@ public class ChunkMessageChannelItemWriter<T> extends StepExecutionListenerSuppo
}
catch (RuntimeException e) {
logger.debug("Detected failure waiting for results in step listener.", e);
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setStatus(BatchStatus.INCOMPLETE);
return ExitStatus.FAILED.addExitDescription(e.getClass().getName() + ": " + e.getMessage());
}
if (timedOut) {
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setStatus(BatchStatus.INCOMPLETE);
throw new ItemStreamException("Timed out waiting for back log at end of step");
}
return ExitStatus.COMPLETED.addExitDescription("Waited for " + expecting + " results.");

View File

@@ -27,8 +27,8 @@ import org.springframework.batch.core.JobExecution;
* (generally a handler cannot determine if the whole job execution is complete,
* so this is just information about the step).<br/>
*
* If the incoming status is {@link BatchStatus#FAILED},
* {@link BatchStatus#STOPPED} or {@link BatchStatus#STOPPING} the request
* If the incoming status is {@link BatchStatus#INCOMPLETE},
* {@link BatchStatus#FAILED} or {@link BatchStatus#STOPPING} the request
* should be ignored by handlers (passed on without modification).
*
* @author Dave Syer

View File

@@ -136,7 +136,7 @@ public class StepExecutionMessageHandler {
* @return
*/
private boolean isComplete(JobExecutionRequest request) {
return request.getStatus() == BatchStatus.FAILED || request.getStatus() == BatchStatus.STOPPED
return request.getStatus() == BatchStatus.INCOMPLETE || request.getStatus() == BatchStatus.FAILED
|| request.getStatus() == BatchStatus.STOPPING;
}
@@ -146,7 +146,7 @@ public class StepExecutionMessageHandler {
*/
private void handleFailure(JobExecutionRequest request, Throwable e) {
request.registerThrowable(e);
request.setStatus(BatchStatus.FAILED);
request.setStatus(BatchStatus.INCOMPLETE);
}
/*

View File

@@ -170,7 +170,7 @@ public class ChunkMessageItemWriterIntegrationTests {
// And make the back log real
requests.send(getSimpleMessage("foo", 4321L));
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution.getExitStatus().getExitCode());
String message = stepExecution.getExitStatus().getExitDescription();
assertTrue("Message does not contain 'wrong job': " + message, message.contains("wrong job"));
@@ -207,7 +207,7 @@ public class ChunkMessageItemWriterIntegrationTests {
StepExecution stepExecution = getStepExecution(step);
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution.getExitStatus().getExitCode());
String message = stepExecution.getExitStatus().getExitDescription();
assertTrue("Message does not contain 'bad': " + message, message.contains("bad"));
@@ -219,7 +219,7 @@ public class ChunkMessageItemWriterIntegrationTests {
assertTrue(1 <= TestItemWriter.count);
assertTrue(6 >= TestItemWriter.count);
// But it should fail the step in any case
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
}
@@ -242,7 +242,7 @@ public class ChunkMessageItemWriterIntegrationTests {
* loop would be bad, so the best we can do is fail as fast as possible.
*/
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution.getExitStatus().getExitCode());
String message = stepExecution.getExitStatus().getExitDescription();
assertTrue("Message did not contain 'timed out': " + message, message.toLowerCase().contains("timed out"));
@@ -276,7 +276,7 @@ public class ChunkMessageItemWriterIntegrationTests {
assertTrue(1 <= TestItemWriter.count);
assertTrue(6 >= TestItemWriter.count);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution.getExitStatus().getExitCode());
String exitDescription = stepExecution.getExitStatus().getExitDescription();

View File

@@ -105,7 +105,7 @@ public class MessageOrientedStepTests {
step.setPollingInterval(100);
StepExecution stepExecution = jobExecution.createStepExecution(step.getName());
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution.getExitStatus().getExitCode());
String message = stepExecution.getExitStatus().getExitDescription();
assertTrue("Wrong message: " + message, message.contains("StepExecutionTimeoutException"));
@@ -134,7 +134,7 @@ public class MessageOrientedStepTests {
});
StepExecution stepExecution = jobExecution.createStepExecution(step.getName());
step.execute(stepExecution);
assertEquals(BatchStatus.FAILED, stepExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus());
assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution.getExitStatus().getExitCode());
String message = stepExecution.getExitStatus().getExitDescription();
assertTrue("Wrong message: " + message, message.contains("Planned failure"));

View File

@@ -123,7 +123,7 @@ public class StepExecutionMessageHandlerTests {
JobRepositorySupport jobRepository = new JobRepositorySupport();
StepExecutionMessageHandler handler = createHandler(jobRepository);
JobExecution jobExecution = jobRepository.createJobExecution("job", new JobParameters());
jobExecution.setStatus(BatchStatus.FAILED);
jobExecution.setStatus(BatchStatus.INCOMPLETE);
JobExecutionRequest message = handler.handle(new JobExecutionRequest(jobExecution));
assertEquals(0, message.getJobExecution().getStepExecutions().size());
}
@@ -134,7 +134,7 @@ public class StepExecutionMessageHandlerTests {
@Override
public StepExecution getLastStepExecution(JobInstance jobInstance, String stepName) {
StepExecution stepExecution = new StepExecution(stepName, new JobExecution(jobInstance));
stepExecution.setStatus(BatchStatus.FAILED);
stepExecution.setStatus(BatchStatus.INCOMPLETE);
stepExecution.setExecutionContext(new ExecutionContext() {
{
put("foo", "bar");
@@ -205,7 +205,7 @@ public class StepExecutionMessageHandlerTests {
assertNotNull(message);
assertEquals(1, jobExecution.getStepExecutions().size());
JobExecutionRequest payload = message;
assertEquals(BatchStatus.FAILED, payload.getStatus());
assertEquals(BatchStatus.INCOMPLETE, payload.getStatus());
assertTrue(payload.hasErrors());
Throwable error = payload.getLastThrowable();
assertTrue(error instanceof StartLimitExceededException);

View File

@@ -69,7 +69,7 @@ public class DatabaseShutdownFunctionalTests extends AbstractBatchLauncherTests
}
assertFalse("Timed out waiting for job to end.", jobExecution.isRunning());
assertEquals(BatchStatus.STOPPED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
}

View File

@@ -64,7 +64,7 @@ public class GracefulShutdownFunctionalTests extends AbstractBatchLauncherTests
}
assertFalse("Timed out waiting for job to end.", jobExecution.isRunning());
assertEquals(BatchStatus.STOPPED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
}

View File

@@ -4,7 +4,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.springframework.batch.core.BatchStatus.STARTED;
import static org.springframework.batch.core.BatchStatus.STOPPED;
import static org.springframework.batch.core.BatchStatus.FAILED;
import java.util.List;
import java.util.Map;
@@ -91,12 +91,12 @@ public class JobOperatorFunctionalTests {
}
assertFalse(tested.getRunningExecutions(job.getName()).contains(executionId));
assertTrue(tested.getSummary(executionId).contains(STOPPED.toString()));
assertTrue(tested.getSummary(executionId).contains(FAILED.toString()));
// there is just a single step in the test job
Map<Long, String> summaries = tested.getStepExecutionSummaries(executionId);
assertEquals(1, summaries.size());
assertTrue(summaries.values().toString().contains(STOPPED.toString()));
assertTrue(summaries.values().toString().contains(FAILED.toString()));
}
@Test

View File

@@ -70,7 +70,7 @@ public class RestartFunctionalTests extends AbstractBatchLauncherTests {
int before = simpleJdbcTemplate.queryForInt("SELECT COUNT(*) FROM TRADE");
JobExecution jobExecution = runJobForRestartTest();
assertEquals(BatchStatus.FAILED, jobExecution.getStatus());
assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus());
Throwable expected = jobExecution.getAllFailureExceptions().get(0);
assertTrue("Not planned exception: " + expected.getMessage(), expected.getMessage().toLowerCase().indexOf(

View File

@@ -166,7 +166,7 @@ public class JdbcJobRepositoryTests {
cacheJobIds(execution);
execution.setEndTime(new Timestamp(System.currentTimeMillis()));
repository.update(execution);
execution.setStatus(BatchStatus.FAILED);
execution.setStatus(BatchStatus.INCOMPLETE);
int before = simpleJdbcTemplate.queryForInt("SELECT COUNT(*) FROM BATCH_JOB_INSTANCE");
assertEquals(1, before);