From 0c892da257dd98a3b1c9a3c2830a543ab0c878ad Mon Sep 17 00:00:00 2001 From: jpraet Date: Sat, 15 Jun 2013 21:31:38 +0200 Subject: [PATCH] BATCH-2036: Output incorrect when using processor-transactional="false" and skips. --- .../item/FaultTolerantChunkProcessor.java | 7 +- .../FaultTolerantChunkProcessorTests.java | 74 +++++++++++++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantChunkProcessor.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantChunkProcessor.java index 664db55a9..c3956ac49 100755 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantChunkProcessor.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/FaultTolerantChunkProcessor.java @@ -223,7 +223,9 @@ public class FaultTolerantChunkProcessor extends SimpleChunkProcessor extends SimpleChunkProcessor processedItems = new ArrayList(); + processor.setProcessorTransactional(false); + processor.setProcessSkipPolicy(new AlwaysSkipItemSkipPolicy()); + processor.setItemProcessor(new ItemProcessor() { + @Override + public String process(String item) throws Exception { + processedItems.add(item); + if (item.contains("fail")) { + throw new IllegalArgumentException("Expected Skippable Exception!"); + } + if (item.contains("skip")) { + return null; + } + return item; + } + }); + processor.afterPropertiesSet(); + Chunk inputs = new Chunk(Arrays.asList("1", "2", "skip", "skip", "3", "fail", "fail", "4", "5")); + try { + processor.process(contribution, inputs); + fail("Expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + assertEquals("Expected Skippable Exception!", e.getMessage()); + } + try { + processor.process(contribution, inputs); + fail("Expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + assertEquals("Expected Skippable Exception!", e.getMessage()); + } + processor.process(contribution, inputs); + assertEquals(5, list.size()); + assertEquals("[1, 2, 3, 4, 5]", list.toString()); + assertEquals(2, contribution.getFilterCount()); + assertEquals(2, contribution.getProcessSkipCount()); + assertEquals(9, processedItems.size()); + assertEquals("[1, 2, skip, skip, 3, fail, fail, 4, 5]", processedItems.toString()); + } + + @Test + // BATCH-2036 + public void testProcessFilterAndSkippableExceptionNoRollback() throws Exception { + final List processedItems = new ArrayList(); + processor.setProcessorTransactional(false); + processor.setProcessSkipPolicy(new AlwaysSkipItemSkipPolicy()); + processor.setItemProcessor(new ItemProcessor() { + @Override + public String process(String item) throws Exception { + processedItems.add(item); + if (item.contains("fail")) { + throw new IllegalArgumentException("Expected Skippable Exception!"); + } + if (item.contains("skip")) { + return null; + } + return item; + } + }); + processor.setRollbackClassifier(new BinaryExceptionClassifier(Collections + .> singleton(IllegalArgumentException.class), false)); + processor.afterPropertiesSet(); + Chunk inputs = new Chunk(Arrays.asList("1", "2", "skip", "skip", "3", "fail", "fail", "4", "5")); + processor.process(contribution, inputs); + assertEquals(5, list.size()); + assertEquals("[1, 2, 3, 4, 5]", list.toString()); + assertEquals(2, contribution.getFilterCount()); + assertEquals(2, contribution.getProcessSkipCount()); + assertEquals(9, processedItems.size()); + assertEquals("[1, 2, skip, skip, 3, fail, fail, 4, 5]", processedItems.toString()); + } protected void processAndExpectPlannedRuntimeException(Chunk chunk) throws Exception {