From 95aee9998b2029fe95fca3761d30f35b42a9d3b6 Mon Sep 17 00:00:00 2001 From: robokaso Date: Wed, 17 Sep 2008 08:54:03 +0000 Subject: [PATCH] OPEN - BATCH-803: Add non-buffering ChunkOrientedTasklet (or option in existing one) plus flag for factory bean added SimpleChunkOrientedTasklet *not* designed for inheritance, so that we can deal with fault-tolerance concerns separately and in one place --- .../step/item/SimpleChunkOrientedTasklet.java | 79 +++++++++++++++++++ .../core/step/item/SimpleStepFactoryBean.java | 2 +- 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleChunkOrientedTasklet.java diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleChunkOrientedTasklet.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleChunkOrientedTasklet.java new file mode 100644 index 000000000..82cde28fe --- /dev/null +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleChunkOrientedTasklet.java @@ -0,0 +1,79 @@ +package org.springframework.batch.core.step.item; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.batch.core.StepContribution; +import org.springframework.batch.core.step.tasklet.Tasklet; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.repeat.ExitStatus; +import org.springframework.batch.repeat.RepeatCallback; +import org.springframework.batch.repeat.RepeatContext; +import org.springframework.batch.repeat.RepeatOperations; +import org.springframework.core.AttributeAccessor; + +/** + * Simplest possible implementation of {@link Tasklet} with no skipping or + * recovering. Just delegates all calls to the provided {@link ItemReader} and + * {@link ItemWriter}. + * + * @author Dave Syer + * @author Robert Kasanicky + */ +public class SimpleChunkOrientedTasklet extends AbstractItemProcessingTasklet { + + private RepeatOperations repeatOperations; + + public SimpleChunkOrientedTasklet(ItemReader itemReader, + ItemProcessor itemProcessor, ItemWriter itemWriter, + RepeatOperations repeatOperations) { + super(itemReader, itemProcessor, itemWriter); + this.repeatOperations = repeatOperations; + } + + /** + * Read-process-write a list of items. + */ + public ExitStatus execute(final StepContribution contribution, AttributeAccessor attributes) throws Exception { + ExitStatus result = ExitStatus.CONTINUABLE; + final List inputs = new ArrayList(); + + result = repeatOperations.iterate(new RepeatCallback() { + + public ExitStatus doInIteration(final RepeatContext context) throws Exception { + I item = doRead(); + + if (item == null) { + return ExitStatus.FINISHED; + } + inputs.add(item); + contribution.incrementReadCount(); + return ExitStatus.CONTINUABLE; + } + }); + + // If there is no input we don't have to do anything more + if (inputs.isEmpty()) { + return result; + } + + List outputs = new ArrayList(); + for (I item : inputs) { + O output = doProcess(item); + if (output != null) { + outputs.add(output); + } + } + contribution.incrementFilterCount(inputs.size() - outputs.size()); + + // TODO: use ItemWriter interface properly + // TODO: make sure exceptions get handled by the appropriate handler + doWrite(outputs); + contribution.incrementWriteCount(outputs.size()); + + return result; + } + +} diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleStepFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleStepFactoryBean.java index 5889a73e6..b07fde5b7 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleStepFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleStepFactoryBean.java @@ -457,7 +457,7 @@ public class SimpleStepFactoryBean implements FactoryBean, BeanNameAware { step.setStepOperations(stepOperations); - ChunkOrientedTasklet tasklet = new ChunkOrientedTasklet(itemReader, itemProcessor, itemWriter, chunkOperations); + SimpleChunkOrientedTasklet tasklet = new SimpleChunkOrientedTasklet(itemReader, itemProcessor, itemWriter, chunkOperations); tasklet.setListeners(getListeners()); step.setTasklet(tasklet);