diff --git a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateBulkAsynchronousTests.java b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateBulkAsynchronousTests.java index 0c544291a..897d0ebac 100644 --- a/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateBulkAsynchronousTests.java +++ b/spring-batch-infrastructure-tests/src/test/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplateBulkAsynchronousTests.java @@ -232,6 +232,39 @@ public class TaskExecutorRepeatTemplateBulkAsynchronousTests { assertEquals(0, frequency); } + + @Test + public void testErrorThrownByCallback() throws Exception { + + callback = new RepeatCallback() { + + private volatile AtomicInteger count = new AtomicInteger(0); + + public RepeatStatus doInIteration(RepeatContext context) + throws Exception { + int position = count.incrementAndGet(); + + if(position == 4) { + throw new OutOfMemoryError("Planned"); + } + else { + return RepeatStatus.CONTINUABLE; + } + } + }; + + template.setCompletionPolicy(new SimpleCompletionPolicy(10)); + + try { + template.iterate(callback); + fail("Expected planned exception"); + } catch (OutOfMemoryError oome) { + assertEquals("Planned", oome.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + fail("Wrong exception was thrown: " + e); + } + } /** * Slightly flakey convenience method. If this doesn't do something that diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplate.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplate.java index 9c50fe589..521841325 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplate.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/repeat/support/TaskExecutorRepeatTemplate.java @@ -258,7 +258,7 @@ public class TaskExecutorRepeatTemplate extends RepeatTemplate { result = callback.doInIteration(context); } - catch (Exception e) { + catch (Throwable e) { error = e; } finally {