diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/TaskletStep.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/TaskletStep.java index 1341296a6..8618e5a77 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/TaskletStep.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/TaskletStep.java @@ -163,6 +163,9 @@ public class TaskletStep extends AbstractStep implements Step, InitializingBean, catch (Exception ex) { logger.error("Encountered an error on listener close.", ex); } + if (e instanceof JobInterruptedException) { + throw (JobInterruptedException) e; + } if (e instanceof RuntimeException) { throw (RuntimeException) e; } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/TaskletStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/TaskletStepTests.java index ff725b97e..d3d9c72c2 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/TaskletStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/TaskletStepTests.java @@ -133,6 +133,27 @@ public class TaskletStepTests extends TestCase { assertNotNull(stepExecution.getEndTime()); } } + + /** + * When job is interrupted the {@link JobInterruptedException} should be propagated up. + */ + public void testJobInterrupted() throws Exception { + TaskletStep step = new TaskletStep( + new Tasklet(){ + public ExitStatus execute() throws Exception { + throw new JobInterruptedException("Interrupted while executing tasklet"); + } + }, + new JobRepositorySupport()); + + try { + step.execute(stepExecution); + fail(); + } + catch (JobInterruptedException expected) { + assertEquals("Interrupted while executing tasklet", expected.getMessage()); + } + } private class StubTasklet extends StepListenerSupport implements Tasklet {