diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/AbstractStepFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/AbstractStepFactoryBean.java index f9dd02b07..7667f6926 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/AbstractStepFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/AbstractStepFactoryBean.java @@ -17,6 +17,7 @@ package org.springframework.batch.core.step.item; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepExecutionListener; +import org.springframework.batch.core.StepListener; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemStream; @@ -30,13 +31,17 @@ import org.springframework.util.Assert; /** * Base class for factory beans for {@link ItemOrientedStep}. Ensures that all * the mandatory properties are set, and provides basic support for the - * {@link Step} interface responsibilities like start limit. + * {@link Step} interface responsibilities like start limit. Supports + * registration of {@link ItemStream}s and {@link StepListener}s. + * + * @see SimpleStepFactoryBean + * @see RepeatOperationsStepFactoryBean * * @author Dave Syer * */ public abstract class AbstractStepFactoryBean implements FactoryBean, BeanNameAware { - + private String name; private int startLimit = Integer.MAX_VALUE; @@ -54,9 +59,11 @@ public abstract class AbstractStepFactoryBean implements FactoryBean, BeanNameAw private boolean singleton = true; private Validator jobRepositoryValidator = new TransactionInterceptorValidator(1); - + private ItemStream[] streams = new ItemStream[0]; + private StepListener[] listeners = new StepListener[0]; + /** * */ @@ -113,7 +120,7 @@ public abstract class AbstractStepFactoryBean implements FactoryBean, BeanNameAw public void setItemWriter(ItemWriter itemWriter) { this.itemWriter = itemWriter; } - + /** * The streams to inject into the {@link Step}. Any instance of * {@link ItemStream} can be used, and will then receive callbacks at the @@ -125,6 +132,25 @@ public abstract class AbstractStepFactoryBean implements FactoryBean, BeanNameAw this.streams = streams; } + /** + * The listeners to inject into the {@link Step}. Any instance of + * {@link StepListener} can be used, and will then receive callbacks at the + * appropriate stage in the step. + * + * @param listeners an array of listeners + */ + public void setListeners(StepListener[] listeners) { + this.listeners = listeners; + } + + /** + * Protected getter for the {@link StepListener}s. + * @return the listeners + */ + protected StepListener[] getListeners() { + return listeners; + } + /** * Protected getter for the {@link ItemReader} for subclasses to use. * @return the itemReader @@ -186,9 +212,9 @@ public abstract class AbstractStepFactoryBean implements FactoryBean, BeanNameAw step.setJobRepository(jobRepository); step.setStartLimit(startLimit); step.setAllowStartIfComplete(allowStartIfComplete); - + step.setStreams(streams); - + ItemReader itemReader = getItemReader(); ItemWriter itemWriter = getItemWriter(); @@ -208,6 +234,17 @@ public abstract class AbstractStepFactoryBean implements FactoryBean, BeanNameAw step.registerStepExecutionListener((StepExecutionListener) itemWriter); } + StepExecutionListener[] stepListeners = BatchListenerFactoryHelper.getStepListeners(listeners); + itemReader = BatchListenerFactoryHelper.getItemReader(itemReader, listeners); + itemWriter = BatchListenerFactoryHelper.getItemWriter(itemWriter, listeners); + + // In case they are used by subclasses: + setItemReader(itemReader); + setItemWriter(itemWriter); + + step.setStepExecutionListeners(stepListeners); + step.setItemHandler(new SimpleItemHandler(itemReader, itemWriter)); + } public Class getObjectType() { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/RepeatOperationsStepFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/RepeatOperationsStepFactoryBean.java index 660076ab0..5533f0526 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/RepeatOperationsStepFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/RepeatOperationsStepFactoryBean.java @@ -16,10 +16,6 @@ package org.springframework.batch.core.step.item; import org.springframework.batch.core.Step; -import org.springframework.batch.core.StepExecutionListener; -import org.springframework.batch.core.StepListener; -import org.springframework.batch.item.ItemReader; -import org.springframework.batch.item.ItemWriter; import org.springframework.batch.repeat.RepeatOperations; import org.springframework.batch.repeat.support.RepeatTemplate; @@ -33,24 +29,10 @@ import org.springframework.batch.repeat.support.RepeatTemplate; */ public class RepeatOperationsStepFactoryBean extends AbstractStepFactoryBean { - private StepListener[] listeners = new StepListener[0]; - private RepeatOperations chunkOperations = new RepeatTemplate(); private RepeatOperations stepOperations = new RepeatTemplate(); - - /** - * The listeners to inject into the {@link Step}. Any instance of - * {@link StepListener} can be used, and will then receive callbacks at the - * appropriate stage in the step. - * - * @param listeners an array of listeners - */ - public void setListeners(StepListener[] listeners) { - this.listeners = listeners; - } - /** * The {@link RepeatOperations} to use for the outer loop of the batch * processing. Should be set up by the caller through a factory. Defaults to @@ -81,21 +63,8 @@ public class RepeatOperationsStepFactoryBean extends AbstractStepFactoryBean { super.applyConfiguration(step); - ItemReader itemReader = getItemReader(); - ItemWriter itemWriter = getItemWriter(); - - StepExecutionListener[] stepListeners = BatchListenerFactoryHelper.getStepListeners(listeners); - itemReader = BatchListenerFactoryHelper.getItemReader(itemReader, listeners); - itemWriter = BatchListenerFactoryHelper.getItemWriter(itemWriter, listeners); - RepeatOperations chunkOperations = BatchListenerFactoryHelper.addChunkListeners(this.chunkOperations, listeners); - - // In case they are used by subclasses: - setItemReader(itemReader); - setItemWriter(itemWriter); - - step.setStepExecutionListeners(stepListeners); - step.setItemHandler(new SimpleItemHandler(itemReader, itemWriter)); - + RepeatOperations chunkOperations = BatchListenerFactoryHelper.addChunkListeners(this.chunkOperations, getListeners()); + step.setChunkOperations(chunkOperations); step.setStepOperations(stepOperations); 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 6ae5d611a..0a89448a8 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 @@ -18,10 +18,6 @@ package org.springframework.batch.core.step.item; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.batch.core.Step; -import org.springframework.batch.core.StepExecutionListener; -import org.springframework.batch.core.StepListener; -import org.springframework.batch.item.ItemReader; -import org.springframework.batch.item.ItemWriter; import org.springframework.batch.repeat.CompletionPolicy; import org.springframework.batch.repeat.exception.DefaultExceptionHandler; import org.springframework.batch.repeat.exception.ExceptionHandler; @@ -51,8 +47,6 @@ public class SimpleStepFactoryBean extends AbstractStepFactoryBean { private int commitInterval = 0; - private StepListener[] listeners = new StepListener[0]; - private TaskExecutor taskExecutor; private ItemHandler itemHandler; @@ -87,25 +81,6 @@ public class SimpleStepFactoryBean extends AbstractStepFactoryBean { this.chunkCompletionPolicy = chunkCompletionPolicy; } - /** - * The listeners to inject into the {@link Step}. Any instance of - * {@link StepListener} can be used, and will then receive callbacks at the - * appropriate stage in the step. - * - * @param listeners an array of listeners - */ - public void setListeners(StepListener[] listeners) { - this.listeners = listeners; - } - - /** - * Protected getter for the {@link StepListener}s. - * @return the listeners - */ - protected StepListener[] getListeners() { - return listeners; - } - /** * Protected getter for the step operations to make them available in * subclasses. @@ -174,24 +149,11 @@ public class SimpleStepFactoryBean extends AbstractStepFactoryBean { super.applyConfiguration(step); - ItemReader itemReader = getItemReader(); - ItemWriter itemWriter = getItemWriter(); - chunkOperations = new RepeatTemplate(); chunkOperations.setCompletionPolicy(getChunkCompletionPolicy()); - BatchListenerFactoryHelper.addChunkListeners(chunkOperations, listeners); + BatchListenerFactoryHelper.addChunkListeners(chunkOperations, getListeners()); step.setChunkOperations(chunkOperations); - StepExecutionListener[] stepListeners = BatchListenerFactoryHelper.getStepListeners(listeners); - itemReader = BatchListenerFactoryHelper.getItemReader(itemReader, listeners); - itemWriter = BatchListenerFactoryHelper.getItemWriter(itemWriter, listeners); - - // In case they are used by subclasses: - setItemReader(itemReader); - setItemWriter(itemWriter); - - step.setStepExecutionListeners(stepListeners); - stepOperations = new RepeatTemplate(); if (taskExecutor != null) { @@ -204,11 +166,6 @@ public class SimpleStepFactoryBean extends AbstractStepFactoryBean { step.setStepOperations(stepOperations); - ItemHandler itemHandler = new SimpleItemHandler(itemReader, itemWriter); - - setItemHandler(itemHandler); - step.setItemHandler(itemHandler); - } /**