Skip to content

Commit ac73b3a

Browse files
quafffmbenhassine
authored andcommitted
Lookup available JobRegistry from context for JobOperatorFactoryBean
Resolves #5229 Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
1 parent 2e9755d commit ac73b3a

2 files changed

Lines changed: 49 additions & 11 deletions

File tree

spring-batch-core/src/main/java/org/springframework/batch/core/configuration/support/DefaultBatchConfiguration.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2025 the original author or authors.
2+
* Copyright 2012-2026 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -74,6 +74,7 @@
7474
* @author Michael Minella
7575
* @author Mahmoud Ben Hassine
7676
* @author Taeik Lim
77+
* @author Yanming Zhou
7778
* @since 5.0
7879
*/
7980
@Configuration(proxyBeanMethods = false)
@@ -113,16 +114,18 @@ public JobOperator jobOperator(JobRepository jobRepository) throws BatchConfigur
113114

114115
// FIXME getter with side effect, see JobOperatorFactoryBean.populateJobRegistry
115116
protected JobRegistry getJobRegistry() {
116-
MapJobRegistry jobRegistry = new MapJobRegistry();
117-
this.applicationContext.getBeansOfType(Job.class).values().forEach(job -> {
118-
try {
119-
jobRegistry.register(job);
120-
}
121-
catch (DuplicateJobException e) {
122-
throw new BatchConfigurationException(e);
123-
}
117+
return this.applicationContext.getBeanProvider(JobRegistry.class).getIfAvailable(() -> {
118+
MapJobRegistry jobRegistry = new MapJobRegistry();
119+
this.applicationContext.getBeansOfType(Job.class).values().forEach(job -> {
120+
try {
121+
jobRegistry.register(job);
122+
}
123+
catch (DuplicateJobException e) {
124+
throw new BatchConfigurationException(e);
125+
}
126+
});
127+
return jobRegistry;
124128
});
125-
return jobRegistry;
126129
}
127130

128131
/**

spring-batch-core/src/test/java/org/springframework/batch/core/configuration/support/DefaultBatchConfigurationTests.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2022-2025 the original author or authors.
2+
* Copyright 2022-2026 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -23,9 +23,11 @@
2323
import org.junit.jupiter.api.Test;
2424

2525
import org.springframework.batch.core.ExitStatus;
26+
import org.springframework.batch.core.configuration.JobRegistry;
2627
import org.springframework.batch.core.job.Job;
2728
import org.springframework.batch.core.job.JobExecution;
2829
import org.springframework.batch.core.job.parameters.JobParameters;
30+
import org.springframework.batch.core.launch.JobRestartException;
2931
import org.springframework.batch.core.repository.support.ResourcelessJobRepository;
3032
import org.springframework.batch.core.step.Step;
3133
import org.springframework.batch.core.job.builder.JobBuilder;
@@ -42,8 +44,12 @@
4244
import org.springframework.jdbc.support.JdbcTransactionManager;
4345
import org.springframework.transaction.PlatformTransactionManager;
4446

47+
import static org.mockito.Mockito.spy;
48+
import static org.mockito.Mockito.verify;
49+
4550
/**
4651
* @author Mahmoud Ben Hassine
52+
* @author Yanming Zhou
4753
*/
4854
class DefaultBatchConfigurationTests {
4955

@@ -85,6 +91,25 @@ void testDefaultInfrastructureBeansRegistration() {
8591
Assertions.assertNotNull(jobOperator);
8692
}
8793

94+
@Test
95+
void testConfigurationWithCustomJobRegistry() throws Exception {
96+
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
97+
CustomJobRegistryJobConfiguration.class);
98+
Job job = context.getBean(Job.class);
99+
JobOperator jobOperator = context.getBean(JobOperator.class);
100+
JobExecution jobExecution = jobOperator.start(job, new JobParameters());
101+
102+
try {
103+
jobOperator.restart(jobExecution);
104+
}
105+
catch (JobRestartException ignored) {
106+
// ignore
107+
}
108+
109+
JobRegistry jobRegistry = context.getBean(JobRegistry.class);
110+
verify(jobRegistry).getJob("job");
111+
}
112+
88113
@Configuration
89114
static class MyJobConfiguration extends JdbcDefaultBatchConfiguration {
90115

@@ -125,4 +150,14 @@ public JobRepository jobRepository() {
125150

126151
}
127152

153+
@Configuration
154+
static class CustomJobRegistryJobConfiguration extends MyJobConfiguration {
155+
156+
@Bean
157+
public JobRegistry jobRegistry() {
158+
return spy(new MapJobRegistry());
159+
}
160+
161+
}
162+
128163
}

0 commit comments

Comments
 (0)