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 {