IN PROGRESS - issue BATCH-894: RFC: move ExitStatus up into Core?

Change Tasklet to use RepeatStatus instead of ExitStatus to signal continuable status
This commit is contained in:
dsyer
2008-11-08 11:33:25 +00:00
parent 11faa837af
commit 16606e3abd
34 changed files with 173 additions and 134 deletions

View File

@@ -37,11 +37,6 @@ public class ExitStatus implements Serializable {
*/
public static final ExitStatus UNKNOWN = new ExitStatus(false, "UNKNOWN");
/**
* Convenient constant value representing unfinished processing.
*/
public static final ExitStatus CONTINUABLE = new ExitStatus(true, "CONTINUABLE");
/**
* Convenient constant value representing continuable state where processing
* is still taking place, so no further action is required. Used for

View File

@@ -38,6 +38,8 @@ public class StepContribution {
private volatile int processSkipCount;
private ExitStatus exitStatus = ExitStatus.EXECUTING;
/**
* @param execution
*/
@@ -45,6 +47,24 @@ public class StepContribution {
this.parentSkipCount = execution.getSkipCount();
}
/**
* Set the {@link ExitStatus} for this contribution.
*
* @param status
*/
public void setExitStatus(ExitStatus status) {
this.exitStatus = status;
}
/**
* Public getter for the status.
*
* @return the {@link ExitStatus} for this contribution
*/
public ExitStatus getExitStatus() {
return exitStatus;
}
/**
* Increment the counter for the number of items processed.
*/
@@ -167,7 +187,7 @@ public class StepContribution {
public String toString() {
return "[StepContribution: read=" + readCount + ", written=" + writeCount + ", filtered=" + filterCount
+ ", readSkips=" + readSkipCount + ", writeSkips=" + writeSkipCount + ", processSkips="
+ processSkipCount + "]";
+ processSkipCount + ", exitStatus=" + exitStatus.getExitCode() + "]";
}
}

View File

@@ -66,7 +66,7 @@ public class StepExecution extends Entity {
private volatile ExecutionContext executionContext = new ExecutionContext();
private volatile ExitStatus exitStatus = ExitStatus.CONTINUABLE;
private volatile ExitStatus exitStatus = ExitStatus.EXECUTING;
private volatile boolean terminateOnly;
@@ -327,6 +327,7 @@ public class StepExecution extends Entity {
filterCount += contribution.getFilterCount();
readCount += contribution.getReadCount();
writeCount += contribution.getWriteCount();
exitStatus = exitStatus.and(contribution.getExitStatus());
}
/**

View File

@@ -18,7 +18,6 @@ package org.springframework.batch.core.scope;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.repeat.RepeatCallback;
@@ -65,9 +64,7 @@ public abstract class StepContextRepeatCallback implements RepeatCallback {
// otherwise step-scoped beans will be re-initialised for each chunk.
StepSynchronizationManager.register(stepContext);
try {
ExitStatus exitStatus = doInStepContext(context, stepContext);
stepContext.getStepExecution().setExitStatus(exitStatus);
return RepeatStatus.continueIf(exitStatus.isContinuable());
return doInStepContext(context, stepContext);
}
finally {
// Still some stuff to do with the data in this chunk,
@@ -91,10 +88,10 @@ public abstract class StepContextRepeatCallback implements RepeatCallback {
*
* @param context the current {@link RepeatContext}
* @param stepContext the step context in which to carry out the work
* @return the exit status from the execution
* @return the repeat status from the execution
* @throws Exception implementations can throw an exception if anything goes
* wrong
*/
public abstract ExitStatus doInStepContext(RepeatContext context, StepContext stepContext) throws Exception;
public abstract RepeatStatus doInStepContext(RepeatContext context, StepContext stepContext) throws Exception;
}

View File

@@ -74,18 +74,19 @@ public class FaultTolerantChunkOrientedTasklet<I, O> extends AbstractFaultTolera
* @see org.springframework.batch.core.step.tasklet.Tasklet#execute(org.springframework.batch.core.StepContribution,
* AttributeAccessor)
*/
public ExitStatus execute(final StepContribution contribution, AttributeAccessor attributes) throws Exception {
public RepeatStatus execute(final StepContribution contribution, AttributeAccessor attributes) throws Exception {
final List<I> inputs = getBufferedList(attributes, INPUT_BUFFER_KEY);
final List<O> outputs = new ArrayList<O>();
ExitStatus result = ExitStatus.CONTINUABLE;
final List<Exception> skippedReads = getBufferedList(attributes, SKIPPED_READS_KEY);
// TODO: invert logic below so that default can be FINISHED?
RepeatStatus continuable = RepeatStatus.CONTINUABLE;
if (inputs.isEmpty() && outputs.isEmpty()) {
RepeatStatus continuable = getRepeatOperations().iterate(new RepeatCallback() {
continuable = getRepeatOperations().iterate(new RepeatCallback() {
public RepeatStatus doInIteration(final RepeatContext context) throws Exception {
I item = read(contribution, skippedReads);
@@ -98,7 +99,8 @@ public class FaultTolerantChunkOrientedTasklet<I, O> extends AbstractFaultTolera
}
});
result = continuable.isContinuable() ? ExitStatus.CONTINUABLE : ExitStatus.FINISHED;
ExitStatus status = continuable.isContinuable() ? ExitStatus.EXECUTING : ExitStatus.FINISHED;
contribution.setExitStatus(status);
}
@@ -121,7 +123,7 @@ public class FaultTolerantChunkOrientedTasklet<I, O> extends AbstractFaultTolera
attributes.removeAttribute(key);
}
return result;
return continuable;
}

View File

@@ -52,8 +52,7 @@ public class NonbufferingFaultTolerantChunkOrientedTasklet<I, O> extends
* Read-process-write a list of items. Uses fault-tolerant read, process and
* write implementations.
*/
public ExitStatus execute(final StepContribution contribution, AttributeAccessor attributes) throws Exception {
ExitStatus result = ExitStatus.CONTINUABLE;
public RepeatStatus execute(final StepContribution contribution, AttributeAccessor attributes) throws Exception {
final List<I> inputs = new ArrayList<I>();
final List<Exception> skippedReads = getBufferedList(attributes, SKIPPED_READS_KEY);
@@ -70,7 +69,8 @@ public class NonbufferingFaultTolerantChunkOrientedTasklet<I, O> extends
}
});
result = continuable.isContinuable() ? ExitStatus.CONTINUABLE : ExitStatus.FINISHED;
ExitStatus result = continuable.isContinuable() ? ExitStatus.EXECUTING : ExitStatus.FINISHED;
contribution.setExitStatus(result);
// filter inputs marked for skipping
final Map<I, Exception> skippedInputs = getBufferedSkips(attributes, SKIPPED_INPUTS_KEY);
@@ -95,7 +95,7 @@ public class NonbufferingFaultTolerantChunkOrientedTasklet<I, O> extends
callSkipListenersAndCleanSkipsFromBuffer(skippedReads, skippedInputs, skippedOutputs, inputsIncludingSkips,
outputsIncludingSkips);
return result;
return continuable;
}
/**

View File

@@ -37,8 +37,8 @@ public class SimpleChunkOrientedTasklet<I, O> extends AbstractItemOrientedTaskle
/**
* Read-process-write a list of items.
*/
public ExitStatus execute(final StepContribution contribution, AttributeAccessor attributes) throws Exception {
ExitStatus result = ExitStatus.CONTINUABLE;
public RepeatStatus execute(final StepContribution contribution, AttributeAccessor attributes) throws Exception {
ExitStatus result = ExitStatus.EXECUTING;
final List<I> inputs = new ArrayList<I>();
RepeatStatus continuable = repeatOperations.iterate(new RepeatCallback() {
@@ -55,11 +55,12 @@ public class SimpleChunkOrientedTasklet<I, O> extends AbstractItemOrientedTaskle
}
});
result = continuable.isContinuable() ? ExitStatus.CONTINUABLE : ExitStatus.FINISHED;
result = continuable.isContinuable() ? ExitStatus.EXECUTING : ExitStatus.FINISHED;
contribution.setExitStatus(result);
// If there is no input we don't have to do anything more
if (inputs.isEmpty()) {
return result;
return continuable;
}
List<O> outputs = new ArrayList<O>();
@@ -74,7 +75,7 @@ public class SimpleChunkOrientedTasklet<I, O> extends AbstractItemOrientedTaskle
doWrite(outputs);
contribution.incrementWriteCount(outputs.size());
return result;
return continuable;
}
}

