From d24f0af4395a1d1f82b1d178d3a310e185651f51 Mon Sep 17 00:00:00 2001 From: lucasward Date: Tue, 26 Feb 2008 08:29:59 +0000 Subject: [PATCH] BATCH-365: There should now be one ExecutionContext per step. All itemStreams will be opened with an execution context, and will be notified before it is saved, to ensure they have all state in the context. Most ItemReader/Writers should now have the logic for whether or not to put their state in the context, but a few have likely been missed. --- .../dao/FlatFileCustomerCreditWriter.java | 7 ++++--- .../item/reader/GeneratingItemReader.java | 12 ++++-------- .../sample/item/reader/StagingItemReader.java | 14 ++------------ .../sample/tasklet/InfiniteLoopTasklet.java | 10 +--------- .../sample/tasklet/SimpleTradeWriter.java | 19 +++++++++++++------ .../FixedLengthImportJobFunctionalTests.java | 3 ++- .../FlatFileCustomerCreditWriterTests.java | 9 +++++---- .../item/reader/StagingItemReaderTests.java | 3 ++- 8 files changed, 33 insertions(+), 44 deletions(-) diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/dao/FlatFileCustomerCreditWriter.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/dao/FlatFileCustomerCreditWriter.java index 888c1ef65..c21150951 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/dao/FlatFileCustomerCreditWriter.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/dao/FlatFileCustomerCreditWriter.java @@ -16,6 +16,7 @@ package org.springframework.batch.sample.dao; +import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.ItemStream; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.sample.domain.CustomerCredit; @@ -39,7 +40,7 @@ public class FlatFileCustomerCreditWriter implements CustomerCreditDao, public void writeCredit(CustomerCredit customerCredit) throws Exception { if (!opened) { - open(); + open(new ExecutionContext()); } String line = "" + customerCredit.getName() + separator @@ -56,9 +57,9 @@ public class FlatFileCustomerCreditWriter implements CustomerCreditDao, this.outputSource = outputSource; } - public void open() throws Exception { + public void open(ExecutionContext executionContext) throws Exception { if (outputSource instanceof ItemStream) { - ((ItemStream) outputSource).open(); + ((ItemStream) outputSource).open(executionContext); } opened = true; } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/reader/GeneratingItemReader.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/reader/GeneratingItemReader.java index e67be3560..86df324a3 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/reader/GeneratingItemReader.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/reader/GeneratingItemReader.java @@ -80,12 +80,6 @@ public class GeneratingItemReader extends AbstractItemReaderRecoverer implements this.marked = this.counter; } - /* (non-Javadoc) - * @see org.springframework.batch.item.ItemStream#open() - */ - public void open() throws StreamException { - } - /* (non-Javadoc) * @see org.springframework.batch.item.ItemStream#reset() */ @@ -102,8 +96,10 @@ public class GeneratingItemReader extends AbstractItemReaderRecoverer implements /* (non-Javadoc) * @see org.springframework.batch.item.ExecutionContextProvider#getExecutionContext() */ - public ExecutionContext getExecutionContext() { - return new ExecutionContext(); + public void beforeSave() { + } + + public void open(ExecutionContext context) throws StreamException { } } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/reader/StagingItemReader.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/reader/StagingItemReader.java index 434058f92..0ad4242a6 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/reader/StagingItemReader.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/reader/StagingItemReader.java @@ -57,7 +57,7 @@ public class StagingItemReader extends JdbcDaoSupport implements ItemStream, Key * * @see org.springframework.batch.io.driving.DrivingQueryItemReader#open() */ - public void open() { + public void open(ExecutionContext executionContext) { // Can be called from multiple threads because of lazy initialisation... synchronized (lock) { if (keys == null) { @@ -227,22 +227,12 @@ public class StagingItemReader extends JdbcDaoSupport implements ItemStream, Key getBuffer().rollback(); } - /* - * (non-Javadoc) - * - * @see org.springframework.batch.item.ItemStream#restoreFrom(org.springframework.batch.item.ExecutionContext) - */ - public void restoreFrom(ExecutionContext context) { - // no-op - } - /* * (non-Javadoc) * * @see org.springframework.batch.item.ExecutionContextProvider#getExecutionContext() */ - public ExecutionContext getExecutionContext() { - return new ExecutionContext(); + public void beforeSave() { } } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/tasklet/InfiniteLoopTasklet.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/tasklet/InfiniteLoopTasklet.java index bf51fcd18..09733e5d7 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/tasklet/InfiniteLoopTasklet.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/tasklet/InfiniteLoopTasklet.java @@ -18,7 +18,6 @@ package org.springframework.batch.sample.tasklet; import org.springframework.batch.core.tasklet.Tasklet; import org.springframework.batch.item.ExecutionContext; -import org.springframework.batch.item.ExecutionContextProvider; import org.springframework.batch.repeat.ExitStatus; import org.springframework.batch.support.PropertiesConverter; @@ -30,7 +29,7 @@ import org.springframework.batch.support.PropertiesConverter; * @author Lucas Ward * */ -public class InfiniteLoopTasklet implements Tasklet, ExecutionContextProvider { +public class InfiniteLoopTasklet implements Tasklet { private int count = 0; @@ -47,11 +46,4 @@ public class InfiniteLoopTasklet implements Tasklet, ExecutionContextProvider { return ExitStatus.CONTINUABLE; } - /* (non-Javadoc) - * @see org.springframework.batch.item.ExecutionContextProvider#getExecutionContext() - */ - public ExecutionContext getExecutionContext() { - return new ExecutionContext(PropertiesConverter.stringToProperties("count=" + count)); - } - } diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/tasklet/SimpleTradeWriter.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/tasklet/SimpleTradeWriter.java index cae12ae66..3aa7b773b 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/tasklet/SimpleTradeWriter.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/tasklet/SimpleTradeWriter.java @@ -18,7 +18,8 @@ package org.springframework.batch.sample.tasklet; import org.springframework.batch.core.tasklet.Tasklet; import org.springframework.batch.item.ExecutionContext; -import org.springframework.batch.item.ExecutionContextProvider; +import org.springframework.batch.item.ItemStream; +import org.springframework.batch.item.exception.StreamException; import org.springframework.batch.item.writer.AbstractItemWriter; import org.springframework.batch.sample.dao.TradeDao; import org.springframework.batch.sample.domain.Trade; @@ -38,7 +39,7 @@ import org.springframework.util.Assert; * @author Lucas Ward * @author Dave Syer */ -public class SimpleTradeWriter extends AbstractItemWriter implements ExecutionContextProvider { +public class SimpleTradeWriter extends AbstractItemWriter implements ItemStream { /* * writes a Trade object to output @@ -49,6 +50,8 @@ public class SimpleTradeWriter extends AbstractItemWriter implements ExecutionCo * number of trade objects processed */ private int tradeCount = 0; + + private ExecutionContext executionContext; /** * The input template is read using the readAndMap method, which accepts a @@ -65,14 +68,18 @@ public class SimpleTradeWriter extends AbstractItemWriter implements ExecutionCo public void setTradeDao(TradeDao tradeDao) { this.tradeDao = tradeDao; } + + public void open(ExecutionContext context) throws StreamException { + this.executionContext = context; + } /* (non-Javadoc) * @see org.springframework.batch.item.ExecutionContextProvider#getExecutionContext() */ - public ExecutionContext getExecutionContext() { - ExecutionContext statistics = new ExecutionContext(); - statistics.putLong("trade.count", tradeCount); - return statistics; + public void beforeSave() { + executionContext.putLong("trade.count", tradeCount); } + public void close() throws StreamException { + } } diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/FixedLengthImportJobFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/FixedLengthImportJobFunctionalTests.java index 6aee96386..9f44d4efd 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/FixedLengthImportJobFunctionalTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/FixedLengthImportJobFunctionalTests.java @@ -23,6 +23,7 @@ import java.sql.SQLException; import org.springframework.batch.io.file.FlatFileItemReader; import org.springframework.batch.io.file.transform.LineTokenizer; +import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.sample.domain.Trade; import org.springframework.batch.sample.mapping.TradeFieldSetMapper; import org.springframework.core.io.ClassPathResource; @@ -61,7 +62,7 @@ public class FixedLengthImportJobFunctionalTests extends AbstractValidatingBatch */ protected void validatePostConditions() throws Exception { - inputSource.open(); + inputSource.open(new ExecutionContext()); jdbcTemplate.query("SELECT ID, ISIN, QUANTITY, PRICE, CUSTOMER FROM trade ORDER BY id", new RowCallbackHandler() { diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/dao/FlatFileCustomerCreditWriterTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/dao/FlatFileCustomerCreditWriterTests.java index 3e15c5aab..0a4fb13d4 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/dao/FlatFileCustomerCreditWriterTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/dao/FlatFileCustomerCreditWriterTests.java @@ -5,6 +5,7 @@ import java.math.BigDecimal; import junit.framework.TestCase; import org.easymock.MockControl; +import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.ItemStream; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.sample.domain.CustomerCredit; @@ -28,13 +29,13 @@ public class FlatFileCustomerCreditWriterTests extends TestCase { } public void testOpen() throws Exception { - + ExecutionContext executionContext = new ExecutionContext(); //set-up outputSource mock - output.open(); + output.open(executionContext); outputControl.replay(); //call tested method - writer.open(); + writer.open(executionContext); //verify method calls outputControl.verify(); @@ -65,7 +66,7 @@ public class FlatFileCustomerCreditWriterTests extends TestCase { //set-up OutputSource mock output.write("testName;1"); - output.open(); + output.open(new ExecutionContext()); outputControl.replay(); //call tested method diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/item/reader/StagingItemReaderTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/item/reader/StagingItemReaderTests.java index 4ddeda3d4..ea8594e19 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/item/reader/StagingItemReaderTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/item/reader/StagingItemReaderTests.java @@ -9,6 +9,7 @@ import org.springframework.batch.core.domain.StepSupport; import org.springframework.batch.execution.scope.SimpleStepContext; import org.springframework.batch.execution.scope.StepContext; import org.springframework.batch.execution.scope.StepSynchronizationManager; +import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.repeat.context.RepeatContextSupport; import org.springframework.batch.repeat.synch.RepeatSynchronizationManager; import org.springframework.batch.sample.item.writer.StagingItemWriter; @@ -49,7 +50,7 @@ public class StagingItemReaderTests extends AbstractTransactionalDataSourceSprin writer.write("BAR"); writer.write("SPAM"); writer.write("BUCKET"); - provider.open(); + provider.open(new ExecutionContext()); } protected void onTearDownAfterTransaction() throws Exception {