diff --git a/infrastructure/src/main/java/org/springframework/batch/repeat/ExitStatus.java b/infrastructure/src/main/java/org/springframework/batch/repeat/ExitStatus.java index 922d47dc5..94e805066 100644 --- a/infrastructure/src/main/java/org/springframework/batch/repeat/ExitStatus.java +++ b/infrastructure/src/main/java/org/springframework/batch/repeat/ExitStatus.java @@ -109,7 +109,7 @@ public class ExitStatus implements Serializable { * logical and of the current value and the argument provided. */ public ExitStatus and(boolean continuable) { - return new ExitStatus(this.continuable && continuable); + return new ExitStatus(this.continuable && continuable, this.exitCode, this.exitDescription); } /* diff --git a/infrastructure/src/main/java/org/springframework/batch/repeat/support/RepeatTemplate.java b/infrastructure/src/main/java/org/springframework/batch/repeat/support/RepeatTemplate.java index 3af3bd89e..d7b4c7cce 100644 --- a/infrastructure/src/main/java/org/springframework/batch/repeat/support/RepeatTemplate.java +++ b/infrastructure/src/main/java/org/springframework/batch/repeat/support/RepeatTemplate.java @@ -203,7 +203,10 @@ public class RepeatTemplate implements RepeatOperations { executeAfterInterceptors(context, value); // An exception alone is not sufficient grounds for not // continuing - result = result.and(canContinue(value)); + + if(value instanceof ExitStatus){ + result = (ExitStatus)value; + } // N.B. the order may be important here: if (isComplete(context, value) || isMarkedComplete(context)) { diff --git a/infrastructure/src/test/java/org/springframework/batch/repeat/ExitStatusTests.java b/infrastructure/src/test/java/org/springframework/batch/repeat/ExitStatusTests.java index f10355232..c527fba6f 100644 --- a/infrastructure/src/test/java/org/springframework/batch/repeat/ExitStatusTests.java +++ b/infrastructure/src/test/java/org/springframework/batch/repeat/ExitStatusTests.java @@ -66,6 +66,11 @@ public class ExitStatusTests extends TestCase { public void testAndExitStatus() { assertTrue(ExitStatus.CONTINUABLE.and(ExitStatus.CONTINUABLE.isContinuable()).isContinuable()); assertFalse(ExitStatus.CONTINUABLE.and(ExitStatus.FINISHED.isContinuable()).isContinuable()); + assertTrue(ExitStatus.FINISHED.and(ExitStatus.CONTINUABLE.isContinuable()).getExitCode() + == ExitStatus.FINISHED.getExitCode()); + ExitStatus status = new ExitStatus(false, "CUSTOM_CODE", "CUSTOM_DESCRIPTION"); + assertTrue(status.and(true).getExitCode() == "CUSTOM_CODE"); + assertTrue(status.and(true).getExitDescription() == "CUSTOM_DESCRIPTION"); } public void testAddExitCode() throws Exception { diff --git a/infrastructure/src/test/java/org/springframework/batch/repeat/support/SimpleRepeatTemplateTests.java b/infrastructure/src/test/java/org/springframework/batch/repeat/support/SimpleRepeatTemplateTests.java index 002af0b20..7e406da9e 100644 --- a/infrastructure/src/test/java/org/springframework/batch/repeat/support/SimpleRepeatTemplateTests.java +++ b/infrastructure/src/test/java/org/springframework/batch/repeat/support/SimpleRepeatTemplateTests.java @@ -387,5 +387,20 @@ public class SimpleRepeatTemplateTests extends AbstractTradeBatchTests { assertFalse(result.isContinuable()); } + + public void testCustomExitCode(){ + + ExitStatus status = template.iterate(new RepeatCallback(){ + + public ExitStatus doInIteration(RepeatContext context) + throws Exception { + ExitStatus exitStatus = new ExitStatus(false, "CUSTOM_CODE"); + return exitStatus; + } + + }); + + assertEquals("CUSTOM_CODE", status.getExitCode()); + } }