View File

@@ -19,6 +19,7 @@ import java.util.concurrent.Callable;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.AttributeAccessor;
import org.springframework.util.Assert;
@@ -32,13 +33,13 @@ import org.springframework.util.Assert;
*/
public class CallableTaskletAdapter implements Tasklet, InitializingBean {
private Callable<ExitStatus> callable;
private Callable<RepeatStatus> callable;
/**
* Public setter for the {@link Callable}.
* @param callable the {@link Callable} to set
*/
public void setCallable(Callable<ExitStatus> callable) {
public void setCallable(Callable<RepeatStatus> callable) {
this.callable = callable;
}
@@ -56,7 +57,7 @@ public class CallableTaskletAdapter implements Tasklet, InitializingBean {
* the {@link StepContribution} and the attributes.
* @see Tasklet#execute(StepContribution, AttributeAccessor)
*/
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return callable.call();
}

View File

@@ -18,6 +18,7 @@ package org.springframework.batch.core.step.tasklet;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.item.adapter.AbstractMethodInvokingDelegator;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.core.AttributeAccessor;
/**
@@ -41,8 +42,9 @@ public class MethodInvokingTaskletAdapter extends AbstractMethodInvokingDelegato
*
* @see Tasklet#execute(StepContribution, AttributeAccessor)
*/
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return mapResult(invokeDelegateMethod());
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
contribution.setExitStatus(mapResult(invokeDelegateMethod()));
return RepeatStatus.FINISHED;
}
/**

View File

@@ -12,6 +12,7 @@ import org.springframework.batch.core.JobInterruptedException;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.listener.StepExecutionListenerSupport;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.AttributeAccessor;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
@@ -65,7 +66,7 @@ public class SystemCommandTasklet extends StepExecutionListenerSupport implement
* Execute system command and map its exit code to {@link ExitStatus} using
* {@link SystemProcessExitCodeMapper}.
*/
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
FutureTask<Integer> systemCommandTask = new FutureTask<Integer>(new Callable<Integer>() {
@@ -85,7 +86,8 @@ public class SystemCommandTasklet extends StepExecutionListenerSupport implement
while (true) {
Thread.sleep(checkInterval);
if (systemCommandTask.isDone()) {
return systemProcessExitCodeMapper.getExitStatus(systemCommandTask.get());
contribution.setExitStatus(systemProcessExitCodeMapper.getExitStatus(systemCommandTask.get()));
return RepeatStatus.FINISHED;
}
else if (stopWatch.getTime() > timeout) {
systemCommandTask.cancel(interruptOnCancel);

View File

@@ -15,8 +15,8 @@
*/
package org.springframework.batch.core.step.tasklet;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.core.AttributeAccessor;
/**
@@ -30,16 +30,16 @@ public interface Tasklet {
/**
* Given the current context in the form of a step contribution, do whatever
* is necessary to process this unit inside a transaction. Implementations
* return {@link ExitStatus#FINISHED} if finished. If not they return
* {@link ExitStatus#CONTINUABLE}. On failure throws an exception.
* return {@link RepeatStatus#FINISHED} if finished. If not they return
* {@link RepeatStatus#CONTINUABLE}. On failure throws an exception.
*
* @param contribution mutable state to be passed back to update the current
* step execution
* @param attributes attributes shared between invocations but not between
* restarts
* @return an {@link ExitStatus} indicating whether processing is
* @return an {@link RepeatStatus} indicating whether processing is
* continuable.
*/
ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception;
RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception;
}

View File

@@ -18,7 +18,6 @@ package org.springframework.batch.core.step.tasklet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobInterruptedException;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.StepExecution;
@@ -38,6 +37,7 @@ import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.CompositeItemStream;
import org.springframework.batch.repeat.RepeatContext;
import org.springframework.batch.repeat.RepeatOperations;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.batch.repeat.support.RepeatTemplate;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
@@ -243,7 +243,7 @@ public class TaskletStep extends AbstractStep {
stepOperations.iterate(new StepContextRepeatCallback(stepExecution) {
@Override
public ExitStatus doInStepContext(RepeatContext repeatContext,
public RepeatStatus doInStepContext(RepeatContext repeatContext,
StepContext stepContext) throws Exception {
StepExecution stepExecution = stepContext.getStepExecution();
@@ -257,7 +257,7 @@ public class TaskletStep extends AbstractStep {
// interruption.
interruptionPolicy.checkInterrupted(stepExecution);
ExitStatus exitStatus = ExitStatus.CONTINUABLE;
RepeatStatus result = RepeatStatus.CONTINUABLE;
TransactionStatus transaction = transactionManager
.getTransaction(transactionAttribute);
@@ -267,7 +267,7 @@ public class TaskletStep extends AbstractStep {
try {
try {
exitStatus = tasklet.execute(contribution, stepContext);
result = tasklet.execute(contribution, stepContext);
} finally {
// Apply the contribution to the step
// even if unsuccessful
@@ -351,7 +351,7 @@ public class TaskletStep extends AbstractStep {
// caller
interruptionPolicy.checkInterrupted(stepExecution);
return exitStatus;
return result;
}
});

View File

@@ -48,9 +48,9 @@ public class ExitStatusTests {
*/
@Test
public void testExitStatusConstantsContinuable() {
ExitStatus status = ExitStatus.CONTINUABLE;
ExitStatus status = ExitStatus.EXECUTING;
assertTrue(status.isContinuable());
assertEquals("CONTINUABLE", status.getExitCode());
assertEquals("EXECUTING", status.getExitCode());
}
/**
@@ -72,7 +72,7 @@ public class ExitStatusTests {
*/
@Test
public void testEqualsWithSameProperties() throws Exception {
assertEquals(ExitStatus.CONTINUABLE, new ExitStatus(true, "CONTINUABLE"));
assertEquals(ExitStatus.EXECUTING, new ExitStatus(true, "EXECUTING"));
}
@Test
@@ -93,7 +93,7 @@ public class ExitStatusTests {
*/
@Test
public void testEqualsWithNull() throws Exception {
assertFalse(ExitStatus.CONTINUABLE.equals(null));
assertFalse(ExitStatus.EXECUTING.equals(null));
}
/**
@@ -103,7 +103,7 @@ public class ExitStatusTests {
*/
@Test
public void testHashcode() throws Exception {
assertEquals(ExitStatus.CONTINUABLE.toString().hashCode(), ExitStatus.CONTINUABLE.hashCode());
assertEquals(ExitStatus.EXECUTING.toString().hashCode(), ExitStatus.EXECUTING.hashCode());
}
/**
@@ -112,8 +112,8 @@ public class ExitStatusTests {
*/
@Test
public void testAndBoolean() {
assertTrue(ExitStatus.CONTINUABLE.and(true).isContinuable());
assertFalse(ExitStatus.CONTINUABLE.and(false).isContinuable());
assertTrue(ExitStatus.EXECUTING.and(true).isContinuable());
assertFalse(ExitStatus.EXECUTING.and(false).isContinuable());
ExitStatus status = new ExitStatus(false, "CUSTOM_CODE", "CUSTOM_DESCRIPTION");
assertTrue(status.and(true).getExitCode() == "CUSTOM_CODE");
assertTrue(status.and(true).getExitDescription() == "CUSTOM_DESCRIPTION");
@@ -126,10 +126,10 @@ public class ExitStatusTests {
*/
@Test
public void testAndExitStatusStillContinuable() {
assertTrue(ExitStatus.CONTINUABLE.and(ExitStatus.CONTINUABLE).isContinuable());
assertFalse(ExitStatus.CONTINUABLE.and(ExitStatus.FINISHED).isContinuable());
assertTrue(ExitStatus.CONTINUABLE.and(ExitStatus.CONTINUABLE).getExitCode().equals(
ExitStatus.CONTINUABLE.getExitCode()));
assertTrue(ExitStatus.EXECUTING.and(ExitStatus.EXECUTING).isContinuable());
assertFalse(ExitStatus.EXECUTING.and(ExitStatus.FINISHED).isContinuable());
assertTrue(ExitStatus.EXECUTING.and(ExitStatus.EXECUTING).getExitCode().equals(
ExitStatus.EXECUTING.getExitCode()));
}
/**
@@ -139,7 +139,7 @@ public class ExitStatusTests {
*/
@Test
public void testAndExitStatusWhenFinishedAddedToContinuable() {
assertEquals(ExitStatus.FINISHED.getExitCode(), ExitStatus.CONTINUABLE.and(ExitStatus.FINISHED).getExitCode());
assertEquals(ExitStatus.FINISHED.getExitCode(), ExitStatus.EXECUTING.and(ExitStatus.FINISHED).getExitCode());
}
/**
@@ -149,7 +149,7 @@ public class ExitStatusTests {
*/
@Test
public void testAndExitStatusWhenContinuableAddedToFinished() {
assertEquals(ExitStatus.FINISHED.getExitCode(), ExitStatus.FINISHED.and(ExitStatus.CONTINUABLE).getExitCode());
assertEquals(ExitStatus.FINISHED.getExitCode(), ExitStatus.FINISHED.and(ExitStatus.EXECUTING).getExitCode());
}
/**
@@ -159,7 +159,7 @@ public class ExitStatusTests {
*/
@Test
public void testAndExitStatusWhenCustomContinuableAddedToContinuable() {
assertEquals("CUSTOM", ExitStatus.CONTINUABLE.and(ExitStatus.CONTINUABLE.replaceExitCode("CUSTOM"))
assertEquals("CUSTOM", ExitStatus.EXECUTING.and(ExitStatus.EXECUTING.replaceExitCode("CUSTOM"))
.getExitCode());
}
@@ -182,52 +182,52 @@ public class ExitStatusTests {
@Test
public void testAndExitStatusWhenCustomContinuableAddedToFinished() {
assertEquals(ExitStatus.FINISHED.getExitCode(), ExitStatus.FINISHED.and(
ExitStatus.CONTINUABLE.replaceExitCode("CUSTOM")).getExitCode());
ExitStatus.EXECUTING.replaceExitCode("CUSTOM")).getExitCode());
}
@Test
public void testAddExitCode() throws Exception {
ExitStatus status = ExitStatus.CONTINUABLE.replaceExitCode("FOO");
assertTrue(ExitStatus.CONTINUABLE != status);
ExitStatus status = ExitStatus.EXECUTING.replaceExitCode("FOO");
assertTrue(ExitStatus.EXECUTING != status);
assertTrue(status.isContinuable());
assertEquals("FOO", status.getExitCode());
}
@Test
public void testAddExitCodeToExistingStatus() throws Exception {
ExitStatus status = ExitStatus.CONTINUABLE.replaceExitCode("FOO").replaceExitCode("BAR");
assertTrue(ExitStatus.CONTINUABLE != status);
ExitStatus status = ExitStatus.EXECUTING.replaceExitCode("FOO").replaceExitCode("BAR");
assertTrue(ExitStatus.EXECUTING != status);
assertTrue(status.isContinuable());
assertEquals("BAR", status.getExitCode());
}
@Test
public void testAddExitCodeToSameStatus() throws Exception {
ExitStatus status = ExitStatus.CONTINUABLE.replaceExitCode(ExitStatus.CONTINUABLE.getExitCode());
assertTrue(ExitStatus.CONTINUABLE != status);
ExitStatus status = ExitStatus.EXECUTING.replaceExitCode(ExitStatus.EXECUTING.getExitCode());
assertTrue(ExitStatus.EXECUTING != status);
assertTrue(status.isContinuable());
assertEquals(ExitStatus.CONTINUABLE.getExitCode(), status.getExitCode());
assertEquals(ExitStatus.EXECUTING.getExitCode(), status.getExitCode());
}
@Test
public void testAddExitDescription() throws Exception {
ExitStatus status = ExitStatus.CONTINUABLE.addExitDescription("Foo");
assertTrue(ExitStatus.CONTINUABLE != status);
ExitStatus status = ExitStatus.EXECUTING.addExitDescription("Foo");
assertTrue(ExitStatus.EXECUTING != status);
assertTrue(status.isContinuable());
assertEquals("Foo", status.getExitDescription());
}
@Test
public void testAddExitDescriptionToSameStatus() throws Exception {
ExitStatus status = ExitStatus.CONTINUABLE.addExitDescription("Foo").addExitDescription("Foo");
assertTrue(ExitStatus.CONTINUABLE != status);
ExitStatus status = ExitStatus.EXECUTING.addExitDescription("Foo").addExitDescription("Foo");
assertTrue(ExitStatus.EXECUTING != status);
assertTrue(status.isContinuable());
assertEquals("Foo", status.getExitDescription());
}
@Test
public void testAddEmptyExitDescription() throws Exception {
ExitStatus status = ExitStatus.CONTINUABLE.addExitDescription("Foo").addExitDescription(null);
ExitStatus status = ExitStatus.EXECUTING.addExitDescription("Foo").addExitDescription(null);
assertEquals("Foo", status.getExitDescription());
}
@@ -245,7 +245,7 @@ public class ExitStatusTests {
@Test
public void testSerializable() throws Exception {
ExitStatus status = ExitStatus.CONTINUABLE.replaceExitCode("FOO");
ExitStatus status = ExitStatus.EXECUTING.replaceExitCode("FOO");
byte[] bytes = SerializationUtils.serialize(status);
Object object = SerializationUtils.deserialize(bytes);
assertTrue(object instanceof ExitStatus);

View File

@@ -104,7 +104,7 @@ public class StepExecutionTests {
*/
@Test
public void testGetExitCode() {
assertEquals(ExitStatus.CONTINUABLE, execution.getExitStatus());
assertEquals(ExitStatus.EXECUTING, execution.getExitStatus());
execution.setExitStatus(ExitStatus.FINISHED);
assertEquals(ExitStatus.FINISHED, execution.getExitStatus());
}

View File

@@ -3,14 +3,16 @@ package org.springframework.batch.core.configuration.xml;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.core.AttributeAccessor;
public class TestTasklet extends AbstractTestComponent implements Tasklet {
public ExitStatus execute(StepContribution contribution,
public RepeatStatus execute(StepContribution contribution,
AttributeAccessor attributes) throws Exception {
executed = true;
return ExitStatus.FINISHED;
contribution.setExitStatus(ExitStatus.FINISHED);
return RepeatStatus.FINISHED;
}
}

View File

@@ -47,7 +47,7 @@ public class CompositeStepExecutionListenerTests extends TestCase {
}, new StepExecutionListenerSupport() {
public ExitStatus afterStep(StepExecution stepExecution) {
list.add("continue");
return ExitStatus.CONTINUABLE;
return ExitStatus.EXECUTING;
}
} });
assertFalse(listener.afterStep(null).isContinuable());

View File

@@ -54,11 +54,11 @@ public class StepExecutionAggregatorTests {
@Test
public void testAggregateExitStatusSunnyDay() {
stepExecution1.setExitStatus(ExitStatus.CONTINUABLE);
stepExecution1.setExitStatus(ExitStatus.EXECUTING);
stepExecution2.setExitStatus(ExitStatus.FAILED);
aggregator.aggregate(result, Arrays.<StepExecution> asList(stepExecution1, stepExecution2));
assertNotNull(result);
assertEquals(ExitStatus.FAILED.and(ExitStatus.CONTINUABLE), result.getExitStatus());
assertEquals(ExitStatus.FAILED.and(ExitStatus.EXECUTING), result.getExitStatus());
}
@Test

View File

@@ -40,20 +40,20 @@ public class StepContextRepeatCallbackTests {
public void testDoInIteration() throws Exception {
StepContextRepeatCallback callback = new StepContextRepeatCallback(stepExecution) {
@Override
public ExitStatus doInStepContext(RepeatContext context, StepContext stepContext) throws Exception {
public RepeatStatus doInStepContext(RepeatContext context, StepContext stepContext) throws Exception {
assertEquals(Long.valueOf(123), stepContext.getStepExecution().getId());
return ExitStatus.NOOP;
return RepeatStatus.FINISHED;
}
};
assertEquals(RepeatStatus.FINISHED, callback.doInIteration(null));
assertEquals(ExitStatus.NOOP, stepExecution.getExitStatus());
assertEquals(ExitStatus.EXECUTING, stepExecution.getExitStatus());
}
@Test
public void testUnfinishedWork() throws Exception {
StepContextRepeatCallback callback = new StepContextRepeatCallback(stepExecution) {
@Override
public ExitStatus doInStepContext(RepeatContext context, StepContext stepContext) throws Exception {
public RepeatStatus doInStepContext(RepeatContext context, StepContext stepContext) throws Exception {
if (addedAttribute) {
removedAttribute = stepContext.hasAttribute("foo");
stepContext.removeAttribute("foo");
@@ -61,7 +61,7 @@ public class StepContextRepeatCallbackTests {
addedAttribute = true;
stepContext.setAttribute("foo", "bar");
}
return ExitStatus.NOOP;
return RepeatStatus.FINISHED;
}
};
callback.doInIteration(null);

View File

@@ -27,6 +27,7 @@ import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemStream;
import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.ItemStreamSupport;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
import org.springframework.core.AttributeAccessor;
import org.springframework.transaction.TransactionException;
@@ -121,8 +122,8 @@ public class TaskletStepExceptionTests {
} });
taskletStep.setTasklet(new Tasklet() {
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return ExitStatus.FINISHED;
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return RepeatStatus.FINISHED;
}
});
@@ -183,8 +184,8 @@ public class TaskletStepExceptionTests {
taskletStep.setTasklet(new Tasklet() {
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return ExitStatus.FINISHED;
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return RepeatStatus.FINISHED;
}
});
@@ -219,8 +220,7 @@ public class TaskletStepExceptionTests {
private static class ExceptionTasklet implements Tasklet {
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
throw taskletException;
}
}

View File

@@ -21,8 +21,7 @@ import static org.junit.Assert.fail;
import java.util.concurrent.Callable;
import org.junit.Test;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.step.tasklet.CallableTaskletAdapter;
import org.springframework.batch.repeat.RepeatStatus;
public class CallableTaskletAdapterTests {
@@ -30,12 +29,12 @@ public class CallableTaskletAdapterTests {
@Test
public void testHandle() throws Exception {
adapter.setCallable(new Callable<ExitStatus>() {
public ExitStatus call() throws Exception {
return ExitStatus.FINISHED;
adapter.setCallable(new Callable<RepeatStatus>() {
public RepeatStatus call() throws Exception {
return RepeatStatus.FINISHED;
}
});
assertEquals(ExitStatus.FINISHED, adapter.execute(null,null));
assertEquals(RepeatStatus.FINISHED, adapter.execute(null,null));
}
@Test

View File

@@ -27,7 +27,7 @@ public class ConfigurableSystemProcessExitCodeMapperTests {
{
put(0, ExitStatus.FINISHED);
put(1, ExitStatus.FAILED);
put(2, ExitStatus.CONTINUABLE);
put(2, ExitStatus.EXECUTING);
put(3, ExitStatus.NOOP);
put(4, ExitStatus.UNKNOWN);
put(ConfigurableSystemProcessExitCodeMapper.ELSE_KEY, ExitStatus.UNKNOWN);

View File

@@ -20,6 +20,11 @@ import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter;
/**
@@ -31,6 +36,9 @@ public class StepHandlerAdapterTests {
private MethodInvokingTaskletAdapter tasklet = new MethodInvokingTaskletAdapter();
private Object result = null;
private StepExecution stepExecution = new StepExecution("systemCommandStep", new JobExecution(new JobInstance(1L,
new JobParameters(), "systemCommandJob")));
public ExitStatus execute() {
return ExitStatus.NOOP;
}
@@ -47,20 +55,26 @@ public class StepHandlerAdapterTests {
@Test
public void testExecuteWithExitStatus() throws Exception {
tasklet.setTargetMethod("execute");
assertEquals(ExitStatus.NOOP, tasklet.execute(null,null));
StepContribution contribution = stepExecution.createStepContribution();
tasklet.execute(contribution,null);
assertEquals(ExitStatus.NOOP, contribution.getExitStatus());
}
@Test
public void testMapResultWithNull() throws Exception {
tasklet.setTargetMethod("process");
assertEquals(ExitStatus.FINISHED, tasklet.execute(null,null));
StepContribution contribution = stepExecution.createStepContribution();
tasklet.execute(contribution,null);
assertEquals(ExitStatus.FINISHED, contribution.getExitStatus());
}
@Test
public void testMapResultWithNonNull() throws Exception {
tasklet.setTargetMethod("process");
this.result = "foo";
assertEquals(ExitStatus.FINISHED, tasklet.execute(null,null));
StepContribution contribution = stepExecution.createStepContribution();
tasklet.execute(contribution,null);
assertEquals(ExitStatus.FINISHED, contribution.getExitStatus());
}
}

View File

@@ -15,10 +15,9 @@ import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobInterruptedException;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.step.tasklet.SystemCommandException;
import org.springframework.batch.core.step.tasklet.SystemCommandTasklet;
import org.springframework.batch.core.step.tasklet.SystemProcessExitCodeMapper;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.util.Assert;
@@ -59,9 +58,9 @@ public class SystemCommandTaskletIntegrationTests {
tasklet.afterPropertiesSet();
log.info("Executing command: " + command);
ExitStatus exitStatus = tasklet.execute(null, null);
RepeatStatus exitStatus = tasklet.execute(stepExecution.createStepContribution(), null);
assertEquals(ExitStatus.FINISHED, exitStatus);
assertEquals(RepeatStatus.FINISHED, exitStatus);
}
/*
@@ -75,8 +74,10 @@ public class SystemCommandTaskletIntegrationTests {
log.info("Executing command: " + command);
try {
ExitStatus exitStatus = tasklet.execute(null, null);
assertEquals(ExitStatus.FAILED, exitStatus);
StepContribution contribution = stepExecution.createStepContribution();
RepeatStatus exitStatus = tasklet.execute(contribution, null);
assertEquals(RepeatStatus.FINISHED, exitStatus);
assertEquals(ExitStatus.FAILED, contribution.getExitStatus());
}
catch (RuntimeException e) {
// on some platforms the system call does not return

View File

@@ -55,6 +55,7 @@ import org.springframework.batch.item.ItemStreamException;
import org.springframework.batch.item.ItemStreamSupport;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.batch.repeat.policy.DefaultResultCompletionPolicy;
import org.springframework.batch.repeat.policy.SimpleCompletionPolicy;
import org.springframework.batch.repeat.support.RepeatTemplate;
@@ -779,12 +780,10 @@ public class TaskletStepTests {
StepExecution stepExecution = new StepExecution(step.getName(), new JobExecution(jobInstance));
final ExecutionContext ec = stepExecution.getExecutionContext();
step.setTasklet(new Tasklet(){
public ExitStatus execute(StepContribution contribution,
public RepeatStatus execute(StepContribution contribution,
AttributeAccessor attributes) throws Exception {
ec.putString("test", "test");
return ExitStatus.FINISHED;
return RepeatStatus.FINISHED;
}
});

View File

@@ -2,7 +2,7 @@ package org.springframework.batch.repeat;
public enum RepeatStatus {
UNKNOWN(true), CONTINUABLE(true), FINISHED(false);
CONTINUABLE(true), FINISHED(false);
private final boolean continuable;

View File

@@ -86,7 +86,7 @@ public class ChunkMessageChannelItemWriter<T> extends StepExecutionListenerSuppo
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
if (!(stepExecution.getStatus() == BatchStatus.COMPLETED)) {
return ExitStatus.CONTINUABLE;
return ExitStatus.EXECUTING;
}
long expecting = localState.getExpecting();
boolean timedOut;

View File

@@ -50,7 +50,7 @@ public class ChunkProcessorChunkHandler<S> implements ChunkHandler<S>, Initializ
}
logger.debug("Completed chunk handling with " + skipCount + " skips");
return new ChunkResponse(ExitStatus.CONTINUABLE, chunkRequest.getJobId(), skipCount);
return new ChunkResponse(ExitStatus.EXECUTING, chunkRequest.getJobId(), skipCount);
}
}

View File

@@ -27,7 +27,7 @@ public class ChunkProcessorChunkHandlerTests {
12L, 10));
assertEquals(0, response.getSkipCount());
assertEquals(new Long(12L), response.getJobId());
assertEquals(ExitStatus.CONTINUABLE, response.getExitStatus());
assertEquals(ExitStatus.EXECUTING, response.getExitStatus());
assertEquals(2, count);
}

View File

@@ -18,6 +18,7 @@ package org.springframework.batch.integration.job;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.core.AttributeAccessor;
/**
@@ -30,8 +31,9 @@ public class TestTasklet implements Tasklet {
* (non-Javadoc)
*
*/
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return ExitStatus.FINISHED;
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
contribution.setExitStatus(ExitStatus.FINISHED);
return RepeatStatus.FINISHED;
}
}

View File

@@ -4,9 +4,9 @@ import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.core.AttributeAccessor;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
@@ -15,9 +15,9 @@ public class ErrorLogWriter implements Tasklet {
protected final Log logger = LogFactory.getLog(getClass());
private SimpleJdbcTemplate simpleJdbcTemplate;
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
this.simpleJdbcTemplate.update("insert into ERROR_LOG values ('Some records were skipped!')");
return ExitStatus.FINISHED;
return RepeatStatus.FINISHED;
}
public void setDataSource(DataSource dataSource) {

View File

@@ -2,12 +2,12 @@ package org.springframework.batch.sample.tasklet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.listener.StepExecutionListenerSupport;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.core.AttributeAccessor;
/**
@@ -25,8 +25,8 @@ public class DummyMessageReceivingTasklet extends StepExecutionListenerSupport i
logger.info("Got message from context: " + receivedMessage);
}
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return ExitStatus.FINISHED;
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return RepeatStatus.FINISHED;
}
public String getReceivedMessage() {

View File

@@ -8,6 +8,7 @@ import org.springframework.batch.core.StepExecution;
import org.springframework.batch.core.listener.StepExecutionListenerSupport;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.core.AttributeAccessor;
/**
@@ -28,8 +29,8 @@ public class DummyMessageSendingTasklet extends StepExecutionListenerSupport imp
return null;
}
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return ExitStatus.FINISHED;
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
return RepeatStatus.FINISHED;
}
public String getMessage() {

View File

@@ -1,9 +1,9 @@
package org.springframework.batch.sample.tasklet;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.UnexpectedJobExecutionException;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.core.AttributeAccessor;
import org.springframework.core.io.Resource;
@@ -19,14 +19,14 @@ public class FileDeletingTasklet implements Tasklet, InitializingBean {
private Resource[] resources;
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
for (Resource resource : resources) {
boolean deleted = resource.getFile().delete();
if (!deleted) {
throw new UnexpectedJobExecutionException("Could not delete file " + resource);
}
}
return ExitStatus.FINISHED;
return RepeatStatus.FINISHED;
}
public void setResources(Resource[] resources) {

View File

@@ -1,8 +1,8 @@
package org.springframework.batch.test.sample;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.AttributeAccessor;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
@@ -11,16 +11,16 @@ public class SampleTasklet implements Tasklet {
@Autowired
private SimpleJdbcTemplate jdbcTemplate;
private int id = 0;
public SampleTasklet(int id) {
this.id = id;
}
public ExitStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
public RepeatStatus execute(StepContribution contribution, AttributeAccessor attributes) throws Exception {
System.err.println("SampleTasklet1.execute()");
this.jdbcTemplate.update("insert into TESTS(ID, NAME) values (?, 'SampleTasklet" + id + "')", id);
return ExitStatus.FINISHED;
return RepeatStatus.FINISHED;
}
}