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.
This commit is contained in:
Daniel Heinrich
2017-02-16 10:47:45 +01:00
committed by Michael Minella
parent e5fe6a5de6
commit 9322fe6fae
2 changed files with 12 additions and 7 deletions

View File

@@ -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<ChunkListener> iterator = listeners.iterator(); iterator.hasNext();) {
for (Iterator<ChunkListener> 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<ChunkListener> iterator = listeners.reverse(); iterator.hasNext();) {
for (Iterator<ChunkListener> 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<ChunkListener> iterator = listeners.iterator(); iterator.hasNext();) {
for (Iterator<ChunkListener> iterator = listeners.reverse(); iterator.hasNext();) {
ChunkListener listener = iterator.next();
listener.afterChunkError(context);
}

View File

@@ -81,7 +81,7 @@ public class CompositeItemReadListener<T> implements ItemReadListener<T> {
*/
@Override
public void onReadError(Exception ex) {
for (Iterator<ItemReadListener<? super T>> iterator = listeners.iterator(); iterator.hasNext();) {
for (Iterator<ItemReadListener<? super T>> iterator = listeners.reverse(); iterator.hasNext();) {
ItemReadListener<? super T> listener = iterator.next();
listener.onReadError(ex);
}