diff --git a/spring-batch-execution/src/main/java/org/springframework/batch/execution/step/support/SimpleStepFactoryBean.java b/spring-batch-execution/src/main/java/org/springframework/batch/execution/step/support/SimpleStepFactoryBean.java index c15b39aac..be3952347 100644 --- a/spring-batch-execution/src/main/java/org/springframework/batch/execution/step/support/SimpleStepFactoryBean.java +++ b/spring-batch-execution/src/main/java/org/springframework/batch/execution/step/support/SimpleStepFactoryBean.java @@ -15,76 +15,18 @@ */ package org.springframework.batch.execution.step.support; -import org.springframework.batch.core.domain.ItemSkipPolicy; -import org.springframework.batch.core.domain.Step; -import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.execution.step.ItemOrientedStep; -import org.springframework.batch.item.ItemKeyGenerator; -import org.springframework.batch.item.ItemReader; -import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.repeat.RepeatOperations; -import org.springframework.batch.repeat.exception.handler.ExceptionHandler; import org.springframework.batch.repeat.policy.SimpleCompletionPolicy; import org.springframework.batch.repeat.support.RepeatTemplate; -import org.springframework.batch.retry.RetryPolicy; -import org.springframework.batch.retry.callback.ItemReaderRetryCallback; -import org.springframework.batch.retry.policy.ItemReaderRetryPolicy; -import org.springframework.batch.retry.support.RetryTemplate; -import org.springframework.beans.factory.BeanNameAware; -import org.springframework.beans.factory.config.AbstractFactoryBean; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.util.Assert; /** * @author Dave Syer - * + * */ -public class SimpleStepFactoryBean extends AbstractFactoryBean implements BeanNameAware { - - private String name; +public class SimpleStepFactoryBean extends AbstractStepFactoryBean { private int commitInterval = 0; - private int startLimit = Integer.MAX_VALUE; - - private boolean allowStartIfComplete; - - private ItemReader itemReader; - - private ItemWriter itemWriter; - - private Object[] listeners = new Object[0]; - - private PlatformTransactionManager transactionManager; - - private JobRepository jobRepository; - - private ItemSkipPolicy itemSkipPolicy = new NeverSkipItemSkipPolicy(); - - private RepeatOperations stepOperations = new RepeatTemplate(); - - private RetryPolicy retryPolicy = null; - - private ExceptionHandler exceptionHandler; - - private ItemKeyGenerator itemKeyGenerator; - - private ItemKeyGenerator defaultKeyGenerator = new ItemKeyGenerator() { - public Object getKey(Object item) { - return item; - } - }; - - /** - * Set the bean name property, which will become the name of the - * {@link Step} when it is created. - * - * @see org.springframework.beans.factory.BeanNameAware#setBeanName(java.lang.String) - */ - public void setBeanName(String name) { - this.name = name; - } - /** * Set the commit interval. * @@ -94,183 +36,19 @@ public class SimpleStepFactoryBean extends AbstractFactoryBean implements BeanNa this.commitInterval = commitInterval; } - /** - * Public setter for the startLimit. - * - * @param startLimit the startLimit to set - */ - public void setStartLimit(int startLimit) { - this.startLimit = startLimit; - } - - /** - * Public setter for the shouldAllowStartIfComplete. - * - * @param allowStartIfComplete the shouldAllowStartIfComplete to set - */ - public void setAllowStartIfComplete(boolean allowStartIfComplete) { - this.allowStartIfComplete = allowStartIfComplete; - } - - /** - * @param itemReader the itemReader to set - */ - public void setItemReader(ItemReader itemReader) { - this.itemReader = itemReader; - } - - /** - * @param itemWriter the itemWriter to set - */ - public void setItemWriter(ItemWriter itemWriter) { - this.itemWriter = itemWriter; - } - - /** - * @param listeners - */ - public void setListeners(Object[] listeners) { - this.listeners = listeners; - } - - /** - * @param itemSkipPolicy - */ - public void setItemSkipPolicy(ItemSkipPolicy itemSkipPolicy) { - this.itemSkipPolicy = itemSkipPolicy; - } - - /** - * Public setter for {@link JobRepository}. - * - * @param jobRepository is a mandatory dependence (no default). - */ - public void setJobRepository(JobRepository jobRepository) { - this.jobRepository = jobRepository; - } - - /** - * Public setter for the {@link PlatformTransactionManager}. - * - * @param transactionManager the transaction manager to set - */ - public void setTransactionManager(PlatformTransactionManager transactionManager) { - this.transactionManager = transactionManager; - } - - /** - * Public setter for the RepeatOperations. - * @param stepOperations the stepOperations to set - */ - public void setStepOperations(RepeatOperations stepOperations) { - this.stepOperations = stepOperations; - } - - /** - * Public setter for the {@link RetryPolicy}. - * @param retryPolicy the {@link RetryPolicy} to set - */ - public void setRetryPolicy(RetryPolicy retryPolicy) { - this.retryPolicy = retryPolicy; - } - - /** - * Set the {@link ExceptionHandler} for the step operations (outer loop). - * @param exceptionHandler - */ - public void setExceptionHandler(ExceptionHandler exceptionHandler) { - this.exceptionHandler = exceptionHandler; - } - - /** - * Public setter for the {@link ItemKeyGenerator}. If it is not injected - * but the reader or writer implement {@link ItemKeyGenerator}, one of - * those will be used instead (preferring the reader to the writer if both - * would be appropriate). - * - * @param itemKeyGenerator the {@link ItemKeyGenerator} to set - */ - public void setItemKeyGenerator(ItemKeyGenerator itemKeyGenerator) { - this.itemKeyGenerator = itemKeyGenerator; - } - - /* - * (non-Javadoc) - * @see org.springframework.beans.factory.config.AbstractFactoryBean#createInstance() - */ - protected Object createInstance() throws Exception { - ItemOrientedStep step = new ItemOrientedStep(name); - applyConfiguration(step); - return step; - } - - /* - * (non-Javadoc) - * @see org.springframework.beans.factory.config.AbstractFactoryBean#getObjectType() - */ - public Class getObjectType() { - return Step.class; - } - /** * @param step * */ - private void applyConfiguration(ItemOrientedStep step) { - - Assert.notNull(itemReader, "ItemReader must be provided"); - Assert.notNull(itemWriter, "ItemWriter must be provided"); - Assert.notNull(jobRepository, "JobRepository must be provided"); - Assert.notNull(transactionManager, "TransactionManager must be provided"); - - step.setItemReader(itemReader); - step.setItemWriter(itemWriter); - step.setTransactionManager(transactionManager); - step.setJobRepository(jobRepository); - step.setStartLimit(startLimit); - step.setListeners(listeners); - step.setItemSkipPolicy(itemSkipPolicy); - step.setAllowStartIfComplete(allowStartIfComplete); - - itemKeyGenerator = getKeyGenerator(); - - if (retryPolicy != null) { - ItemReaderRetryCallback retryCallback = new ItemReaderRetryCallback(itemReader, itemKeyGenerator, - itemWriter); - ItemReaderRetryPolicy itemProviderRetryPolicy = new ItemReaderRetryPolicy(retryPolicy); - RetryTemplate template = new RetryTemplate(); - template.setRetryPolicy(itemProviderRetryPolicy); - step.setRetryOperations(template); - step.setRetryCallback(retryCallback); - } - + protected void applyConfiguration(ItemOrientedStep step) { + + super.applyConfiguration(step); + if (commitInterval > 0) { RepeatTemplate chunkOperations = new RepeatTemplate(); chunkOperations.setCompletionPolicy(new SimpleCompletionPolicy(commitInterval)); step.setChunkOperations(chunkOperations); } - if (exceptionHandler != null && stepOperations instanceof RepeatTemplate) { - ((RepeatTemplate) stepOperations).setExceptionHandler(exceptionHandler); - step.setStepOperations(stepOperations); - } } - - /** - * @return - */ - private ItemKeyGenerator getKeyGenerator() { - if (itemKeyGenerator != null) { - return itemKeyGenerator; - } - if (itemReader instanceof ItemKeyGenerator) { - return (ItemKeyGenerator) itemReader; - } - if (itemWriter instanceof ItemKeyGenerator) { - return (ItemKeyGenerator) itemWriter; - } - return defaultKeyGenerator; - - } - }