diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/writer/ItemTrackingItemWriter.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/writer/ItemTrackingItemWriter.java new file mode 100644 index 000000000..48e9045a3 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/item/writer/ItemTrackingItemWriter.java @@ -0,0 +1,36 @@ +package org.springframework.batch.sample.item.writer; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.batch.item.AbstractItemWriter; +import org.springframework.batch.item.validator.ValidationException; + +/** + * Remembers all items written - useful for testing. + */ +public class ItemTrackingItemWriter extends AbstractItemWriter { + + private List items = new ArrayList(); + + private int failure = -1; + + private int counter = 0; + + public void write(Object item) throws Exception { + + items.add(item); + if (++counter == failure) { + throw new ValidationException("validation failed"); + } + } + + public List getItems() { + return items; + } + + public void setValidationFailure(int failure) { + this.failure = failure; + } + +} diff --git a/spring-batch-samples/src/main/resources/jobs/skipSampleJob.xml b/spring-batch-samples/src/main/resources/jobs/skipSampleJob.xml index a73ac7b0e..849d70eec 100644 --- a/spring-batch-samples/src/main/resources/jobs/skipSampleJob.xml +++ b/spring-batch-samples/src/main/resources/jobs/skipSampleJob.xml @@ -1,8 +1,8 @@ - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/SkipSampleFunctionalTests.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/SkipSampleFunctionalTests.java index ced5ef126..11bb52c74 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/SkipSampleFunctionalTests.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/SkipSampleFunctionalTests.java @@ -1,7 +1,6 @@ package org.springframework.batch.sample; -import javax.sql.DataSource; - +import org.springframework.batch.sample.item.writer.ItemTrackingItemWriter; import org.springframework.jdbc.core.JdbcTemplate; /** @@ -16,8 +15,16 @@ public class SkipSampleFunctionalTests extends AbstractValidatingBatchLauncherTe JdbcTemplate jdbcTemplate; - public void setDataSource(DataSource dataSource) { - jdbcTemplate = new JdbcTemplate(dataSource); + ItemTrackingItemWriter writer; + + // auto-injection + public void setWriter(ItemTrackingItemWriter writer) { + this.writer = writer; + } + + // auto-injection + public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } protected void onSetUp() throws Exception { @@ -28,6 +35,9 @@ public class SkipSampleFunctionalTests extends AbstractValidatingBatchLauncherTe int after = jdbcTemplate.queryForInt("SELECT COUNT(*) from TRADE"); // 5 input records, 1 skipped => 4 written to output assertEquals(before + 4, after); + + // no item was processed twice (no rollback occurred despite error on write) + assertEquals(after, writer.getItems().size()); } }