diff --git a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchProperties.java b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchProperties.java index ebbed8e6..ce82fa9f 100644 --- a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchProperties.java +++ b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskBatchProperties.java @@ -23,6 +23,9 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * Spring Batch. * * @author Glenn Renfro + * @author Michael Minella + * + * @since 2.0.0 */ @ConfigurationProperties(prefix = "spring.cloud.task.batch") public class TaskBatchProperties { @@ -33,6 +36,13 @@ public class TaskBatchProperties { */ private String jobNames = ""; + /** + * The order for the {@coce CommandLineRunner} used to run batch jobs when + * {@code spring.cloud.task.batch.failOnJobFailure=true}. Defaults to 0 (same as the + * {@link org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner}). + */ + private int commandLineRunnerOrder = 0; + public String getJobNames() { return this.jobNames; } @@ -40,4 +50,12 @@ public class TaskBatchProperties { public void setJobNames(String jobNames) { this.jobNames = jobNames; } + + public int getCommandLineRunnerOrder() { + return commandLineRunnerOrder; + } + + public void setCommandLineRunnerOrder(int commandLineRunnerOrder) { + this.commandLineRunnerOrder = commandLineRunnerOrder; + } } diff --git a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfiguration.java b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfiguration.java index 8f811783..6350657b 100644 --- a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfiguration.java +++ b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfiguration.java @@ -23,7 +23,6 @@ import org.springframework.batch.core.configuration.JobRegistry; import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -36,7 +35,7 @@ import org.springframework.context.annotation.Configuration; * @author Glenn Renfro */ @Configuration -@ConditionalOnProperty(name = "spring.cloud.task.batch.commandLineRunnerEnabled", havingValue = "true", matchIfMissing = false) +@ConditionalOnProperty(name = "spring.cloud.task.batch.failOnJobFailure", havingValue = "true", matchIfMissing = false) @EnableConfigurationProperties(TaskBatchProperties.class) public class TaskJobLauncherAutoConfiguration { @@ -46,8 +45,15 @@ public class TaskJobLauncherAutoConfiguration { @Bean public TaskJobLauncherCommandLineRunnerFactoryBean jobLauncherCommandLineRunner(JobLauncher jobLauncher, JobExplorer jobExplorer, List jobs, JobRegistry jobRegistry) { - TaskJobLauncherCommandLineRunnerFactoryBean taskJobLauncherCommandLineRunner = new TaskJobLauncherCommandLineRunnerFactoryBean( - jobLauncher, jobExplorer, jobs, this.properties.getJobNames(), jobRegistry); - return taskJobLauncherCommandLineRunner; + TaskJobLauncherCommandLineRunnerFactoryBean taskJobLauncherCommandLineRunnerFactoryBean = + new TaskJobLauncherCommandLineRunnerFactoryBean(jobLauncher, + jobExplorer, + jobs, + this.properties.getJobNames(), + jobRegistry); + + taskJobLauncherCommandLineRunnerFactoryBean.setOrder(this.properties.getCommandLineRunnerOrder()); + + return taskJobLauncherCommandLineRunnerFactoryBean; } } diff --git a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherCommandLineRunnerFactoryBean.java b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherCommandLineRunnerFactoryBean.java index 3e209148..f5df4c50 100644 --- a/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherCommandLineRunnerFactoryBean.java +++ b/spring-cloud-task-batch/src/main/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherCommandLineRunnerFactoryBean.java @@ -44,6 +44,8 @@ public class TaskJobLauncherCommandLineRunnerFactoryBean implements FactoryBean< private JobRegistry jobRegistry; + private Integer order = 0; + public TaskJobLauncherCommandLineRunnerFactoryBean(JobLauncher jobLauncher, JobExplorer jobExplorer, List jobs, String jobNames, JobRegistry jobRegistry) { @@ -55,6 +57,10 @@ public class TaskJobLauncherCommandLineRunnerFactoryBean implements FactoryBean< this.jobRegistry = jobRegistry; } + public void setOrder(int order) { + this.order = order; + } + @Override public TaskJobLauncherCommandLineRunner getObject() throws Exception { TaskJobLauncherCommandLineRunner taskJobLauncherCommandLineRunner = @@ -64,6 +70,11 @@ public class TaskJobLauncherCommandLineRunnerFactoryBean implements FactoryBean< taskJobLauncherCommandLineRunner.setJobNames(this.jobNames); } taskJobLauncherCommandLineRunner.setJobRegistry(this.jobRegistry); + + if(this.order != null) { + taskJobLauncherCommandLineRunner.setOrder(this.order); + } + return taskJobLauncherCommandLineRunner; } diff --git a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfigurationTests.java b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfigurationTests.java index 83e3a9e4..f8a289e9 100644 --- a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfigurationTests.java +++ b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/configuration/TaskJobLauncherAutoConfigurationTests.java @@ -43,10 +43,25 @@ public class TaskJobLauncherAutoConfigurationTests { @Test public void testAutoBuiltDataSourceWithTaskJobLauncherCLR() { this.contextRunner. - withPropertyValues("spring.cloud.task.batch.commandLineRunnerEnabled=true"). + withPropertyValues("spring.cloud.task.batch.failOnJobFailure=true"). run(context -> { assertThat(context).hasSingleBean(TaskJobLauncherCommandLineRunner.class); assertThat(context).doesNotHaveBean(JobLauncherCommandLineRunner.class); + assertThat(context.getBean(TaskJobLauncherCommandLineRunner.class) + .getOrder()) + .isEqualTo(0); + }); + } + + @Test + public void testAutoBuiltDataSourceWithTaskJobLauncherCLROrder() { + this.contextRunner. + withPropertyValues("spring.cloud.task.batch.failOnJobFailure=true", + "spring.cloud.task.batch.commandLineRunnerOrder=100"). + run(context -> { + assertThat(context.getBean(TaskJobLauncherCommandLineRunner.class) + .getOrder()) + .isEqualTo(100); }); } @@ -58,3 +73,4 @@ public class TaskJobLauncherAutoConfigurationTests { }); } } + diff --git a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerCoreTests.java b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerCoreTests.java index bbb04417..38cd20a8 100644 --- a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerCoreTests.java +++ b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerCoreTests.java @@ -65,7 +65,7 @@ public class TaskJobLauncherCommandLineRunnerCoreTests { private JobExplorer jobExplorer; @Autowired - PlatformTransactionManager transactionManager; + private PlatformTransactionManager transactionManager; private TaskJobLauncherCommandLineRunner runner; diff --git a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerTests.java b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerTests.java index 90353184..bedfe50a 100644 --- a/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerTests.java +++ b/spring-cloud-task-batch/src/test/java/org/springframework/cloud/task/batch/handler/TaskJobLauncherCommandLineRunnerTests.java @@ -18,7 +18,6 @@ package org.springframework.cloud.task.batch.handler; import java.util.Set; -import org.assertj.core.api.Assertions; import org.junit.After; import org.junit.Test; @@ -37,13 +36,11 @@ import org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration; import org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.cloud.task.batch.configuration.TaskBatchAutoConfiguration; import org.springframework.cloud.task.batch.configuration.TaskJobLauncherAutoConfiguration; import org.springframework.cloud.task.configuration.EnableTask; import org.springframework.cloud.task.repository.TaskExecution; import org.springframework.cloud.task.repository.TaskExplorer; -import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -68,7 +65,7 @@ public class TaskJobLauncherCommandLineRunnerTests { @Test public void testTaskJobLauncherCLRSuccessFail() { - String[] enabledArgs = new String[] { "--spring.cloud.task.batch.commandLineRunnerEnabled=true" }; + String[] enabledArgs = new String[] { "--spring.cloud.task.batch.failOnJobFailure=true" }; boolean isExceptionThrown = false; try { this.applicationContext = SpringApplication @@ -88,7 +85,7 @@ public class TaskJobLauncherCommandLineRunnerTests { @Test public void testTaskJobLauncherPickOneJob() { String[] enabledArgs = new String[] { - "--spring.cloud.task.batch.commandLineRunnerEnabled=true", + "--spring.cloud.task.batch.failOnJobFailure=true", "--spring.cloud.task.batch.jobNames=jobSucceed" }; boolean isExceptionThrown = false; try { diff --git a/spring-cloud-task-docs/src/main/asciidoc/batch.adoc b/spring-cloud-task-docs/src/main/asciidoc/batch.adoc index 9b58f9be..eca2a41e 100644 --- a/spring-cloud-task-docs/src/main/asciidoc/batch.adoc +++ b/spring-cloud-task-docs/src/main/asciidoc/batch.adoc @@ -251,7 +251,12 @@ To override this behavior and allow the task to return an exit code other than z https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html#boot-features-application-exit[ExitCodeGenerator] specified) upon a batch job returning an https://docs.spring.io/spring-batch/4.0.x/reference/html/step.html#conditionalFlow[ExitStatus] -of "FAILED", set `spring.cloud.task.batch.commandLineRunnerEnabled` to true. +of "FAILED", set `spring.cloud.task.batch.failOnJobFailure` to true. + +This functionality does utilize a new `CommandLineRunner` that replaces the one provided +by Spring Boot. By default it is configured with the same order. However, if you'd like +to customize what order the `CommandLineRunner` is executed in, you can set it's order via +the `spring.cloud.task.batch.commandLineRunnerOrder` property. To have your task return the exit code based on the result of the batch job execution, you will need to write your own `CommandLineRunner`.