From 41defc2c2de20c11fadd7415682db2e6c7348f7d Mon Sep 17 00:00:00 2001 From: Andrey Litvitski Date: Mon, 4 Aug 2025 14:28:14 +0300 Subject: [PATCH] Reset CompositeItemReader iterator on open to support multiple executions Reset delegatesIterator and currentDelegate in open() to ensure that CompositeItemReader works correctly on repeated job executions. Without this reset, the reader skips all delegates after the first run. Closes: gh-4926 Signed-off-by: Andrey Litvitski --- .../batch/item/support/CompositeItemReader.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/CompositeItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/CompositeItemReader.java index 73a92aa57a..f0c5e4d830 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/CompositeItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/CompositeItemReader.java @@ -29,6 +29,7 @@ * * @author Mahmoud Ben Hassine * @author Elimelec Burghelea + * @author Andrey Litvitski * @param type of objects to read * @since 5.2 */ @@ -36,7 +37,7 @@ public class CompositeItemReader implements ItemStreamReader { private final List> delegates; - private final Iterator> delegatesIterator; + private Iterator> delegatesIterator; private ItemStreamReader currentDelegate; @@ -46,8 +47,7 @@ public class CompositeItemReader implements ItemStreamReader { */ public CompositeItemReader(List> delegates) { this.delegates = delegates; - this.delegatesIterator = this.delegates.iterator(); - this.currentDelegate = this.delegatesIterator.hasNext() ? this.delegatesIterator.next() : null; + initIteratorAndCurrentDelegate(); } // TODO: check if we need to open/close delegates on the fly in read() to avoid @@ -57,6 +57,7 @@ public void open(ExecutionContext executionContext) throws ItemStreamException { for (ItemStreamReader delegate : delegates) { delegate.open(executionContext); } + initIteratorAndCurrentDelegate(); } @Override @@ -106,4 +107,9 @@ public void close() throws ItemStreamException { } } + private void initIteratorAndCurrentDelegate() { + this.delegatesIterator = this.delegates.iterator(); + this.currentDelegate = this.delegatesIterator.hasNext() ? this.delegatesIterator.next() : null; + } + } \ No newline at end of file