From 675ffb70b7639fd5da1824e6886ef27d5cc2b4d0 Mon Sep 17 00:00:00 2001 From: robokaso Date: Thu, 13 Nov 2008 10:11:50 +0000 Subject: [PATCH] RESOLVED - BATCH-34: Support for multiple I/O files in a single jobRun for a particular scheduleDate. multiResourceJob used as sample also for output --- .../batch/item/file/FlatFileItemWriter.java | 3 +- .../AbstractMultiResourceItemWriterTests.java | 4 +- ...MultiResourceItemWriterFlatFileTests.java} | 2 +- .../main/resources/jobs/multiResourceJob.xml | 42 ++++++++++++------- .../FixedLengthImportJobFunctionalTests.java | 14 +++---- .../MultiResourceJobFunctionalTests.java | 30 +++++++++++++ 6 files changed, 67 insertions(+), 28 deletions(-) rename spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/{MultiResourceItemWriterTests.java => MultiResourceItemWriterFlatFileTests.java} (92%) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/FlatFileItemWriter.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/FlatFileItemWriter.java index b2515037e..cd064f8e9 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/FlatFileItemWriter.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/FlatFileItemWriter.java @@ -30,7 +30,6 @@ import org.springframework.batch.item.FlushFailedException; import org.springframework.batch.item.ItemStream; import org.springframework.batch.item.ItemStreamException; import org.springframework.batch.item.WriterNotOpenException; -import org.springframework.batch.item.file.mapping.FieldSet; import org.springframework.batch.item.file.transform.LineAggregator; import org.springframework.batch.item.util.ExecutionContextUserSupport; import org.springframework.batch.item.util.FileUtils; @@ -105,7 +104,7 @@ public class FlatFileItemWriter extends ExecutionContextUserSupport implement /** * Public setter for the {@link LineAggregator}. This will be used to - * translate a {@link FieldSet} into a line for output. + * translate the item into a line for output. * * @param lineAggregator the {@link LineAggregator} to set */ diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/AbstractMultiResourceItemWriterTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/AbstractMultiResourceItemWriterTests.java index e7c5fb7b1..dbd7903ba 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/AbstractMultiResourceItemWriterTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/AbstractMultiResourceItemWriterTests.java @@ -11,7 +11,7 @@ import org.springframework.core.io.FileSystemResource; /** * Tests for {@link MultiResourceItemWriter}. * - * @see MultiResourceItemWriterTests + * @see MultiResourceItemWriterFlatFileTests * @see MultiResourceItemReaderXmlTests */ public class AbstractMultiResourceItemWriterTests { @@ -28,7 +28,7 @@ public class AbstractMultiResourceItemWriterTests { @Before public void setUp() throws Exception { - file = File.createTempFile(MultiResourceItemWriterTests.class.getSimpleName(), null); + file = File.createTempFile(MultiResourceItemWriterFlatFileTests.class.getSimpleName(), null); tested.setResource(new FileSystemResource(file)); tested.setDelegate(delegate); tested.setResourceSuffixCreator(suffixCreator); diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/MultiResourceItemWriterTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/MultiResourceItemWriterFlatFileTests.java similarity index 92% rename from spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/MultiResourceItemWriterTests.java rename to spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/MultiResourceItemWriterFlatFileTests.java index 3ac147ad5..a54c5feee 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/MultiResourceItemWriterTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/MultiResourceItemWriterFlatFileTests.java @@ -14,7 +14,7 @@ import org.springframework.batch.item.file.transform.PassThroughLineAggregator; * Tests for {@link MultiResourceItemWriter} delegating to * {@link FlatFileItemWriter}. */ -public class MultiResourceItemWriterTests extends AbstractMultiResourceItemWriterTests { +public class MultiResourceItemWriterFlatFileTests extends AbstractMultiResourceItemWriterTests { @Override @Before diff --git a/spring-batch-samples/src/main/resources/jobs/multiResourceJob.xml b/spring-batch-samples/src/main/resources/jobs/multiResourceJob.xml index f769394c0..ac7599c59 100644 --- a/spring-batch-samples/src/main/resources/jobs/multiResourceJob.xml +++ b/spring-batch-samples/src/main/resources/jobs/multiResourceJob.xml @@ -1,9 +1,7 @@ - + - - + + + + + + + + + + @@ -29,20 +35,25 @@ - - + + + + - + - - + + @@ -62,8 +73,7 @@ - + inputSource; + protected FlatFileItemReader itemReader; private LineTokenizer lineTokenizer; @Autowired @@ -71,16 +71,17 @@ public class FixedLengthImportJobFunctionalTests extends AbstractValidatingBatch public void onSetUp() throws Exception { simpleJdbcTemplate.update("delete from TRADE"); fileLocator = new ClassPathResource("data/fixedLengthImportJob/input/20070122.teststream.ImportTradeDataStep.txt"); - inputSource = new FlatFileItemReader(); + itemReader = new FlatFileItemReader(); FieldSetMapper mapper = new TradeFieldSetMapper(); DefaultLineMapper lineMapper = new DefaultLineMapper(); lineMapper.setLineTokenizer(lineTokenizer); lineMapper.setFieldSetMapper(mapper); - inputSource.setLineMapper(lineMapper); + itemReader.setLineMapper(lineMapper); - inputSource.setResource(fileLocator); + itemReader.setResource(fileLocator); + itemReader.open(new ExecutionContext()); } /** @@ -89,7 +90,6 @@ public class FixedLengthImportJobFunctionalTests extends AbstractValidatingBatch */ protected void validatePostConditions() throws Exception { - inputSource.open(new ExecutionContext()); simpleJdbcTemplate.getJdbcOperations().query( "SELECT ID, ISIN, QUANTITY, PRICE, CUSTOMER FROM trade ORDER BY id", @@ -97,7 +97,7 @@ public class FixedLengthImportJobFunctionalTests extends AbstractValidatingBatch public void processRow(ResultSet rs) throws SQLException { Trade trade; try { - trade = inputSource.read(); + trade = itemReader.read(); } catch (Exception e) { throw new IllegalStateException(e.getMessage()); @@ -110,7 +110,7 @@ public class FixedLengthImportJobFunctionalTests extends AbstractValidatingBatch }); - assertNull(inputSource.read()); + assertNull(itemReader.read()); } /* diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/MultiResourceJobFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/MultiResourceJobFunctionalTests.java index 9e2bda329..16e977b5f 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/MultiResourceJobFunctionalTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/MultiResourceJobFunctionalTests.java @@ -1,5 +1,11 @@ package org.springframework.batch.sample; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; + +import static org.junit.Assert.*; + import org.junit.runner.RunWith; import org.springframework.batch.core.Job; import org.springframework.beans.factory.annotation.Autowired; @@ -11,6 +17,30 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @ContextConfiguration() public class MultiResourceJobFunctionalTests extends FixedLengthImportJobFunctionalTests { + /** + * Context: 5 items overall, min. 2 items per output file, commitInterval=3, + * => two files created, with 3 items in the first and two in second. + */ + @Override + protected void validatePostConditions() throws Exception { + File file1 = new File("target/test-outputs/multiResourceOutput.txt.1"); + File file2 = new File("target/test-outputs/multiResourceOutput.txt.2"); + assertTrue(file1.exists()); + assertTrue(file2.exists()); + + BufferedReader reader1 = new BufferedReader(new FileReader(file1)); + for (int i = 1; i <= 3; i++) { + assertEquals(itemReader.read().toString(), reader1.readLine()); + } + assertNull(reader1.readLine()); + + BufferedReader reader2 = new BufferedReader(new FileReader(file2)); + for (int i = 1; i <= 2; i++) { + assertEquals(itemReader.read().toString(), reader2.readLine()); + } + assertNull(reader2.readLine()); + + } @Autowired public void setJob(@Qualifier("multiResourceJob") Job job) {