diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/repeat/ExitStatus.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/repeat/ExitStatus.java index 6d3c225c0..db9dab7c9 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/repeat/ExitStatus.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/repeat/ExitStatus.java @@ -23,7 +23,7 @@ import org.springframework.util.StringUtils; * Value object used to carry information about the status of a * {@link RepeatOperations}. * - * ExitStatus is immutable and therefore thread-safe. + * ExitStatus is immutable and therefore thread-safe. * * @author Dave Syer * @@ -31,15 +31,25 @@ import org.springframework.util.StringUtils; public class ExitStatus implements Serializable { /** - * Convenient constant value representing unknown state - assumed - * not continuable. + * Convenient constant value representing unknown state - assumed not + * continuable. */ public static final ExitStatus UNKNOWN = new ExitStatus(false, "UNKNOWN"); /** * Convenient constant value representing unfinished processing. */ - public static final ExitStatus CONTINUABLE = new ExitStatus(true, "CONTINUABLE"); + public static final ExitStatus CONTINUABLE = new ExitStatus(true, + "CONTINUABLE"); + + /** + * Convenient constant value representing continuable state where processing + * is still taking place, so no further action is required. Used for + * asynchronous execution scenarios where the processing is happening in + * another thread or process and the caller is not required to wait for the + * result. + */ + public static final ExitStatus EXECUTING = new ExitStatus(true, "EXECUTING"); /** * Convenient constant value representing finished processing. @@ -71,7 +81,8 @@ public class ExitStatus implements Serializable { this(continuable, exitCode, ""); } - public ExitStatus(boolean continuable, String exitCode, String exitDescription) { + public ExitStatus(boolean continuable, String exitCode, + String exitDescription) { super(); this.continuable = continuable; this.exitCode = exitCode; @@ -110,12 +121,14 @@ public class ExitStatus implements Serializable { * Create a new {@link ExitStatus} with a logical combination of the * continuable flag. * - * @param continuable true if the caller thinks it is safe to continue. + * @param continuable + * true if the caller thinks it is safe to continue. * @return a new {@link ExitStatus} with {@link #isContinuable()} the - * logical and of the current value and the argument provided. + * logical and of the current value and the argument provided. */ public ExitStatus and(boolean continuable) { - return new ExitStatus(this.continuable && continuable, this.exitCode, this.exitDescription); + return new ExitStatus(this.continuable && continuable, this.exitCode, + this.exitDescription); } /** @@ -126,15 +139,17 @@ public class ExitStatus implements Serializable { * * If the input is null just return this. * - * @param status an {@link ExitStatus} to combine with this one. + * @param status + * an {@link ExitStatus} to combine with this one. * @return a new {@link ExitStatus} with {@link #isContinuable()} the - * logical and of the current value and the argument provided. + * logical and of the current value and the argument provided. */ public ExitStatus and(ExitStatus status) { if (status == null) { return this; } - ExitStatus result = and(status.continuable).addExitDescription(status.exitDescription); + ExitStatus result = and(status.continuable).addExitDescription( + status.exitDescription); if (result.continuable || !status.continuable) { result = result.replaceExitCode(status.exitCode); } @@ -147,7 +162,8 @@ public class ExitStatus implements Serializable { * @see java.lang.Object#toString() */ public String toString() { - return "continuable=" + continuable + ";exitCode=" + exitCode + ";exitDescription=" + exitDescription; + return "continuable=" + continuable + ";exitCode=" + exitCode + + ";exitDescription=" + exitDescription; } /** @@ -172,12 +188,13 @@ public class ExitStatus implements Serializable { } /** - * Add an exit code to an existing {@link ExitStatus}. If there is already a - * code present tit will be replaced. + * Add an exit code to an existing {@link ExitStatus}. If there is already + * a code present tit will be replaced. * - * @param code the code to add + * @param code + * the code to add * @return a new {@link ExitStatus} with the same properties but a new exit - * code. + * code. */ public ExitStatus replaceExitCode(String code) { return new ExitStatus(continuable, code, exitDescription); @@ -189,7 +206,8 @@ public class ExitStatus implements Serializable { * @return true if the exit code is "RUNNING" or "UNKNOWN" */ public boolean isRunning() { - return "RUNNING".equals(this.exitCode) || "UNKNOWN".equals(this.exitCode); + return "RUNNING".equals(this.exitCode) + || "UNKNOWN".equals(this.exitCode); } /** @@ -197,12 +215,14 @@ public class ExitStatus implements Serializable { * already a description present the two will be concatenated with a * semicolon. * - * @param description the description to add + * @param description + * the description to add * @return a new {@link ExitStatus} with the same properties but a new exit - * description + * description */ public ExitStatus addExitDescription(String description) { - if (StringUtils.hasText(exitDescription) && StringUtils.hasText(description) + if (StringUtils.hasText(exitDescription) + && StringUtils.hasText(description) && !exitDescription.equals(description)) { description = exitDescription + "; " + description; } diff --git a/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/MessageOrientedStepIntegrationTests.java b/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/MessageOrientedStepIntegrationTests.java index 1119b6369..e7a522c1c 100644 --- a/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/MessageOrientedStepIntegrationTests.java +++ b/spring-batch-integration/src/test/java/org/springframework/batch/integration/job/MessageOrientedStepIntegrationTests.java @@ -20,11 +20,12 @@ import static org.junit.Assert.assertEquals; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.batch.core.BatchStatus; +import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobParameters; -import org.springframework.batch.core.configuration.JobLocator; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -40,11 +41,12 @@ public class MessageOrientedStepIntegrationTests { private JobLauncher jobLauncher; @Autowired - private JobLocator jobLocator; + @Qualifier("job") + private Job job; @Test public void testLaunchJob() throws Exception { - JobExecution jobExecution = jobLauncher.run(jobLocator.getJob("job"), new JobParameters()); + JobExecution jobExecution = jobLauncher.run(job, new JobParameters()); assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); } diff --git a/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml b/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml index fa6ffc908..88df6756f 100644 --- a/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml +++ b/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml @@ -1,44 +1,35 @@ - - - + - - + - - - - + class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> + - - - - - - @@ -50,25 +41,28 @@ - - - + + + - + - + - +