From 9322fe6fae3433b367869db0f9c8ce81c758370a Mon Sep 17 00:00:00 2001 From: Daniel Heinrich Date: Thu, 16 Feb 2017 10:47:45 +0100 Subject: [PATCH] BATCH-2455 unifie listener ordering Why: Listeners should be called in normal order before some event (i.e. read, write) and after that event in reverse order. Side effects: The ordering of Chunk and ItemReader Listeners is changed and will change some behaviors of users. This change is still neccesary because it is not only the correct and obviouse way, but also prevents new users to hack around this problem. --- .../core/listener/CompositeChunkListener.java | 17 +++++++++++------ .../listener/CompositeItemReadListener.java | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/listener/CompositeChunkListener.java b/spring-batch-core/src/main/java/org/springframework/batch/core/listener/CompositeChunkListener.java index 5291df491..aa8e8b07d 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/listener/CompositeChunkListener.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/listener/CompositeChunkListener.java @@ -49,35 +49,40 @@ public class CompositeChunkListener implements ChunkListener { } /** - * Call the registered listeners in order, respecting and prioritizing those - * that implement {@link Ordered}. + * Call the registered listeners in reverse order. * * @see org.springframework.batch.core.ChunkListener#afterChunk(ChunkContext context) */ @Override public void afterChunk(ChunkContext context) { - for (Iterator iterator = listeners.iterator(); iterator.hasNext();) { + for (Iterator iterator = listeners.reverse(); iterator.hasNext();) { ChunkListener listener = iterator.next(); listener.afterChunk(context); } } /** - * Call the registered listeners in reverse order. + * Call the registered listeners in order, respecting and prioritizing those + * that implement {@link Ordered}. * * @see org.springframework.batch.core.ChunkListener#beforeChunk(ChunkContext context) */ @Override public void beforeChunk(ChunkContext context) { - for (Iterator iterator = listeners.reverse(); iterator.hasNext();) { + for (Iterator iterator = listeners.iterator(); iterator.hasNext();) { ChunkListener listener = iterator.next(); listener.beforeChunk(context); } } + /** + * Call the registered listeners in reverse order. + * + * @see org.springframework.batch.core.ChunkListener#afterChunkError(ChunkContext context) + */ @Override public void afterChunkError(ChunkContext context) { - for (Iterator iterator = listeners.iterator(); iterator.hasNext();) { + for (Iterator iterator = listeners.reverse(); iterator.hasNext();) { ChunkListener listener = iterator.next(); listener.afterChunkError(context); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/listener/CompositeItemReadListener.java b/spring-batch-core/src/main/java/org/springframework/batch/core/listener/CompositeItemReadListener.java index b454f9c87..58746f687 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/listener/CompositeItemReadListener.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/listener/CompositeItemReadListener.java @@ -81,7 +81,7 @@ public class CompositeItemReadListener implements ItemReadListener { */ @Override public void onReadError(Exception ex) { - for (Iterator> iterator = listeners.iterator(); iterator.hasNext();) { + for (Iterator> iterator = listeners.reverse(); iterator.hasNext();) { ItemReadListener listener = iterator.next(); listener.onReadError(ex); }