diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/BatchStatus.java b/spring-batch-core/src/main/java/org/springframework/batch/core/BatchStatus.java index 8f9ba0588..613ea1d8d 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/BatchStatus.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/BatchStatus.java @@ -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). */ - COMPLETED, STARTING, STARTED, FAILED, INCOMPLETE, STOPPING, UNKNOWN; + COMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED, ABANDONED, 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 == INCOMPLETE || this.isGreaterThan(INCOMPLETE); + return this == FAILED || this.isGreaterThan(FAILED); } /** diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/ExitStatus.java b/spring-batch-core/src/main/java/org/springframework/batch/core/ExitStatus.java index e10a2803a..327fad577 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/ExitStatus.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/ExitStatus.java @@ -66,7 +66,7 @@ public class ExitStatus implements Serializable, Comparable { * Convenient constant value representing finished processing with * interrupted status. */ - public static final ExitStatus INTERRUPTED = new ExitStatus("INTERRUPTED"); + public static final ExitStatus STOPPED = new ExitStatus("STOPPED"); private final String exitCode; @@ -159,7 +159,7 @@ public class ExitStatus implements Serializable, Comparable { if (status.exitCode.startsWith(NOOP.exitCode)) { return 3; } - if (status.exitCode.startsWith(INTERRUPTED.exitCode)) { + if (status.exitCode.startsWith(STOPPED.exitCode)) { return 4; } if (status.exitCode.startsWith(FAILED.exitCode)) { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/FlowParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/FlowParser.java index fe11ba536..d965ea28f 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/FlowParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/FlowParser.java @@ -41,20 +41,27 @@ import org.w3c.dom.NodeList; public class FlowParser extends AbstractSingleBeanDefinitionParser { private static final String NEXT = "next"; + private static final String END = "end"; + private static final String FAIL = "fail"; + private static final String STOP = "stop"; // For generating unique state names for end transitions private static int endCounter = 0; private final String flowName; + private final String jobRepositoryRef; /** - * Construct a {@link FlowParser} with the specified name and using the provided job repository ref. + * Construct a {@link FlowParser} with the specified name and using the + * provided job repository ref. + * * @param flowName the name of the flow - * @param jobRepositoryRef the reference to the jobRepository from the enclosing tag + * @param jobRepositoryRef the reference to the jobRepository from the + * enclosing tag */ public FlowParser(String flowName, String jobRepositoryRef) { this.flowName = flowName; @@ -122,11 +129,26 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser { * @param stateDef The bean definition for the current state * @param element the <step/gt; element to parse * @return a collection of - * {@link org.springframework.batch.core.job.flow.support.StateTransition} - * references + * {@link org.springframework.batch.core.job.flow.support.StateTransition} + * references */ protected static Collection getNextElements(ParserContext parserContext, BeanDefinition stateDef, Element element) { + return getNextElements(parserContext, null, stateDef, element); + } + + /** + * @param parserContext the parser context for the bean factory + * @param stepId the id of the current state if it is a step state, null + * otherwise + * @param stateDef The bean definition for the current state + * @param element the <step/gt; element to parse + * @return a collection of + * {@link org.springframework.batch.core.job.flow.support.StateTransition} + * references + */ + protected static Collection getNextElements(ParserContext parserContext, String stepId, + BeanDefinition stateDef, Element element) { Collection list = new ArrayList(); @@ -144,16 +166,16 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser { transitionName); for (Element transitionElement : transitionElements) { verifyUniquePattern(transitionElement, patterns, element, parserContext); - list.addAll(parseTransitionElement(transitionElement, stateDef, parserContext)); + list.addAll(parseTransitionElement(transitionElement, stepId, stateDef, parserContext)); transitionElementExists = true; } } if (!transitionElementExists) { - list.addAll(createTransition(BatchStatus.INCOMPLETE, ExitStatus.FAILED.getExitCode(), null, null, - stateDef, parserContext)); + list.addAll(createTransition(BatchStatus.FAILED, ExitStatus.FAILED.getExitCode(), null, null, stateDef, + parserContext, false)); if (!hasNextAttribute) { - list.addAll(createTransition(BatchStatus.COMPLETED, null, null, null, stateDef, parserContext)); + list.addAll(createTransition(BatchStatus.COMPLETED, null, null, null, stateDef, parserContext, false)); } } else if (hasNextAttribute) { @@ -185,43 +207,50 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser { * @param stateDef The bean definition for the current state * @param parserContext the parser context for the bean factory * @param a collection of - * {@link org.springframework.batch.core.job.flow.support.StateTransition} - * references + * {@link org.springframework.batch.core.job.flow.support.StateTransition} + * references */ - private static Collection parseTransitionElement(Element transitionElement, + private static Collection parseTransitionElement(Element transitionElement, String stateId, BeanDefinition stateDef, ParserContext parserContext) { BatchStatus batchStatus = getBatchStatusFromEndTransitionName(transitionElement.getNodeName()); String onAttribute = transitionElement.getAttribute("on"); String nextAttribute = transitionElement.getAttribute("to"); - nextAttribute = StringUtils.hasText(nextAttribute) ? nextAttribute : transitionElement.getAttribute("restart"); + String restartAttribute = transitionElement.getAttribute("restart"); + nextAttribute = StringUtils.hasText(nextAttribute) ? nextAttribute : restartAttribute; + boolean abandon = false; + if (stateId != null && StringUtils.hasText(restartAttribute) && !restartAttribute.equals(stateId)) { + abandon = true; + } String statusAttribute = transitionElement.getAttribute("status"); - return createTransition(batchStatus, onAttribute, nextAttribute, statusAttribute, stateDef, parserContext); + return createTransition(batchStatus, onAttribute, nextAttribute, statusAttribute, stateDef, parserContext, + abandon); } /** * @param batchStatus The batch status that this transition will set. Use - * BatchStatus.UNKNOWN if not applicable. + * BatchStatus.UNKNOWN if not applicable. * @param on The pattern that this transition should match. Use null for - * "no restriction" (same as "*"). + * "no restriction" (same as "*"). * @param next The state to which this transition should go. Use null if not - * applicable. + * applicable. * @param exitCode The exit code that this transition will set. Use null to - * default to batchStatus. + * default to batchStatus. * @param stateDef The bean definition for the current state * @param parserContext the parser context for the bean factory * @param a collection of - * {@link org.springframework.batch.core.job.flow.support.StateTransition} - * references + * {@link org.springframework.batch.core.job.flow.support.StateTransition} + * references */ private static Collection createTransition(BatchStatus batchStatus, String on, String next, - String exitCode, BeanDefinition stateDef, ParserContext parserContext) { + String exitCode, BeanDefinition stateDef, ParserContext parserContext, boolean abandon) { BeanDefinition endState = null; - if (batchStatus == BatchStatus.FAILED || batchStatus == BatchStatus.COMPLETED - || batchStatus == BatchStatus.INCOMPLETE) { + // TODO: revise this for clarity + if (batchStatus == BatchStatus.STOPPED || batchStatus == BatchStatus.COMPLETED + || batchStatus == BatchStatus.FAILED) { BeanDefinitionBuilder endBuilder = BeanDefinitionBuilder .genericBeanDefinition("org.springframework.batch.core.job.flow.support.state.EndState"); @@ -231,9 +260,12 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser { endBuilder.addConstructorArgValue(exitCodeExists ? new ExitStatus(exitCode) : convertToExitStatus(batchStatus)); - String endName = "end" + (endCounter++); + String endName = (batchStatus == BatchStatus.STOPPED ? STOP : batchStatus == BatchStatus.FAILED ? FAIL : END) + + (endCounter++); endBuilder.addConstructorArgValue(endName); + endBuilder.addConstructorArgValue(abandon); + String nextOnEnd = exitCodeExists ? null : next; endState = getStateTransitionReference(parserContext, endBuilder.getBeanDefinition(), null, nextOnEnd); next = endName; @@ -258,7 +290,7 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser { */ private static BatchStatus getBatchStatusFromEndTransitionName(String elementName) { if (STOP.equals(elementName)) { - return BatchStatus.INCOMPLETE; + return BatchStatus.STOPPED; } else if (END.equals(elementName)) { return BatchStatus.COMPLETED; @@ -276,7 +308,7 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser { * @return the ExitStatus corresponding to the BatchStatus */ private static ExitStatus convertToExitStatus(BatchStatus batchStatus) { - if (batchStatus == BatchStatus.INCOMPLETE) { + if (batchStatus == BatchStatus.FAILED) { return ExitStatus.FAILED; } else { @@ -289,13 +321,14 @@ public class FlowParser extends AbstractSingleBeanDefinitionParser { * @param stateDefinition a reference to the state implementation * @param on the pattern value * @param next the next step id - * @return a bean definition for a {@link org.springframework.batch.core.job.flow.support.StateTransition} + * @return a bean definition for a + * {@link org.springframework.batch.core.job.flow.support.StateTransition} */ public static BeanDefinition getStateTransitionReference(ParserContext parserContext, BeanDefinition stateDefinition, String on, String next) { - BeanDefinitionBuilder nextBuilder = - BeanDefinitionBuilder.genericBeanDefinition("org.springframework.batch.core.job.flow.support.StateTransition"); + BeanDefinitionBuilder nextBuilder = BeanDefinitionBuilder + .genericBeanDefinition("org.springframework.batch.core.job.flow.support.StateTransition"); nextBuilder.addConstructorArgValue(stateDefinition); if (StringUtils.hasText(on)) { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/InlineStepParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/InlineStepParser.java index 140b01f01..0075293b6 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/InlineStepParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/InlineStepParser.java @@ -101,7 +101,7 @@ public class InlineStepParser extends AbstractStepParser { else { parserContext.getReaderContext().error("Incomplete configuration detected while creating step with name " + stepRef, element); } - return FlowParser.getNextElements(parserContext, stateBuilder.getBeanDefinition(), element); + return FlowParser.getNextElements(parserContext, stepId, stateBuilder.getBeanDefinition(), element); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SplitParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SplitParser.java index 33b1967db..a68c23f78 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SplitParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SplitParser.java @@ -84,7 +84,6 @@ public class SplitParser { stateBuilder.addConstructorArgValue(managedList); stateBuilder.addConstructorArgValue(idAttribute); - // TODO: allow TaskExecutor etc. to be set return FlowParser.getNextElements(parserContext, stateBuilder.getBeanDefinition(), element); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java index 3d696e6cd..8a4d34872 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/AbstractJob.java @@ -37,6 +37,7 @@ import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.JobRestartException; import org.springframework.batch.core.step.StepLocator; import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.repeat.RepeatException; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; @@ -235,28 +236,32 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In listener.beforeJob(execution); - doExecute(execution); + try { + doExecute(execution); + } catch (RepeatException e) { + throw e.getCause(); + } } else { // The job was already stopped before we even got this far. Deal // with it in the same way as any other interruption. - execution.setExitStatus(ExitStatus.FAILED); - execution.setStatus(BatchStatus.INCOMPLETE); + execution.setStatus(BatchStatus.FAILED); + execution.setExitStatus(ExitStatus.COMPLETED); } } catch (JobInterruptedException e) { logger.error("Encountered interruption executing job", e); - execution.setExitStatus(ExitStatus.FAILED); - execution.setStatus(BatchStatus.INCOMPLETE); + execution.setExitStatus(ExitStatus.STOPPED); + execution.setStatus(BatchStatus.STOPPED); execution.addFailureException(e); } catch (Throwable t) { - logger.error("Encountered error executing job", t); + logger.error("Encountered fatal error executing job", t); execution.setExitStatus(ExitStatus.FAILED); - execution.setStatus(BatchStatus.INCOMPLETE); + execution.setStatus(BatchStatus.FAILED); execution.addFailureException(t); } finally { @@ -274,8 +279,9 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In catch (Exception e) { logger.error("Exception encountered in afterStep callback", e); } - + jobRepository.update(execution); + } @@ -293,7 +299,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#INCOMPLETE} or + * interrupted, and in particular if {@link BatchStatus#ABANDONED} or * {@link BatchStatus#STOPPING} is detected * @throws StartLimitExceededException if the start limit has been exceeded * for this step @@ -302,7 +308,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.INCOMPLETE) { + if (execution.isStopping()) { throw new JobInterruptedException("JobExecution interrupted."); } @@ -327,6 +333,7 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In jobRepository.add(currentStepExecution); + logger.info("Executing step: "+step); step.execute(currentStepExecution); jobRepository.updateExecutionContext(execution); @@ -382,9 +389,10 @@ public abstract class AbstractJob implements Job, StepLocator, BeanNameAware, In } if ((stepStatus == BatchStatus.COMPLETED && step.isAllowStartIfComplete() == false) - || stepStatus == BatchStatus.FAILED) { + || stepStatus == BatchStatus.ABANDONED) { // step is complete, false should be returned, indicating that the // step should not be started + logger.info("Step already complete or not restartable, so no action to execute: "+lastStepExecution); return false; } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/SimpleJob.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/SimpleJob.java index a977e30e2..29ffb7ed9 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/SimpleJob.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/SimpleJob.java @@ -101,6 +101,7 @@ public class SimpleJob extends AbstractJob { // Update the job status to be the same as the last step // if(stepExecution != null) { + logger.debug("Upgrading JobExecution status: "+stepExecution); execution.upgradeStatus(stepExecution.getStatus()); execution.setExitStatus(stepExecution.getExitStatus()); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionStatus.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionStatus.java index e7cb733ad..2e2ee1f65 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionStatus.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutionStatus.java @@ -15,59 +15,60 @@ */ package org.springframework.batch.core.job.flow; -import org.springframework.batch.core.BatchStatus; -import org.springframework.batch.core.ExitStatus; /** * This class is used as a holder for a BatchStatus/ExitStatus pair. * * @author Dan Garrette + * @author Dave Syer * @since 2.0 */ public class FlowExecutionStatus implements Comparable { - private final BatchStatus batchStatus; - private final ExitStatus exitStatus; + /** + * Special well-known status value. + */ + public static final FlowExecutionStatus COMPLETED = new FlowExecutionStatus(Status.COMPLETED.toString()); /** * Special well-known status value. */ - public static final FlowExecutionStatus COMPLETED = new FlowExecutionStatus(BatchStatus.COMPLETED, - ExitStatus.COMPLETED); + public static final FlowExecutionStatus STOPPED = new FlowExecutionStatus(Status.STOPPED.toString()); /** * Special well-known status value. */ - public static final FlowExecutionStatus INCOMPLETE = new FlowExecutionStatus(BatchStatus.INCOMPLETE, ExitStatus.FAILED); + public static final FlowExecutionStatus FAILED = new FlowExecutionStatus(Status.FAILED.toString()); /** * Special well-known status value. */ - public static final FlowExecutionStatus FAILED = new FlowExecutionStatus(BatchStatus.FAILED, ExitStatus.FAILED); + public static final FlowExecutionStatus UNKNOWN = new FlowExecutionStatus(Status.UNKNOWN.toString()); + + private final String status; + + private enum Status { + + COMPLETED, STOPPED, FAILED, UNKNOWN; + + static Status match(String value) { + for (int i = 0; i < values().length; i++) { + Status status = values()[i]; + if (value.startsWith(status.toString())) { + return status; + } + } + // Default match should be the lowest priority + return COMPLETED; + } + + }; /** - * Special well-known status value. + * @param status */ - public static final FlowExecutionStatus UNKNOWN = new FlowExecutionStatus(BatchStatus.UNKNOWN, ExitStatus.UNKNOWN); - - /** - * @param exitStatus - */ - public FlowExecutionStatus(String exitStatus) { - this.batchStatus = null; - this.exitStatus = new ExitStatus(exitStatus); - } - - /** - * Convenience constructor that accepts a {@link BatchStatus} and - * {@link ExitStatus}. - * - * @param batchStatus - * @param exitStatus - */ - public FlowExecutionStatus(BatchStatus batchStatus, ExitStatus exitStatus) { - this.batchStatus = batchStatus; - this.exitStatus = exitStatus; + public FlowExecutionStatus(String status) { + this.status = status; } /** @@ -80,13 +81,13 @@ public class FlowExecutionStatus implements Comparable { * @return negative, zero or positive as per the contract */ public int compareTo(FlowExecutionStatus other) { - if (batchStatus != null && other.getBatchStatus() != null) { - int order = batchStatus.compareTo(other.getBatchStatus()); - if (order != 0) { - return order; - } + Status one = Status.match(this.status); + Status two = Status.match(other.status); + int comparison = one.compareTo(two); + if (comparison == 0) { + return this.status.compareTo(other.status); } - return exitStatus.compareTo(other.getExitStatus()); + return comparison; } /** @@ -94,26 +95,23 @@ public class FlowExecutionStatus implements Comparable { * * @see java.lang.Object#equals(java.lang.Object) */ - public boolean equals(Object other) { - if (other == this) { + public boolean equals(Object object) { + if (object == this) { return true; } - if (!(other instanceof FlowExecutionStatus)) { + if (!(object instanceof FlowExecutionStatus)) { return false; } - FlowExecutionStatus flowExecutionStatus = (FlowExecutionStatus) other; - return batchStatus.equals(flowExecutionStatus.getBatchStatus()); + FlowExecutionStatus other = (FlowExecutionStatus) object; + return status.equals(other.status); } public String toString() { - return "FlowExecutionStatus: status=[" + batchStatus + "] exitcode=[" + exitStatus.getExitCode() + "]"; + return "FlowExecutionStatus: " + status; } - public BatchStatus getBatchStatus() { - return batchStatus; + public String getStatus() { + return status; } - public ExitStatus getExitStatus() { - return exitStatus; - } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutor.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutor.java index 302735622..6b83034ed 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutor.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowExecutor.java @@ -32,13 +32,15 @@ import org.springframework.batch.core.repository.JobRestartException; public interface FlowExecutor { /** - * @param step a {@link Step} to execute + * @param step + * a {@link Step} to execute * @return the exit status that drives the surrounding {@link Flow} * @throws StartLimitExceededException * @throws JobRestartException * @throws JobInterruptedException */ - String executeStep(Step step) throws JobInterruptedException, JobRestartException, StartLimitExceededException; + String executeStep(Step step) throws JobInterruptedException, + JobRestartException, StartLimitExceededException; /** * @return the current {@link JobExecution} @@ -49,11 +51,19 @@ public interface FlowExecutor { * @return the latest {@link StepExecution} or null if there is none */ StepExecution getStepExecution(); - + /** - * Chance to clean up resources at the end of a flow (whether it completed successfully or not). - * @param result the final {@link FlowExecution} + * Chance to clean up resources at the end of a flow (whether it completed + * successfully or not). + * + * @param result + * the final {@link FlowExecution} */ void close(FlowExecution result); + /** + * Handle any status changes that might be needed at the start of a state. + */ + void updateStepExecutionStatus(); + } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowJob.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowJob.java index 2f2fa4470..85aa80758 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowJob.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/FlowJob.java @@ -51,7 +51,9 @@ public class FlowJob extends AbstractJob { /** * Public setter for the flow. - * @param flow the flow to set + * + * @param flow + * the flow to set */ public void setFlow(Flow flow) { this.flow = flow; @@ -75,21 +77,16 @@ public class FlowJob extends AbstractJob { * @see AbstractJob#doExecute(JobExecution) */ @Override - protected void doExecute(final JobExecution execution) throws JobExecutionException { + protected void doExecute(final JobExecution execution) + throws JobExecutionException { try { - FlowExecution flowExecution = flow.start(new JobFlowExecutor(execution)); - - synchronized (execution) { - FlowExecutionStatus status = flowExecution.getStatus(); - execution.upgradeStatus(status.getBatchStatus()); - execution.setExitStatus(status.getExitStatus()); - } - } - catch (FlowExecutionException e) { + flow.start(new JobFlowExecutor(execution)); + } catch (FlowExecutionException e) { if (e.getCause() instanceof JobExecutionException) { throw (JobExecutionException) e.getCause(); } - throw new JobExecutionException("Flow execution ended unexpectedly", e); + throw new JobExecutionException( + "Flow execution ended unexpectedly", e); } } @@ -111,17 +108,22 @@ public class FlowJob extends AbstractJob { stepExecutionHolder.set(null); } - public String executeStep(Step step) throws JobInterruptedException, JobRestartException, - StartLimitExceededException { - StepExecution lastStepExecution = stepExecutionHolder.get(); - if (lastStepExecution != null && lastStepExecution.getStatus() == BatchStatus.INCOMPLETE) { - lastStepExecution.setStatus(BatchStatus.FAILED); - updateStepExecution(lastStepExecution); - } + public String executeStep(Step step) throws JobInterruptedException, + JobRestartException, StartLimitExceededException { StepExecution stepExecution = handleStep(step, execution); stepExecutionHolder.set(stepExecution); - return stepExecution == null ? ExitStatus.COMPLETED.getExitCode() : stepExecution.getExitStatus() - .getExitCode(); + return stepExecution == null ? ExitStatus.COMPLETED.getExitCode() + : stepExecution.getExitStatus().getExitCode(); + } + + public void updateStepExecutionStatus() { + StepExecution lastStepExecution = stepExecutionHolder.get(); + if (lastStepExecution != null + && lastStepExecution.getStatus().isGreaterThan( + BatchStatus.STOPPING)) { + lastStepExecution.upgradeStatus(BatchStatus.ABANDONED); + updateStepExecution(lastStepExecution); + } } public JobExecution getJobExecution() { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/SimpleFlow.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/SimpleFlow.java index 76bcf3210..982ea9575 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/SimpleFlow.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/SimpleFlow.java @@ -121,7 +121,7 @@ public class SimpleFlow implements Flow, InitializingBean { State state = stateMap.get(stateName); // Terminate if there are no more states - while (state != null) { + while (state != null && status!=FlowExecutionStatus.STOPPED) { stateName = state.getName(); @@ -158,7 +158,7 @@ public class SimpleFlow implements Flow, InitializingBean { } String next = null; - String exitCode = status.getExitStatus().getExitCode(); + String exitCode = status.getStatus(); for (StateTransition stateTransition : set) { if (stateTransition.matches(exitCode)) { if (stateTransition.isEnd()) { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/EndState.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/EndState.java index f5539b6bc..478c47b5d 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/EndState.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/EndState.java @@ -33,17 +33,10 @@ import org.springframework.batch.core.job.flow.State; public class EndState extends AbstractState { private final BatchStatus status; + private final ExitStatus exitStatus; - /** - * ExitStatus will be defaulted to the given BatchStatus - * - * @param status The BatchStatus to end with - * @param name The name of the state - */ - public EndState(BatchStatus status, String name) { - this(status, new ExitStatus(status.toString()), name); - } + private final boolean abandon; /** * @param status The BatchStatus to end with @@ -51,14 +44,27 @@ public class EndState extends AbstractState { * @param name The name of the state */ public EndState(BatchStatus status, ExitStatus exitStatus, String name) { + this(status, exitStatus, name, false); + } + + /** + * @param status The BatchStatus to end with + * @param exitStatus The ExitStatus to end with + * @param name The name of the state + * @param abandon flag to indicate that previous step execution can be + * marked as abandoned (if there is one) + * + */ + public EndState(BatchStatus status, ExitStatus exitStatus, String name, boolean abandon) { super(name); this.status = status; this.exitStatus = exitStatus; + this.abandon = abandon; } /** * Return the {@link BatchStatus} and {@link ExitStatus} stored. If the - * {@link BatchStatus} is {@link BatchStatus#INCOMPLETE}, 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) @@ -66,25 +72,45 @@ public class EndState extends AbstractState { @Override public FlowExecutionStatus handle(FlowExecutor executor) throws Exception { JobExecution jobExecution = executor.getJobExecution(); - // If there are no step executions, then we are at the beginning of a - // restart synchronized (jobExecution) { if (!jobExecution.getStepExecutions().isEmpty()) { - if (status == BatchStatus.INCOMPLETE) { - jobExecution.upgradeStatus(status); - jobExecution.setExitStatus(exitStatus); + /* + * If there are step executions, then we are not at the + * beginning of a restart. + * + * N.B. EndState has to be able to set the status directly, but + * only because the internal flows inside SplitStates contain + * EndState (which maybe they should not, since the JobExecution + * is not ending). + */ + jobExecution.setStatus(status); + jobExecution.setExitStatus(exitStatus); + if (status == BatchStatus.STOPPED) { + /* + * If we are in flight (not a restart) and we are supposed + * to signal a stop, then make sure that happens + * irrespective of the exit status. + */ + if (abandon) { + // Only if instructed to do so upgrade the status of + // last step execution... + executor.updateStepExecutionStatus(); + } + return FlowExecutionStatus.STOPPED; } } - return new FlowExecutionStatus(status, exitStatus); + return new FlowExecutionStatus(exitStatus.getExitCode()); } } - - /* (non-Javadoc) - * @see org.springframework.batch.core.job.flow.State#validate(java.lang.String) + /* + * (non-Javadoc) + * + * @see + * org.springframework.batch.core.job.flow.State#validate(java.lang.String) */ public void validate(String pattern, String nextState) { - if (status != BatchStatus.INCOMPLETE && nextState != null) { + if (status != BatchStatus.STOPPED && nextState != null) { throw new IllegalStateException("The transition for " + getClass().getSimpleName() + " [" + getName() + "] may not have a 'next' state."); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/SplitState.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/SplitState.java index 91d9d2013..e1f75ed63 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/SplitState.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/SplitState.java @@ -71,6 +71,8 @@ public class SplitState extends AbstractState { @Override public FlowExecutionStatus handle(final FlowExecutor executor) throws Exception { + // TODO: collect the last StepExecution from the flows as well, so they + // can be abandoned if necessary Collection> tasks = new ArrayList>(); for (final Flow flow : flows) { @@ -103,8 +105,11 @@ public class SplitState extends AbstractState { } - /* (non-Javadoc) - * @see org.springframework.batch.core.job.flow.State#validate(java.lang.String) + /* + * (non-Javadoc) + * + * @see + * org.springframework.batch.core.job.flow.State#validate(java.lang.String) */ public void validate(String pattern, String nextState) { if (nextState == null) { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/StepState.java b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/StepState.java index 166b09653..ec821ffb0 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/StepState.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/job/flow/support/state/StepState.java @@ -52,6 +52,7 @@ public class StepState extends AbstractState implements StepHolder { @Override public FlowExecutionStatus handle(FlowExecutor executor) throws Exception { + executor.updateStepExecutionStatus(); return new FlowExecutionStatus(executor.executeStep(step)); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java index 9bafeacfb..78dd3b7b2 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/SimpleJobLauncher.java @@ -112,7 +112,7 @@ public class SimpleJobLauncher implements JobLauncher, InitializingBean { + "] and the following status: [" + jobExecution.getStatus() + "]"); } catch (Throwable t) { - logger.info("Job: [" + job + "] failed with the following parameters: [" + jobParameters + "]", t); + logger.info("Job: [" + job + "] failed unexpectedly and fatally with the following parameters: [" + jobParameters + "]", t); rethrow(t); } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/partition/support/TaskExecutorPartitionHandler.java b/spring-batch-core/src/main/java/org/springframework/batch/core/partition/support/TaskExecutorPartitionHandler.java index 54edc01e7..c8a45d181 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/partition/support/TaskExecutorPartitionHandler.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/partition/support/TaskExecutorPartitionHandler.java @@ -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.INCOMPLETE); + stepExecution.setStatus(BatchStatus.FAILED); stepExecution.setExitStatus(exitStatus); result.add(stepExecution); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/SimpleJobRepository.java b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/SimpleJobRepository.java index 6e48baa77..b4677fc62 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/SimpleJobRepository.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/SimpleJobRepository.java @@ -114,7 +114,7 @@ public class SimpleJobRepository implements JobRepository { } BatchStatus status = execution.getStatus(); - if (status == BatchStatus.COMPLETED || status == BatchStatus.FAILED) { + if (status == BatchStatus.COMPLETED || status == BatchStatus.ABANDONED) { 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."); @@ -237,7 +237,7 @@ public class SimpleJobRepository implements JobRepository { private void checkForInterruption(StepExecution stepExecution) { JobExecution jobExecution = stepExecution.getJobExecution(); jobExecutionDao.synchronizeStatus(jobExecution); - if (jobExecution.getStatus() == BatchStatus.STOPPING) { + if (jobExecution.isStopping()) { stepExecution.setTerminateOnly(); } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java index 34a3f77a6..f51b7134d 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java @@ -34,6 +34,7 @@ import org.springframework.batch.core.listener.CompositeStepExecutionListener; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.scope.context.StepSynchronizationManager; import org.springframework.batch.item.ExecutionContext; +import org.springframework.batch.repeat.RepeatException; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; @@ -189,12 +190,15 @@ public abstract class AbstractStep implements Step, InitializingBean, BeanNameAw getCompositeListener().beforeStep(stepExecution); open(stepExecution.getExecutionContext()); - doExecute(stepExecution); + try { + doExecute(stepExecution); + } catch (RepeatException e) { + throw e.getCause(); + } exitStatus = stepExecution.getExitStatus(); // Check if someone is trying to stop us if (stepExecution.isTerminateOnly()) { - stepExecution.setStatus(BatchStatus.INCOMPLETE); throw new JobInterruptedException("JobExecution interrupted."); } @@ -263,10 +267,10 @@ public abstract class AbstractStep implements Step, InitializingBean, BeanNameAw return BatchStatus.UNKNOWN; } else if (e instanceof JobInterruptedException || e.getCause() instanceof JobInterruptedException) { - return BatchStatus.INCOMPLETE; + return BatchStatus.STOPPED; } else { - return BatchStatus.INCOMPLETE; + return BatchStatus.FAILED; } } @@ -321,7 +325,7 @@ public abstract class AbstractStep implements Step, InitializingBean, BeanNameAw private ExitStatus getDefaultExitStatusForFailure(Throwable ex) { ExitStatus exitStatus; if (ex instanceof JobInterruptedException || ex.getCause() instanceof JobInterruptedException) { - exitStatus = ExitStatus.INTERRUPTED.addExitDescription(JobInterruptedException.class.getName()); + exitStatus = ExitStatus.STOPPED.addExitDescription(JobInterruptedException.class.getName()); } else if (ex instanceof NoSuchJobException || ex.getCause() instanceof NoSuchJobException) { exitStatus = new ExitStatus(ExitCodeMapper.NO_SUCH_JOB, ex.getClass().getName()); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java index 90124f9bf..dcd0acdb8 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/TaskletStep.java @@ -257,7 +257,7 @@ public class TaskletStep extends AbstractStep { locked = true; } catch (InterruptedException e) { - stepExecution.setStatus(BatchStatus.INCOMPLETE); + stepExecution.setStatus(BatchStatus.STOPPED); Thread.currentThread().interrupt(); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/BatchStatusTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/BatchStatusTests.java index e7b8227ad..c4ac077fb 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/BatchStatusTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/BatchStatusTests.java @@ -40,22 +40,22 @@ public class BatchStatusTests { */ @Test public void testToString() { - assertEquals("FAILED", BatchStatus.FAILED.toString()); + assertEquals("ABANDONED", BatchStatus.ABANDONED.toString()); } @Test public void testMaxStatus() { - 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.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.STARTED, BatchStatus.max(BatchStatus.STARTED, BatchStatus.STARTING)); assertEquals(BatchStatus.STARTED, BatchStatus.max(BatchStatus.COMPLETED, BatchStatus.STARTED)); } @Test public void testUpgradeStatusFinished() { - assertEquals(BatchStatus.INCOMPLETE, BatchStatus.INCOMPLETE.upgradeTo(BatchStatus.COMPLETED)); - assertEquals(BatchStatus.INCOMPLETE, BatchStatus.COMPLETED.upgradeTo(BatchStatus.INCOMPLETE)); + assertEquals(BatchStatus.FAILED, BatchStatus.FAILED.upgradeTo(BatchStatus.COMPLETED)); + assertEquals(BatchStatus.FAILED, BatchStatus.COMPLETED.upgradeTo(BatchStatus.FAILED)); } @Test @@ -68,7 +68,7 @@ public class BatchStatusTests { @Test public void testIsRunning() { - assertFalse(BatchStatus.INCOMPLETE.isRunning()); + assertFalse(BatchStatus.FAILED.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.INCOMPLETE.isUnsuccessful()); + assertTrue(BatchStatus.FAILED.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.INCOMPLETE, BatchStatus.valueOf(BatchStatus.INCOMPLETE.toString())); + assertEquals(BatchStatus.FAILED, BatchStatus.valueOf(BatchStatus.FAILED.toString())); } @Test diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/JobExecutionTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/JobExecutionTests.java index 67f9b24eb..4be3a5b12 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/JobExecutionTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/JobExecutionTests.java @@ -113,9 +113,9 @@ public class JobExecutionTests { */ @Test public void testDowngradeStatus() { - execution.setStatus(BatchStatus.INCOMPLETE); + execution.setStatus(BatchStatus.FAILED); execution.upgradeStatus(BatchStatus.COMPLETED); - assertEquals(BatchStatus.INCOMPLETE, execution.getStatus()); + assertEquals(BatchStatus.FAILED, execution.getStatus()); } /** diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/StepExecutionTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/StepExecutionTests.java index 106c386fc..8f5ee9ec5 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/StepExecutionTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/StepExecutionTests.java @@ -286,9 +286,9 @@ public class StepExecutionTests { */ @Test public void testDowngradeStatus() { - execution.setStatus(BatchStatus.INCOMPLETE); + execution.setStatus(BatchStatus.FAILED); execution.upgradeStatus(BatchStatus.COMPLETED); - assertEquals(BatchStatus.INCOMPLETE, execution.getStatus()); + assertEquals(BatchStatus.FAILED, execution.getStatus()); } private StepExecution newStepExecution(Step step, Long long2) { diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/support/OsgiBundleXmlApplicationContextFactoryTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/support/OsgiBundleXmlApplicationContextFactoryTests.java index 9cc02bfb2..7e7042d20 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/support/OsgiBundleXmlApplicationContextFactoryTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/support/OsgiBundleXmlApplicationContextFactoryTests.java @@ -46,7 +46,7 @@ public class OsgiBundleXmlApplicationContextFactoryTests { expect(bundleContext.getBundle()).andReturn(bundle).anyTimes(); replay(bundleContext, bundle); factory.setBundleContext(bundleContext); - // TODO: finish this... + // TODO: mock out the OSGi bundle resource... // factory.createApplicationContext(); verify(bundleContext, bundle); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/DefaultFailureJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/DefaultFailureJobParserTests.java index 041f0e0d4..822e0b739 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/DefaultFailureJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/DefaultFailureJobParserTests.java @@ -44,7 +44,7 @@ public class DefaultFailureJobParserTests extends AbstractJobParserTests { assertTrue(stepNamesList.contains("s1")); assertTrue(stepNamesList.contains("fail")); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.FAILED, jobExecution.getStatus()); assertEquals(ExitStatus.FAILED.getExitCode(), jobExecution.getExitStatus().getExitCode()); StepExecution stepExecution1 = getStepExecution(jobExecution, "s1"); @@ -52,7 +52,7 @@ public class DefaultFailureJobParserTests extends AbstractJobParserTests { assertEquals(ExitStatus.COMPLETED, stepExecution1.getExitStatus()); StepExecution stepExecution2 = getStepExecution(jobExecution, "fail"); - assertEquals(BatchStatus.INCOMPLETE, stepExecution2.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution2.getStatus()); assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode()); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/EndTransitionDefaultStatusJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/EndTransitionDefaultStatusJobParserTests.java index 898bed1e1..6eab69b15 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/EndTransitionDefaultStatusJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/EndTransitionDefaultStatusJobParserTests.java @@ -47,7 +47,7 @@ public class EndTransitionDefaultStatusJobParserTests extends AbstractJobParserT assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus()); StepExecution stepExecution1 = getStepExecution(jobExecution, "fail"); - assertEquals(BatchStatus.INCOMPLETE, stepExecution1.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution1.getStatus()); assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution1.getExitStatus().getExitCode()); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/EndTransitionJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/EndTransitionJobParserTests.java index d799493a0..4ca7874fa 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/EndTransitionJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/EndTransitionJobParserTests.java @@ -57,7 +57,7 @@ public class EndTransitionJobParserTests extends AbstractJobParserTests { assertEquals(ExitStatus.COMPLETED, stepExecution1.getExitStatus()); StepExecution stepExecution2 = getStepExecution(jobExecution, "fail"); - assertEquals(BatchStatus.INCOMPLETE, stepExecution2.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution2.getStatus()); assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode()); // diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/FailTransitionJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/FailTransitionJobParserTests.java index 387b07b06..f3edce80e 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/FailTransitionJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/FailTransitionJobParserTests.java @@ -17,7 +17,6 @@ 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; @@ -25,7 +24,6 @@ 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; @@ -50,28 +48,27 @@ public class FailTransitionJobParserTests extends AbstractJobParserTests { assertTrue(stepNamesList.contains("fail")); assertEquals(BatchStatus.FAILED, jobExecution.getStatus()); - assertEquals("EARLY TERMINATION (FAIL)", jobExecution.getExitStatus().getExitCode()); + assertEquals("EARLY TERMINATION (FAIL)", 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.INCOMPLETE, stepExecution2.getStatus()); - assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode()); + assertEquals(BatchStatus.FAILED, stepExecution2.getStatus()); + assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2 + .getExitStatus().getExitCode()); // // Second Launch // stepNamesList.clear(); - try { - jobExecution = createJobExecution(); - fail("JobInstanceAlreadyCompleteException expected"); - } catch (JobInstanceAlreadyCompleteException e) { - // - // Expected - // - } + jobExecution = createJobExecution(); + job.execute(jobExecution); + assertEquals(1, stepNamesList.size()); + assertTrue(stepNamesList.contains("fail")); + assertEquals(BatchStatus.FAILED, jobExecution.getStatus()); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/NextAttributeJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/NextAttributeJobParserTests.java index 5035fbb92..7e9d396b9 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/NextAttributeJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/NextAttributeJobParserTests.java @@ -45,7 +45,7 @@ public class NextAttributeJobParserTests extends AbstractJobParserTests { assertTrue(stepNamesList.contains("s1")); assertTrue(stepNamesList.contains("fail")); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.FAILED, jobExecution.getStatus()); assertEquals("FAILED", jobExecution.getExitStatus().getExitCode()); StepExecution stepExecution1 = getStepExecution(jobExecution, "s1"); @@ -53,7 +53,7 @@ public class NextAttributeJobParserTests extends AbstractJobParserTests { assertEquals(ExitStatus.COMPLETED, stepExecution1.getExitStatus()); StepExecution stepExecution2 = getStepExecution(jobExecution, "fail"); - assertEquals(BatchStatus.INCOMPLETE, stepExecution2.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution2.getStatus()); assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode()); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailFirstJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailFirstJobParserTests.java index 4f672bd2d..c1b18de63 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailFirstJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailFirstJobParserTests.java @@ -44,7 +44,7 @@ public class SplitDifferentResultsFailFirstJobParserTests extends AbstractJobPar assertTrue(stepNamesList.contains("s1")); assertTrue(stepNamesList.contains("fail")); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution2.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution2.getStatus()); assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode()); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailSecondJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailSecondJobParserTests.java index 445bfb550..975ed2dbf 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailSecondJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailSecondJobParserTests.java @@ -40,7 +40,7 @@ public class SplitDifferentResultsFailSecondJobParserTests extends AbstractJobPa JobExecution jobExecution = createJobExecution(); job.execute(jobExecution); - assertEquals(3, stepNamesList.size()); + assertEquals("Wrong step anmes: "+stepNamesList, 3, stepNamesList.size()); assertTrue(stepNamesList.contains("s1")); assertTrue(stepNamesList.contains("fail")); assertTrue(stepNamesList.contains("s3")); @@ -53,7 +53,7 @@ public class SplitDifferentResultsFailSecondJobParserTests extends AbstractJobPa assertEquals(ExitStatus.COMPLETED, stepExecution1.getExitStatus()); StepExecution stepExecution2 = getStepExecution(jobExecution, "fail"); - assertEquals(BatchStatus.INCOMPLETE, stepExecution2.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution2.getStatus()); assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution2.getExitStatus().getExitCode()); StepExecution stepExecution3 = getStepExecution(jobExecution, "s3"); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopAndRestartJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopAndRestartJobParserTests.java new file mode 100644 index 000000000..da1662dea --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopAndRestartJobParserTests.java @@ -0,0 +1,74 @@ +/* + * Copyright 2006-2007 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.batch.core.configuration.xml; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.runner.RunWith; +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.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Dave Syer + * + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class StopAndRestartJobParserTests extends AbstractJobParserTests { + + @Test + public void testStopIncomplete() throws Exception { + + // + // First Launch + // + JobExecution jobExecution = createJobExecution(); + job.execute(jobExecution); + assertEquals(1, stepNamesList.size()); + assertTrue(stepNamesList.contains("s1")); + + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); + assertEquals(ExitStatus.STOPPED.getExitCode(), jobExecution.getExitStatus().getExitCode()); + + StepExecution stepExecution1 = getStepExecution(jobExecution, "s1"); + assertEquals(BatchStatus.COMPLETED, stepExecution1.getStatus()); + assertEquals(ExitStatus.COMPLETED.getExitCode(), stepExecution1.getExitStatus().getExitCode()); + + // + // Second Launch + // + stepNamesList.clear(); + jobExecution = createJobExecution(); + job.execute(jobExecution); + assertEquals(1, stepNamesList.size()); // step1 is not executed + assertTrue(stepNamesList.contains("s2")); + + assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); + assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus()); + + StepExecution stepExecution2 = getStepExecution(jobExecution, "s2"); + assertEquals(BatchStatus.COMPLETED, stepExecution2.getStatus()); + assertEquals(ExitStatus.COMPLETED, stepExecution2.getExitStatus()); + + } + +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopIncompleteJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopIncompleteJobParserTests.java index 98158e16b..5a0fb046d 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopIncompleteJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopIncompleteJobParserTests.java @@ -24,7 +24,6 @@ import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.StepExecution; -import org.springframework.batch.core.job.flow.JobExecutionDecider; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -44,14 +43,14 @@ public class StopIncompleteJobParserTests extends AbstractJobParserTests { // JobExecution jobExecution = createJobExecution(); job.execute(jobExecution); + assertTrue("Wrong steps executed: "+stepNamesList, stepNamesList.contains("fail")); assertEquals(1, stepNamesList.size()); - assertTrue(stepNamesList.contains("fail")); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); - assertEquals(ExitStatus.FAILED.getExitCode(), jobExecution.getExitStatus().getExitCode()); + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); + assertEquals(ExitStatus.STOPPED.getExitCode(), jobExecution.getExitStatus().getExitCode()); StepExecution stepExecution1 = getStepExecution(jobExecution, "fail"); - assertEquals(BatchStatus.FAILED, stepExecution1.getStatus()); + assertEquals(BatchStatus.ABANDONED, stepExecution1.getStatus()); assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution1.getExitStatus().getExitCode()); // @@ -60,8 +59,8 @@ public class StopIncompleteJobParserTests extends AbstractJobParserTests { stepNamesList.clear(); jobExecution = createJobExecution(); job.execute(jobExecution); + assertTrue("Wrong steps executed: "+stepNamesList, stepNamesList.contains("s2")); assertEquals(1, stepNamesList.size()); // step1 is not executed - assertTrue(stepNamesList.contains("s2")); assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus()); @@ -72,10 +71,4 @@ public class StopIncompleteJobParserTests extends AbstractJobParserTests { } - public static class TestDecider implements JobExecutionDecider { - public String decide(JobExecution jobExecution, StepExecution stepExecution) { - return "FOO"; - } - } - } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopJobParserTests.java index 40b462f3e..5703b774e 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopJobParserTests.java @@ -47,8 +47,8 @@ public class StopJobParserTests extends AbstractJobParserTests { assertEquals(1, stepNamesList.size()); assertTrue(stepNamesList.contains("s1")); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); - assertEquals(ExitStatus.FAILED.getExitCode(), jobExecution.getExitStatus().getExitCode()); + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); + assertEquals(ExitStatus.STOPPED.getExitCode(), jobExecution.getExitStatus().getExitCode()); StepExecution stepExecution1 = getStepExecution(jobExecution, "s1"); assertEquals(BatchStatus.COMPLETED, stepExecution1.getStatus()); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopRestartOnCompletedStepJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopRestartOnCompletedStepJobParserTests.java index 3ef33e897..b350f9620 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopRestartOnCompletedStepJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StopRestartOnCompletedStepJobParserTests.java @@ -61,8 +61,8 @@ public class StopRestartOnCompletedStepJobParserTests extends AbstractJobParserT assertEquals(1, stepNamesList.size()); assertTrue(stepNamesList.contains("s1")); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); - assertEquals(ExitStatus.FAILED.getExitCode(), jobExecution.getExitStatus().getExitCode()); + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); + assertEquals(ExitStatus.STOPPED.getExitCode(), jobExecution.getExitStatus().getExitCode()); StepExecution stepExecution1 = getStepExecution(jobExecution, "s1"); assertEquals(BatchStatus.COMPLETED, stepExecution1.getStatus()); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/AbstractJobTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/AbstractJobTests.java index 8cac49937..2926dd582 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/AbstractJobTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/AbstractJobTests.java @@ -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.INCOMPLETE); + execution.setStatus(BatchStatus.FAILED); repository.update(execution); JobExecution restarted = repository.createJobExecution("testHandleStepJob", new JobParameters()); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java index 9b90030a5..58a05fd27 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/SimpleJobTests.java @@ -248,10 +248,10 @@ public class SimpleJobTests { final JobInterruptedException exception = new JobInterruptedException("Interrupt!"); step1.setProcessException(exception); job.execute(jobExecution); - assertEquals(2, jobExecution.getAllFailureExceptions().size()); + assertEquals(1, jobExecution.getAllFailureExceptions().size()); assertEquals(exception, jobExecution.getStepExecutions().iterator().next().getFailureExceptions().get(0)); assertEquals(0, list.size()); - checkRepository(BatchStatus.INCOMPLETE, ExitStatus.FAILED); + checkRepository(BatchStatus.STOPPED, ExitStatus.STOPPED); } @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.INCOMPLETE, jobExecution.getStatus()); - checkRepository(BatchStatus.INCOMPLETE, ExitStatus.FAILED); + assertEquals(BatchStatus.FAILED, jobExecution.getStatus()); + checkRepository(BatchStatus.FAILED, 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.INCOMPLETE, ExitStatus.FAILED); + checkRepository(BatchStatus.FAILED, 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.INCOMPLETE, ExitStatus.FAILED); + checkRepository(BatchStatus.FAILED, ExitStatus.FAILED); } @Test @@ -352,7 +352,7 @@ public class SimpleJobTests { job.execute(jobExecution); assertEquals(0, list.size()); - checkRepository(BatchStatus.INCOMPLETE, 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.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); verify(listener); } @@ -438,7 +438,7 @@ public class SimpleJobTests { job.setSteps(Arrays.asList(new Step[] { step1, step2 })); job.execute(jobExecution); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); assertEquals(1, jobExecution.getAllFailureExceptions().size()); Throwable expected = jobExecution.getAllFailureExceptions().get(0); assertTrue("Wrong exception " + expected, expected instanceof JobInterruptedException); @@ -534,21 +534,27 @@ public class SimpleJobTests { jobRepository.update(stepExecution); jobRepository.updateExecutionContext(stepExecution); + if (exception instanceof JobInterruptedException) { + stepExecution.setExitStatus(ExitStatus.FAILED); + stepExecution.setStatus(BatchStatus.FAILED); + stepExecution.addFailureException(exception); + throw (JobInterruptedException)exception; + } if (exception instanceof RuntimeException) { stepExecution.setExitStatus(ExitStatus.FAILED); - stepExecution.setStatus(BatchStatus.INCOMPLETE); + stepExecution.setStatus(BatchStatus.FAILED); stepExecution.addFailureException(exception); return; } if (exception instanceof Error) { stepExecution.setExitStatus(ExitStatus.FAILED); - stepExecution.setStatus(BatchStatus.INCOMPLETE); + stepExecution.setStatus(BatchStatus.FAILED); stepExecution.addFailureException(exception); return; } if (exception instanceof JobInterruptedException) { stepExecution.setExitStatus(ExitStatus.FAILED); - stepExecution.setStatus(BatchStatus.STOPPING); + stepExecution.setStatus(BatchStatus.FAILED); stepExecution.addFailureException(exception); return; } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowExecutionTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowExecutionTests.java index 845125c11..5b29a9b37 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowExecutionTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowExecutionTests.java @@ -31,7 +31,7 @@ public class FlowExecutionTests { public void testBasicProperties() throws Exception { FlowExecution execution = new FlowExecution("foo", new FlowExecutionStatus("BAR")); assertEquals("foo",execution.getName()); - assertEquals("BAR",execution.getStatus().getExitStatus().getExitCode()); + assertEquals("BAR",execution.getStatus().getStatus()); } @Test @@ -45,7 +45,7 @@ public class FlowExecutionTests { @Test public void testEnumOrdering() throws Exception { FlowExecution first = new FlowExecution("foo", FlowExecutionStatus.COMPLETED); - FlowExecution second = new FlowExecution("foo", FlowExecutionStatus.INCOMPLETE); + FlowExecution second = new FlowExecution("foo", FlowExecutionStatus.FAILED); assertTrue("Should be negative",first.compareTo(second)<0); assertTrue("Should be positive",second.compareTo(first)>0); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java index 0ebb23431..adbaa3df4 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/FlowJobTests.java @@ -53,7 +53,7 @@ public class FlowJobTests { private JobExecution jobExecution; private JobRepository jobRepository; - + private boolean fail = false; @Before @@ -64,18 +64,26 @@ public class FlowJobTests { factory.afterPropertiesSet(); jobRepository = (JobRepository) factory.getObject(); job.setJobRepository(jobRepository); - jobExecution = jobRepository.createJobExecution("job", new JobParameters()); + jobExecution = jobRepository.createJobExecution("job", + new JobParameters()); } @Test public void testTwoSteps() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.FAILED.getExitCode(), "end0")); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(), "end1")); - transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.INCOMPLETE, ExitStatus.FAILED, "end0"))); - transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end1"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "step2")); + transitions.add(StateTransition + .createStateTransition(new StepState(new StubStep("step2")), + ExitStatus.FAILED.getExitCode(), "end0")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(), + "end1")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end0"))); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end1"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); @@ -89,11 +97,18 @@ public class FlowJobTests { public void testFailedStep() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - 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"))); + transitions.add(StateTransition.createStateTransition(new StateSupport( + "step1", FlowExecutionStatus.FAILED), "step2")); + transitions.add(StateTransition + .createStateTransition(new StepState(new StubStep("step2")), + ExitStatus.FAILED.getExitCode(), "end0")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(), + "end1")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end0"))); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end1"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); @@ -108,24 +123,30 @@ public class FlowJobTests { public void testFailedStepRestarted() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "step2")); State step2State = new StateSupport("step2") { @Override - public FlowExecutionStatus handle(FlowExecutor executor) throws Exception { + public FlowExecutionStatus handle(FlowExecutor executor) + throws Exception { JobExecution jobExecution = executor.getJobExecution(); - jobExecution.getStepExecutions().add(new StepExecution(getName(), jobExecution)); + jobExecution.getStepExecutions().add( + new StepExecution(getName(), jobExecution)); if (fail) { - return FlowExecutionStatus.INCOMPLETE; - } - else { + return FlowExecutionStatus.FAILED; + } else { return FlowExecutionStatus.COMPLETED; } } }; - transitions.add(StateTransition.createStateTransition(step2State, ExitStatus.COMPLETED.getExitCode(), "end0")); - transitions.add(StateTransition.createStateTransition(step2State, ExitStatus.FAILED.getExitCode(), "end1")); - transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end0"))); - transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.INCOMPLETE, ExitStatus.FAILED, "end1"))); + transitions.add(StateTransition.createStateTransition(step2State, + ExitStatus.COMPLETED.getExitCode(), "end0")); + transitions.add(StateTransition.createStateTransition(step2State, + ExitStatus.FAILED.getExitCode(), "end1")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0"))); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end1"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); @@ -134,7 +155,8 @@ public class FlowJobTests { assertEquals(ExitStatus.FAILED, jobExecution.getExitStatus()); assertEquals(2, jobExecution.getStepExecutions().size()); jobRepository.update(jobExecution); - jobExecution = jobRepository.createJobExecution("job", new JobParameters()); + jobExecution = jobRepository.createJobExecution("job", + new JobParameters()); fail = false; job.execute(jobExecution); assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus()); @@ -145,64 +167,77 @@ public class FlowJobTests { public void testStoppingStep() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - 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"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "step2")); + State state2 = new StateSupport("step2", FlowExecutionStatus.FAILED); + transitions.add(StateTransition.createStateTransition(state2, + ExitStatus.FAILED.getExitCode(), "end0")); + transitions.add(StateTransition.createStateTransition(state2, + ExitStatus.COMPLETED.getExitCode(), "end1")); + transitions.add(StateTransition.createStateTransition(new EndState( + BatchStatus.STOPPED, ExitStatus.STOPPED, "end0"), "step3")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end1"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step3")), "end2")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end2"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); - try { - job.doExecute(jobExecution); - fail("Expected JobInterruptedException"); - } - catch (JobInterruptedException e) { - // expected - } + job.doExecute(jobExecution); assertEquals(2, jobExecution.getStepExecutions().size()); + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); } @Test public void testEndStateStopped() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "end")); - 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"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "end")); + transitions.add(StateTransition.createStateTransition(new EndState( + BatchStatus.STOPPED, ExitStatus.STOPPED, "end"), "step2")); + transitions.add(StateTransition + .createStateTransition(new StepState(new StubStep("step2")), + ExitStatus.FAILED.getExitCode(), "end0")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(), + "end1")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end0"))); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end1"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); - try { - job.doExecute(jobExecution); - fail("Expected JobInterruptedException"); - } - catch (JobInterruptedException e) { - // expected - } + job.doExecute(jobExecution); assertEquals(1, jobExecution.getStepExecutions().size()); + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); } public void testEndStateFailed() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "end")); - 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"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "end")); + transitions.add(StateTransition.createStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end"), "step2")); + transitions.add(StateTransition + .createStateTransition(new StepState(new StubStep("step2")), + ExitStatus.FAILED.getExitCode(), "end0")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(), + "end1")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end0"))); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end1"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); job.doExecute(jobExecution); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.FAILED, jobExecution.getStatus()); assertEquals(1, jobExecution.getStepExecutions().size()); } @@ -210,22 +245,31 @@ public class FlowJobTests { public void testEndStateStoppedWithRestart() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "end")); - 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.INCOMPLETE, ExitStatus.FAILED, "end1"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "end")); + transitions.add(StateTransition.createStateTransition(new EndState( + BatchStatus.STOPPED, ExitStatus.STOPPED, "end"), "step2")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(), + "end0")); + transitions.add(StateTransition + .createStateTransition(new StepState(new StubStep("step2")), + ExitStatus.FAILED.getExitCode(), "end1")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0"))); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end1"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); // To test a restart we have to use the AbstractJob.execute()... job.execute(jobExecution); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); assertEquals(1, jobExecution.getStepExecutions().size()); - jobExecution = jobRepository.createJobExecution("job", new JobParameters()); + jobExecution = jobRepository.createJobExecution("job", + new JobParameters()); job.execute(jobExecution); assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); assertEquals(1, jobExecution.getStepExecutions().size()); @@ -236,16 +280,30 @@ public class FlowJobTests { public void testBranching() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "COMPLETED", "step3")); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(), "end0")); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), ExitStatus.FAILED.getExitCode(), "end1")); - transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "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"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "step2")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "COMPLETED", "step3")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step2")), ExitStatus.COMPLETED.getExitCode(), + "end0")); + transitions.add(StateTransition + .createStateTransition(new StepState(new StubStep("step2")), + ExitStatus.FAILED.getExitCode(), "end1")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0"))); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end1"))); + transitions.add(StateTransition + .createStateTransition(new StepState(new StubStep("step3")), + ExitStatus.FAILED.getExitCode(), "end2")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step3")), ExitStatus.COMPLETED.getExitCode(), + "end3")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end2"))); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end3"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); @@ -259,8 +317,10 @@ public class FlowJobTests { public void testBasicFlow() throws Throwable { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step")), "end0")); - transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end0"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step")), "end0")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.execute(jobExecution); @@ -275,24 +335,40 @@ public class FlowJobTests { SimpleFlow flow = new SimpleFlow("job"); JobExecutionDecider decider = new JobExecutionDecider() { - public String decide(JobExecution jobExecution, StepExecution stepExecution) { + public String decide(JobExecution jobExecution, + StepExecution stepExecution) { assertNotNull(stepExecution); return "SWITCH"; } }; List transitions = new ArrayList(); - 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"))); + 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, ExitStatus.COMPLETED, "end0"))); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end1"))); + transitions.add(StateTransition + .createStateTransition(new StepState(new StubStep("step3")), + ExitStatus.FAILED.getExitCode(), "end2")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step3")), ExitStatus.COMPLETED.getExitCode(), + "end3")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.FAILED, ExitStatus.FAILED, "end2"))); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end3"))); flow.setStateTransitions(transitions); job.setFlow(flow); @@ -311,14 +387,17 @@ public class FlowJobTests { public void testGetStepExists() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), "end0")); - transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end0"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "step2")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step2")), "end0")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); flow.afterPropertiesSet(); job.setFlow(flow); job.afterPropertiesSet(); - + Step step = job.getStep("step2"); assertNotNull(step); assertEquals("step2", step.getName()); @@ -328,9 +407,12 @@ public class FlowJobTests { public void testGetStepNotExists() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), "end0")); - transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end0"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "step2")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step2")), "end0")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); flow.afterPropertiesSet(); job.setFlow(flow); @@ -339,14 +421,17 @@ public class FlowJobTests { Step step = job.getStep("foo"); assertNull(step); } - + @Test public void testGetStepNotStepState() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List transitions = new ArrayList(); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); - transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), "end0")); - transitions.add(StateTransition.createEndStateTransition(new EndState(BatchStatus.COMPLETED, "end0"))); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step1")), "step2")); + transitions.add(StateTransition.createStateTransition(new StepState( + new StubStep("step2")), "end0")); + transitions.add(StateTransition.createEndStateTransition(new EndState( + BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); flow.afterPropertiesSet(); job.setFlow(flow); @@ -355,7 +440,7 @@ public class FlowJobTests { Step step = job.getStep("end0"); assertNull(step); } - + /** * @author Dave Syer * @@ -366,7 +451,8 @@ public class FlowJobTests { super(name); } - public void execute(StepExecution stepExecution) throws JobInterruptedException { + public void execute(StepExecution stepExecution) + throws JobInterruptedException { stepExecution.setStatus(BatchStatus.COMPLETED); stepExecution.setExitStatus(ExitStatus.COMPLETED); jobRepository.update(stepExecution); @@ -379,15 +465,15 @@ public class FlowJobTests { * @param stepName * @return the StepExecution corresponding to the specified step */ - private StepExecution getStepExecution(JobExecution jobExecution, String stepName) - { - for(StepExecution stepExecution : jobExecution.getStepExecutions()) { - if(stepExecution.getStepName().equals(stepName)) { + private StepExecution getStepExecution(JobExecution jobExecution, + String stepName) { + for (StepExecution stepExecution : jobExecution.getStepExecutions()) { + if (stepExecution.getStepName().equals(stepName)) { return stepExecution; } } fail("No stepExecution found with name: [" + stepName + "]"); return null; } - + } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/JobFlowExecutorSupport.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/JobFlowExecutorSupport.java index 0b6bd10f2..55789ebd5 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/JobFlowExecutorSupport.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/JobFlowExecutorSupport.java @@ -47,4 +47,7 @@ public class JobFlowExecutorSupport implements FlowExecutor { public void close(FlowExecution result) { } + public void updateStepExecutionStatus() { + } + } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/SimpleFlowTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/SimpleFlowTests.java index de2437207..91f812024 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/SimpleFlowTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/SimpleFlowTests.java @@ -163,7 +163,7 @@ public class SimpleFlowTests { flow.setStateTransitions(collect(StateTransition.createStateTransition(new StubState("step1") { @Override public FlowExecutionStatus handle(FlowExecutor executor) { - return FlowExecutionStatus.INCOMPLETE; + return FlowExecutionStatus.FAILED; } }, "step2"), StateTransition.createEndStateTransition(new StubState("step2")))); flow.afterPropertiesSet(); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/state/EndStateTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/state/EndStateTests.java index 4530deb1d..adac73bd1 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/state/EndStateTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/state/EndStateTests.java @@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; import org.springframework.batch.core.BatchStatus; +import org.springframework.batch.core.ExitStatus; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.job.flow.FlowExecutor; import org.springframework.batch.core.job.flow.support.JobFlowExecutorSupport; @@ -47,7 +48,7 @@ public class EndStateTests { BatchStatus status = jobExecution.getStatus(); - EndState state = new EndState(BatchStatus.UNKNOWN, "end"); + EndState state = new EndState(BatchStatus.UNKNOWN, ExitStatus.UNKNOWN, "end"); state.handle(new JobFlowExecutorSupport() { @Override public JobExecution getJobExecution() { @@ -68,7 +69,7 @@ public class EndStateTests { jobExecution.createStepExecution("foo"); - EndState state = new EndState(BatchStatus.UNKNOWN, "end"); + EndState state = new EndState(BatchStatus.UNKNOWN, ExitStatus.UNKNOWN, "end"); state.handle(new JobFlowExecutorSupport() { @Override public JobExecution getJobExecution() { @@ -76,7 +77,7 @@ public class EndStateTests { } }); - assertEquals(BatchStatus.STARTING, jobExecution.getStatus()); + assertEquals(BatchStatus.UNKNOWN, jobExecution.getStatus()); } @@ -87,10 +88,10 @@ public class EndStateTests { @Test public void testHandleOngoingAttemptedDowngrade() throws Exception { - jobExecution.setStatus(BatchStatus.INCOMPLETE); + jobExecution.setStatus(BatchStatus.FAILED); jobExecution.createStepExecution("foo"); - EndState state = new EndState(BatchStatus.COMPLETED, "end"); + EndState state = new EndState(BatchStatus.COMPLETED, ExitStatus.COMPLETED, "end"); state.handle(new JobFlowExecutorSupport() { @Override public JobExecution getJobExecution() { @@ -98,8 +99,8 @@ public class EndStateTests { } }); - // Can't downgrade a status - if it failed then it failed - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + // An EndState can downgrade a status - if it failed then it can be unfailed + assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/state/SimpleFlowExecutionAggregatorTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/state/SimpleFlowExecutionAggregatorTests.java index e953f5243..c70d93713 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/state/SimpleFlowExecutionAggregatorTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/job/flow/support/state/SimpleFlowExecutionAggregatorTests.java @@ -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.INCOMPLETE); + FlowExecution second = new FlowExecution("foo", FlowExecutionStatus.FAILED); assertTrue("Should be negative", first.compareTo(second)<0); assertTrue("Should be positive", second.compareTo(first)>0); - assertEquals(FlowExecutionStatus.INCOMPLETE, aggregator.aggregate(Arrays.asList(first, second))); + assertEquals(FlowExecutionStatus.FAILED, aggregator.aggregate(Arrays.asList(first, second))); } @Test diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/partition/RestartIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/partition/RestartIntegrationTests.java index 48fcbd7db..4d3a617c7 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/partition/RestartIntegrationTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/partition/RestartIntegrationTests.java @@ -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.INCOMPLETE,execution.getStatus()); + assertEquals(BatchStatus.FAILED,execution.getStatus()); assertNotNull(jobLauncher.run(job, jobParameters)); int afterMaster = jdbcTemplate.queryForInt("SELECT COUNT(*) from BATCH_STEP_EXECUTION where STEP_NAME='step1:master'"); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/partition/support/PartitionStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/partition/support/PartitionStepTests.java index 93bbb1341..7132cb573 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/partition/support/PartitionStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/partition/support/PartitionStepTests.java @@ -88,7 +88,7 @@ public class PartitionStepTests { throws Exception { Set executions = stepSplitter.split(stepExecution, 2); for (StepExecution execution : executions) { - execution.setStatus(BatchStatus.INCOMPLETE); + execution.setStatus(BatchStatus.FAILED); 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); } } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/partition/support/StepExecutionAggregatorTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/partition/support/StepExecutionAggregatorTests.java index c607b2194..c9fff9c88 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/partition/support/StepExecutionAggregatorTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/partition/support/StepExecutionAggregatorTests.java @@ -45,21 +45,21 @@ public class StepExecutionAggregatorTests { @Test public void testAggregateStatusFromFailure() { - result.setStatus(BatchStatus.INCOMPLETE); + result.setStatus(BatchStatus.FAILED); stepExecution1.setStatus(BatchStatus.COMPLETED); stepExecution2.setStatus(BatchStatus.COMPLETED); aggregator.aggregate(result, Arrays. asList(stepExecution1, stepExecution2)); assertNotNull(result); - assertEquals(BatchStatus.INCOMPLETE, result.getStatus()); + assertEquals(BatchStatus.FAILED, result.getStatus()); } @Test public void testAggregateStatusIncomplete() { stepExecution1.setStatus(BatchStatus.COMPLETED); - stepExecution2.setStatus(BatchStatus.INCOMPLETE); + stepExecution2.setStatus(BatchStatus.FAILED); aggregator.aggregate(result, Arrays. asList(stepExecution1, stepExecution2)); assertNotNull(result); - assertEquals(BatchStatus.INCOMPLETE, result.getStatus()); + assertEquals(BatchStatus.FAILED, result.getStatus()); } @Test diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractStepExecutionDaoTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractStepExecutionDaoTests.java index c74628fd0..adbf9d258 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractStepExecutionDaoTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/dao/AbstractStepExecutionDaoTests.java @@ -184,7 +184,7 @@ public abstract class AbstractStepExecutionDaoTests extends AbstractTransactiona dao.saveStepExecution(stepExecution); Integer versionAfterSave = stepExecution.getVersion(); - stepExecution.setStatus(BatchStatus.FAILED); + stepExecution.setStatus(BatchStatus.ABANDONED); 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.FAILED, retrieved.getStatus()); + assertEquals(BatchStatus.ABANDONED, retrieved.getStatus()); } /** diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryIntegrationTests.java index f8385fd16..48370485b 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryIntegrationTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/repository/support/SimpleJobRepositoryIntegrationTests.java @@ -113,10 +113,10 @@ public class SimpleJobRepositoryIntegrationTests { // first execution failed firstJobExec.setStartTime(new Date(4)); firstStepExec.setStartTime(new Date(5)); - firstStepExec.setStatus(BatchStatus.INCOMPLETE); + firstStepExec.setStatus(BatchStatus.FAILED); firstStepExec.setEndTime(new Date(6)); jobRepository.update(firstStepExec); - firstJobExec.setStatus(BatchStatus.INCOMPLETE); + firstJobExec.setStatus(BatchStatus.FAILED); 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.INCOMPLETE); + jobExecution.setStatus(BatchStatus.FAILED); jobExecution.setEndTime(new Date()); jobRepository.update(jobExecution); Thread.sleep(10); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java index 614e51f51..a4863f057 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java @@ -204,7 +204,7 @@ public class AbstractStepTests { tested.setStepExecutionListeners(new StepExecutionListener[] { listener1, listener2 }); tested.execute(execution); - assertEquals(BatchStatus.INCOMPLETE, execution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, execution.getStatus()); + assertEquals(BatchStatus.STOPPED, execution.getStatus()); Throwable expected = execution.getFailureExceptions().get(0); assertEquals("JobExecution interrupted.", expected.getMessage()); @@ -256,7 +256,7 @@ public class AbstractStepTests { assertEquals("close", events.get(i++)); assertEquals(7, events.size()); - assertEquals("INTERRUPTED", execution.getExitStatus().getExitCode()); + assertEquals("STOPPED", execution.getExitStatus().getExitCode()); assertTrue("Execution context modifications made by listener should be persisted", repository.saved .containsKey("afterStep")); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanRetryTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanRetryTests.java index c97ff2f67..0d923a734 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanRetryTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanRetryTests.java @@ -343,7 +343,7 @@ public class FaultTolerantStepFactoryBeanRetryTests { StepExecution stepExecution = new StepExecution(step.getName(), jobExecution); repository.add(stepExecution); step.execute(stepExecution); - assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); List 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); List 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); // We added a bogus cache so no items are actually skipped // because they aren't recognised as eligible diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanTests.java index 2644f075f..1be22784f 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantStepFactoryBeanTests.java @@ -112,7 +112,7 @@ public class FaultTolerantStepFactoryBeanTests { Step step = (Step) factory.getObject(); step.execute(stepExecution); - assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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()); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java index 37f4922b3..d48829df2 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/SimpleStepFactoryBeanTests.java @@ -159,7 +159,7 @@ public class SimpleStepFactoryBeanTests { job.execute(jobExecution); assertEquals("Error!", jobExecution.getAllFailureExceptions().get(0).getMessage()); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.FAILED, jobExecution.getStatus()); } @Test diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/TaskletStepExceptionTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/TaskletStepExceptionTests.java index f652e0280..a9abeb9cf 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/TaskletStepExceptionTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/TaskletStepExceptionTests.java @@ -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(INCOMPLETE, stepExecution.getStatus()); + assertEquals(FAILED, stepExecution.getStatus()); } @Test public void testInterrupted() throws Exception { taskletStep.setStepExecutionListeners(new StepExecutionListener[] { new InterruptionListener() }); taskletStep.execute(stepExecution); - assertEquals(INCOMPLETE, stepExecution.getStatus()); + assertEquals(STOPPED, stepExecution.getStatus()); } @Test @@ -94,7 +94,7 @@ public class TaskletStepExceptionTests { } }); taskletStep.execute(stepExecution); - assertEquals(INCOMPLETE, stepExecution.getStatus()); + assertEquals(FAILED, stepExecution.getStatus()); assertTrue(stepExecution.getFailureExceptions().contains(exception)); assertEquals(2, jobRepository.getUpdateCount()); } @@ -110,7 +110,7 @@ public class TaskletStepExceptionTests { } } }); taskletStep.execute(stepExecution); - assertEquals(INCOMPLETE, stepExecution.getStatus()); + assertEquals(FAILED, stepExecution.getStatus()); assertTrue(stepExecution.getFailureExceptions().contains(exception)); assertEquals(2, jobRepository.getUpdateCount()); } @@ -152,7 +152,7 @@ public class TaskletStepExceptionTests { } } }); taskletStep.execute(stepExecution); - assertEquals(INCOMPLETE, stepExecution.getStatus()); + assertEquals(FAILED, 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(INCOMPLETE, stepExecution.getStatus()); + assertEquals(FAILED, stepExecution.getStatus()); assertTrue(stepExecution.getFailureExceptions().contains(taskletException)); assertTrue(stepExecution.getFailureExceptions().contains(exception)); assertEquals(2, jobRepository.getUpdateCount()); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/StepExecutorInterruptionTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/StepExecutorInterruptionTests.java index cf69346ed..7a8e0cd98 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/StepExecutorInterruptionTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/StepExecutorInterruptionTests.java @@ -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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.STOPPED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.STOPPED, stepExecution.getStatus()); } @@ -201,7 +201,7 @@ public class StepExecutorInterruptionTests extends TestCase { step.execute(stepExecution); assertEquals("Planned!", stepExecution.getFailureExceptions().get(0).getMessage()); - assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); } /** diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TaskletStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TaskletStepTests.java index 98edb8118..145a3e7b5 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TaskletStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/tasklet/TaskletStepTests.java @@ -541,7 +541,7 @@ public class TaskletStepTests { stepExecution.setExecutionContext(foobarEc); step.execute(stepExecution); - assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.STOPPED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); Throwable expected = stepExecution.getFailureExceptions().get(0); assertEquals("CRASH!", expected.getMessage()); assertFalse(stepExecution.getExecutionContext().isEmpty()); diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailSecondJobParserTests-context.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailSecondJobParserTests-context.xml index 4172431d2..19f4c846e 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailSecondJobParserTests-context.xml +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/SplitDifferentResultsFailSecondJobParserTests-context.xml @@ -9,21 +9,24 @@ + + + - - - - + + + + \ No newline at end of file diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopAndRestartJobParserTests-context.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopAndRestartJobParserTests-context.xml new file mode 100644 index 000000000..d8a363770 --- /dev/null +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopAndRestartJobParserTests-context.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopIncompleteJobParserTests-context.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopIncompleteJobParserTests-context.xml index 3f16423c8..d5c610d7d 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopIncompleteJobParserTests-context.xml +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopIncompleteJobParserTests-context.xml @@ -6,8 +6,6 @@ - - diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopRestartOnCompletedStepJobParserTests-context.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopRestartOnCompletedStepJobParserTests-context.xml index db0449e6c..6082ff81c 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopRestartOnCompletedStepJobParserTests-context.xml +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StopRestartOnCompletedStepJobParserTests-context.xml @@ -8,12 +8,14 @@ + - + + diff --git a/spring-batch-integration/src/main/java/org/springframework/batch/integration/chunk/ChunkMessageChannelItemWriter.java b/spring-batch-integration/src/main/java/org/springframework/batch/integration/chunk/ChunkMessageChannelItemWriter.java index 51589953d..fafdd6736 100644 --- a/spring-batch-integration/src/main/java/org/springframework/batch/integration/chunk/ChunkMessageChannelItemWriter.java +++ b/spring-batch-integration/src/main/java/org/springframework/batch/integration/chunk/ChunkMessageChannelItemWriter.java @@ -99,11 +99,11 @@ public class ChunkMessageChannelItemWriter extends StepExecutionListenerSuppo } catch (RuntimeException e) { logger.debug("Detected failure waiting for results in step listener.", e); - stepExecution.setStatus(BatchStatus.INCOMPLETE); + stepExecution.setStatus(BatchStatus.FAILED); return ExitStatus.FAILED.addExitDescription(e.getClass().getName() + ": " + e.getMessage()); } if (timedOut) { - stepExecution.setStatus(BatchStatus.INCOMPLETE); + stepExecution.setStatus(BatchStatus.FAILED); throw new ItemStreamException("Timed out waiting for back log at end of step"); } return ExitStatus.COMPLETED.addExitDescription("Waited for " + expecting + " results."); diff --git a/spring-batch-integration/src/main/java/org/springframework/batch/integration/job/JobExecutionRequest.java b/spring-batch-integration/src/main/java/org/springframework/batch/integration/job/JobExecutionRequest.java index b10aae252..b9ba90360 100644 --- a/spring-batch-integration/src/main/java/org/springframework/batch/integration/job/JobExecutionRequest.java +++ b/spring-batch-integration/src/main/java/org/springframework/batch/integration/job/JobExecutionRequest.java @@ -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).
* - * If the incoming status is {@link BatchStatus#INCOMPLETE}, - * {@link BatchStatus#FAILED} or {@link BatchStatus#STOPPING} the request + * If the incoming status is {@link BatchStatus#FAILED}, + * {@link BatchStatus#ABANDONED} or {@link BatchStatus#STOPPING} the request * should be ignored by handlers (passed on without modification). * * @author Dave Syer diff --git a/spring-batch-integration/src/main/java/org/springframework/batch/integration/job/StepExecutionMessageHandler.java b/spring-batch-integration/src/main/java/org/springframework/batch/integration/job/StepExecutionMessageHandler.java index 48e7508eb..cccdc5fa1 100644 --- a/spring-batch-integration/src/main/java/org/springframework/batch/integration/job/StepExecutionMessageHandler.java +++ b/spring-batch-integration/src/main/java/org/springframework/batch/integration/job/StepExecutionMessageHandler.java @@ -136,7 +136,7 @@ public class StepExecutionMessageHandler { * @return */ private boolean isComplete(JobExecutionRequest request) { - return request.getStatus() == BatchStatus.INCOMPLETE || request.getStatus() == BatchStatus.FAILED + return request.getStatus() == BatchStatus.FAILED || request.getStatus() == BatchStatus.ABANDONED || request.getStatus() == BatchStatus.STOPPING; } @@ -146,7 +146,7 @@ public class StepExecutionMessageHandler { */ private void handleFailure(JobExecutionRequest request, Throwable e) { request.registerThrowable(e); - request.setStatus(BatchStatus.INCOMPLETE); + request.setStatus(BatchStatus.FAILED); } /* diff --git a/spring-batch-integration/src/test/java/org/springframework/batch/integration/chunk/ChunkMessageItemWriterIntegrationTests.java b/spring-batch-integration/src/test/java/org/springframework/batch/integration/chunk/ChunkMessageItemWriterIntegrationTests.java index 2cbcefdc3..ed4080671 100644 --- a/spring-batch-integration/src/test/java/org/springframework/batch/integration/chunk/ChunkMessageItemWriterIntegrationTests.java +++ b/spring-batch-integration/src/test/java/org/springframework/batch/integration/chunk/ChunkMessageItemWriterIntegrationTests.java @@ -170,7 +170,7 @@ public class ChunkMessageItemWriterIntegrationTests { // And make the back log real requests.send(getSimpleMessage("foo", 4321L)); step.execute(stepExecution); - assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution.getExitStatus().getExitCode()); String exitDescription = stepExecution.getExitStatus().getExitDescription(); diff --git a/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/MessageOrientedStepTests.java b/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/MessageOrientedStepTests.java index 8f811072d..16940458b 100644 --- a/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/MessageOrientedStepTests.java +++ b/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/MessageOrientedStepTests.java @@ -105,7 +105,7 @@ public class MessageOrientedStepTests { step.setPollingInterval(100); StepExecution stepExecution = jobExecution.createStepExecution(step.getName()); step.execute(stepExecution); - assertEquals(BatchStatus.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, 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.INCOMPLETE, stepExecution.getStatus()); + assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); assertEquals(ExitStatus.FAILED.getExitCode(), stepExecution.getExitStatus().getExitCode()); String message = stepExecution.getExitStatus().getExitDescription(); assertTrue("Wrong message: " + message, message.contains("Planned failure")); diff --git a/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/StepExecutionMessageHandlerTests.java b/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/StepExecutionMessageHandlerTests.java index a77e97fc6..c097fd5b1 100644 --- a/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/StepExecutionMessageHandlerTests.java +++ b/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/StepExecutionMessageHandlerTests.java @@ -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.INCOMPLETE); + jobExecution.setStatus(BatchStatus.FAILED); 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.INCOMPLETE); + stepExecution.setStatus(BatchStatus.FAILED); 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.INCOMPLETE, payload.getStatus()); + assertEquals(BatchStatus.FAILED, payload.getStatus()); assertTrue(payload.hasErrors()); Throwable error = payload.getLastThrowable(); assertTrue(error instanceof StartLimitExceededException); diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/support/DummyItemWriter.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/support/DummyItemWriter.java index 620c356aa..0dfa29bbd 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/support/DummyItemWriter.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/support/DummyItemWriter.java @@ -27,6 +27,7 @@ public class DummyItemWriter implements ItemWriter { public void write(List item) throws Exception { // NO-OP + Thread.sleep(500); } } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/DatabaseShutdownFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/DatabaseShutdownFunctionalTests.java index 7a4407102..0fd2e438c 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/DatabaseShutdownFunctionalTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/DatabaseShutdownFunctionalTests.java @@ -69,7 +69,7 @@ public class DatabaseShutdownFunctionalTests extends AbstractBatchLauncherTests } assertFalse("Timed out waiting for job to end.", jobExecution.isRunning()); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/GracefulShutdownFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/GracefulShutdownFunctionalTests.java index db4c60d55..cfcc32889 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/GracefulShutdownFunctionalTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/GracefulShutdownFunctionalTests.java @@ -64,7 +64,7 @@ public class GracefulShutdownFunctionalTests extends AbstractBatchLauncherTests } assertFalse("Timed out waiting for job to end.", jobExecution.isRunning()); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/JobOperatorFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/JobOperatorFunctionalTests.java index 2618599f2..22892e99c 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/JobOperatorFunctionalTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/JobOperatorFunctionalTests.java @@ -30,7 +30,7 @@ public class JobOperatorFunctionalTests { private static final Log logger = LogFactory.getLog(JobOperatorFunctionalTests.class); @Autowired - private JobOperator tested; + private JobOperator operator; @Autowired private Job job; @@ -49,19 +49,19 @@ public class JobOperatorFunctionalTests { String params = new JobParametersBuilder().addLong("jobOperatorTestParam", 7L).toJobParameters().toString(); - long executionId = tested.start(job.getName(), params); - assertEquals(params, tested.getParameters(executionId)); + long executionId = operator.start(job.getName(), params); + assertEquals(params, operator.getParameters(executionId)); stopAndCheckStatus(executionId); - long resumedExecutionId = tested.restart(executionId); - assertEquals(params, tested.getParameters(resumedExecutionId)); + long resumedExecutionId = operator.restart(executionId); + assertEquals(params, operator.getParameters(resumedExecutionId)); stopAndCheckStatus(resumedExecutionId); - List instances = tested.getJobInstances(job.getName(), 0, 1); + List instances = operator.getJobInstances(job.getName(), 0, 1); assertEquals(1, instances.size()); long instanceId = instances.get(0); - List executions = tested.getExecutions(instanceId); + List executions = operator.getExecutions(instanceId); assertEquals(2, executions.size()); // latest execution is the first in the returned list assertEquals(resumedExecutionId, executions.get(0).longValue()); @@ -77,47 +77,49 @@ public class JobOperatorFunctionalTests { // wait to the job to get up and running Thread.sleep(1000); - assertTrue(tested.getRunningExecutions(job.getName()).contains(executionId)); - assertTrue(tested.getSummary(executionId).contains(BatchStatus.STARTED.toString())); + Set runningExecutions = operator.getRunningExecutions(job.getName()); + assertTrue("Wrong executions: "+runningExecutions+" expected: "+executionId, runningExecutions.contains(executionId)); + assertTrue("Wrong summary: "+operator.getSummary(executionId), operator.getSummary(executionId).contains(BatchStatus.STARTED.toString())); - tested.stop(executionId); + operator.stop(executionId); int count = 0; - while (tested.getRunningExecutions(job.getName()).contains(executionId) && count <= 10) { + while (operator.getRunningExecutions(job.getName()).contains(executionId) && count <= 10) { logger.info("Checking for running JobExecution: count=" + count); Thread.sleep(100); count++; } - assertFalse(tested.getRunningExecutions(job.getName()).contains(executionId)); - assertTrue(tested.getSummary(executionId).contains(BatchStatus.INCOMPLETE.toString())); + runningExecutions = operator.getRunningExecutions(job.getName()); + assertFalse("Wrong executions: "+runningExecutions+" expected: "+executionId, runningExecutions.contains(executionId)); + assertTrue("Wrong summary: "+operator.getSummary(executionId), operator.getSummary(executionId).contains(BatchStatus.STOPPED.toString())); // there is just a single step in the test job - Map summaries = tested.getStepExecutionSummaries(executionId); - assertEquals(1, summaries.size()); - assertTrue(summaries.values().toString().contains(BatchStatus.INCOMPLETE.toString())); + Map summaries = operator.getStepExecutionSummaries(executionId); + System.err.println(summaries); + assertTrue(summaries.values().toString().contains(BatchStatus.STOPPED.toString())); } @Test public void testMultipleSimultaneousInstances() throws Exception { String jobName = job.getName(); - Set names = tested.getJobNames(); + Set names = operator.getJobNames(); assertEquals(1, names.size()); assertTrue(names.contains(jobName)); - long exec1 = tested.startNextInstance(jobName); - long exec2 = tested.startNextInstance(jobName); + long exec1 = operator.startNextInstance(jobName); + long exec2 = operator.startNextInstance(jobName); assertTrue(exec1 != exec2); - assertTrue(tested.getParameters(exec1) != tested.getParameters(exec2)); + assertTrue(operator.getParameters(exec1) != operator.getParameters(exec2)); - Set executions = tested.getRunningExecutions(jobName); + Set executions = operator.getRunningExecutions(jobName); assertTrue(executions.contains(exec1)); assertTrue(executions.contains(exec2)); - tested.stop(exec1); - tested.stop(exec2); + operator.stop(exec1); + operator.stop(exec2); } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/RestartFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/RestartFunctionalTests.java index 08bf242fc..faa228716 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/RestartFunctionalTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/RestartFunctionalTests.java @@ -70,7 +70,7 @@ public class RestartFunctionalTests extends AbstractBatchLauncherTests { int before = simpleJdbcTemplate.queryForInt("SELECT COUNT(*) FROM TRADE"); JobExecution jobExecution = runJobForRestartTest(); - assertEquals(BatchStatus.INCOMPLETE, jobExecution.getStatus()); + assertEquals(BatchStatus.FAILED, jobExecution.getStatus()); Throwable expected = jobExecution.getAllFailureExceptions().get(0); assertTrue("Not planned exception: " + expected.getMessage(), expected.getMessage().toLowerCase().indexOf( diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/support/JdbcJobRepositoryTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/support/JdbcJobRepositoryTests.java index 49d7ca5d3..38b6913ce 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/support/JdbcJobRepositoryTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/support/JdbcJobRepositoryTests.java @@ -166,7 +166,7 @@ public class JdbcJobRepositoryTests { cacheJobIds(execution); execution.setEndTime(new Timestamp(System.currentTimeMillis())); repository.update(execution); - execution.setStatus(BatchStatus.INCOMPLETE); + execution.setStatus(BatchStatus.FAILED); int before = simpleJdbcTemplate.queryForInt("SELECT COUNT(*) FROM BATCH_JOB_INSTANCE"); assertEquals(1, before);