diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleChunkProcessor.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleChunkProcessor.java index dca6cd5be..8ae1295d0 100755 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleChunkProcessor.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/SimpleChunkProcessor.java @@ -175,7 +175,7 @@ public class SimpleChunkProcessor implements ChunkProcessor, Initializi Chunk outputs = transform(contribution, inputs); - contribution.incrementFilterCount(inputsSize - outputs.size()); + contribution.incrementFilterCount(inputsSize - outputs.size() - inputs.getSkips().size()); outputs = new Chunk(outputs.getItems(), skips.getSkips()); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantChunkProcessorTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantChunkProcessorTests.java index 966bbd8ca..c8ba0bc7a 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantChunkProcessorTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/item/FaultTolerantChunkProcessorTests.java @@ -66,6 +66,31 @@ public class FaultTolerantChunkProcessorTests { Chunk inputs = new Chunk(Arrays.asList("1", "2")); processor.process(contribution, inputs); assertEquals(1, list.size()); + assertEquals(1, contribution.getFilterCount()); + } + + @Test + public void testFilterCountOnSkip() throws Exception { + processor.setProcessSkipPolicy(new AlwaysSkipItemSkipPolicy()); + processor.setItemProcessor(new ItemProcessor() { + public String process(String item) throws Exception { + if (item.equals("1")) { + throw new RuntimeException("Skippable"); + } + return item; + } + }); + Chunk inputs = new Chunk(Arrays.asList("1", "2")); + try { + processor.process(contribution, inputs); + fail("Expected Exception"); + } catch (Exception e) { + assertEquals("Skippable", e.getMessage()); + } + processor.process(contribution, inputs); + assertEquals(1, list.size()); + assertEquals(1, contribution.getSkipCount()); + assertEquals(0, contribution.getFilterCount()); } @Test