Fail fast if job name does not exist

See gh-36060
pull/36620/head
Akshay Dubey 1 year ago committed by Stephane Nicoll
parent a5d5908c27
commit c38cd74542

@ -24,6 +24,8 @@ import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Properties;
import javax.annotation.PostConstruct;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -66,6 +68,7 @@ import org.springframework.util.StringUtils;
* @author Jean-Pierre Bergamin
* @author Mahmoud Ben Hassine
* @author Stephane Nicoll
* @author Akshay Dubey
* @since 2.3.0
*/
public class JobLauncherApplicationRunner implements ApplicationRunner, Ordered, ApplicationEventPublisherAware {
@ -111,6 +114,18 @@ public class JobLauncherApplicationRunner implements ApplicationRunner, Ordered,
this.jobRepository = jobRepository;
}
@PostConstruct
public void validate() {
if (StringUtils.hasText(this.jobNames)) {
String[] jobsToRun = this.jobNames.split(",");
for(String jobName: jobsToRun) {
if (!isLocalJob(jobName) && !isRegisteredJob(jobName)) {
throw new IllegalArgumentException("No job instances were found for job name [" + jobName + "]");
}
}
}
}
public void setOrder(int order) {
this.order = order;
}
@ -161,6 +176,14 @@ public class JobLauncherApplicationRunner implements ApplicationRunner, Ordered,
executeRegisteredJobs(jobParameters);
}
private boolean isLocalJob(String jobName) {
return this.jobs.stream().anyMatch((job) -> job.getName().equals(jobName));
}
private boolean isRegisteredJob(String jobName) {
return this.jobRegistry != null && this.jobRegistry.getJobNames().contains(jobName);
}
private void executeLocalJobs(JobParameters jobParameters) throws JobExecutionException {
for (Job job : this.jobs) {
if (StringUtils.hasText(this.jobNames)) {
@ -178,16 +201,10 @@ public class JobLauncherApplicationRunner implements ApplicationRunner, Ordered,
if (this.jobRegistry != null && StringUtils.hasText(this.jobNames)) {
String[] jobsToRun = this.jobNames.split(",");
for (String jobName : jobsToRun) {
try {
if(isRegisteredJob(jobName) && !isLocalJob(jobName)) {
Job job = this.jobRegistry.getJob(jobName);
if (this.jobs.contains(job)) {
continue;
}
execute(job, jobParameters);
}
catch (NoSuchJobException ex) {
logger.debug(LogMessage.format("No job found in registry for job name: %s", jobName));
}
}
}
}

@ -80,6 +80,7 @@ import static org.mockito.Mockito.mock;
* @author Stephane Nicoll
* @author Vedran Pavic
* @author Kazuki Shimizu
* @author Akshay Dubey
*/
@ExtendWith(OutputCaptureExtension.class)
class BatchAutoConfigurationTests {
@ -374,6 +375,17 @@ class BatchAutoConfigurationTests {
.hasBean("customInitializer"));
}
@Test
void testNonConfiguredJobThrowsException() {
this.contextRunner
.withUserConfiguration(NamedJobConfigurationWithLocalJob.class, EmbeddedDataSourceConfiguration.class)
.withPropertyValues("spring.batch.job.names:discreteLocalJob,nonConfiguredJob")
.run((context) -> {
assertThat(context).hasFailed().getFailure().getRootCause()
.hasMessageContaining("nonConfiguredJob");
});
}
@Configuration(proxyBeanMethods = false)
protected static class BatchDataSourceConfiguration {

Loading…
Cancel
Save