Skip to content

Commit 70e8a1c

Browse files
committed
Add a JobRegistryBeanPostProcessor in the default batch configuration
Resolves #4245
1 parent df4bf84 commit 70e8a1c

File tree

6 files changed

+56
-0
lines changed

6 files changed

+56
-0
lines changed

spring-batch-core/src/main/java/org/springframework/batch/core/configuration/annotation/BatchRegistrar.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import org.springframework.batch.core.configuration.support.AutomaticJobRegistrar;
2424
import org.springframework.batch.core.configuration.support.DefaultJobLoader;
25+
import org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor;
2526
import org.springframework.batch.core.configuration.support.MapJobRegistry;
2627
import org.springframework.batch.core.explore.support.JobExplorerFactoryBean;
2728
import org.springframework.batch.core.launch.support.JobOperatorFactoryBean;
@@ -61,6 +62,7 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
6162
registerJobExplorer(registry, batchAnnotation);
6263
registerJobLauncher(registry, batchAnnotation);
6364
registerJobRegistry(registry);
65+
registerJobRegistryBeanPostProcessor(registry);
6466
registerJobOperator(registry, batchAnnotation);
6567
registerAutomaticJobRegistrar(registry, batchAnnotation);
6668
watch.stop();
@@ -217,6 +219,19 @@ private void registerJobRegistry(BeanDefinitionRegistry registry) {
217219
registry.registerBeanDefinition("jobRegistry", beanDefinition);
218220
}
219221

222+
private void registerJobRegistryBeanPostProcessor(BeanDefinitionRegistry registry) {
223+
if (registry.containsBeanDefinition("jobRegistryBeanPostProcessor")) {
224+
LOGGER.info("Bean jobRegistryBeanPostProcessor already defined in the application context, skipping"
225+
+ " the registration of a jobRegistryBeanPostProcessor");
226+
return;
227+
}
228+
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder
229+
.genericBeanDefinition(JobRegistryBeanPostProcessor.class);
230+
beanDefinitionBuilder.addPropertyReference("jobRegistry", "jobRegistry");
231+
232+
registry.registerBeanDefinition("jobRegistryBeanPostProcessor", beanDefinitionBuilder.getBeanDefinition());
233+
}
234+
220235
private void registerJobOperator(BeanDefinitionRegistry registry, EnableBatchProcessing batchAnnotation) {
221236
if (registry.containsBeanDefinition("jobOperator")) {
222237
LOGGER.info("Bean jobOperator already defined in the application context, skipping"

spring-batch-core/src/main/java/org/springframework/batch/core/configuration/annotation/EnableBatchProcessing.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@
9191
* <li>a {@link org.springframework.batch.core.launch.JobOperator} (bean name
9292
* "jobOperator" of type
9393
* {@link org.springframework.batch.core.launch.support.SimpleJobOperator})</li>
94+
* <li>a
95+
* {@link org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor}
96+
* (bean name "jobRegistryBeanPostProcessor" of type
97+
* {@link org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor})</li>
9498
* </ul>
9599
*
96100
* If the configuration is specified as <code>modular=true</code>, the context also

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
* <li>a {@link JobLauncher} named "jobLauncher"</li>
8585
* <li>a {@link JobRegistry} named "jobRegistry"</li>
8686
* <li>a {@link JobOperator} named "JobOperator"</li>
87+
* <li>a {@link JobRegistryBeanPostProcessor} named "jobRegistryBeanPostProcessor"</li>
8788
* <li>a {@link org.springframework.batch.core.scope.StepScope} named "stepScope"</li>
8889
* <li>a {@link org.springframework.batch.core.scope.JobScope} named "jobScope"</li>
8990
* </ul>
@@ -208,6 +209,19 @@ public JobOperator jobOperator() throws BatchConfigurationException {
208209
}
209210
}
210211

212+
@Bean
213+
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor() throws BatchConfigurationException {
214+
JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor = new JobRegistryBeanPostProcessor();
215+
jobRegistryBeanPostProcessor.setJobRegistry(jobRegistry());
216+
try {
217+
jobRegistryBeanPostProcessor.afterPropertiesSet();
218+
return jobRegistryBeanPostProcessor;
219+
}
220+
catch (Exception e) {
221+
throw new BatchConfigurationException("Unable to configure the default job registry BeanPostProcessor", e);
222+
}
223+
}
224+
211225
/*
212226
* Getters to customize the configuration of infrastructure beans
213227
*/

spring-batch-core/src/test/java/org/springframework/batch/core/configuration/annotation/BatchRegistrarTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.batch.core.DefaultJobKeyGenerator;
2828
import org.springframework.batch.core.JobKeyGenerator;
2929
import org.springframework.batch.core.configuration.JobRegistry;
30+
import org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor;
3031
import org.springframework.batch.core.explore.JobExplorer;
3132
import org.springframework.batch.core.launch.JobLauncher;
3233
import org.springframework.batch.core.launch.JobOperator;
@@ -78,6 +79,7 @@ void testConfigurationWithUserDefinedBeans() {
7879
Assertions.assertTrue(Mockito.mockingDetails(context.getBean(JobLauncher.class)).isMock());
7980
Assertions.assertTrue(Mockito.mockingDetails(context.getBean(JobRegistry.class)).isMock());
8081
Assertions.assertTrue(Mockito.mockingDetails(context.getBean(JobOperator.class)).isMock());
82+
Assertions.assertTrue(Mockito.mockingDetails(context.getBean(JobRegistryBeanPostProcessor.class)).isMock());
8183
}
8284

8385
@Test
@@ -160,13 +162,15 @@ void testDefaultInfrastructureBeansRegistration() {
160162
JobExplorer jobExplorer = context.getBean(JobExplorer.class);
161163
JobRegistry jobRegistry = context.getBean(JobRegistry.class);
162164
JobOperator jobOperator = context.getBean(JobOperator.class);
165+
JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor = context.getBean(JobRegistryBeanPostProcessor.class);
163166

164167
// then
165168
Assertions.assertNotNull(jobLauncher);
166169
Assertions.assertNotNull(jobRepository);
167170
Assertions.assertNotNull(jobExplorer);
168171
Assertions.assertNotNull(jobRegistry);
169172
Assertions.assertNotNull(jobOperator);
173+
Assertions.assertNotNull(jobRegistryBeanPostProcessor);
170174
}
171175

172176
@Test
@@ -244,6 +248,11 @@ public JobOperator jobOperator() {
244248
return Mockito.mock();
245249
}
246250

251+
@Bean
252+
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor() {
253+
return Mockito.mock();
254+
}
255+
247256
}
248257

249258
@Configuration

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ void testConfigurationWithCustomInfrastructureBean() {
8585
Assertions.assertEquals(1, jobRepositories.size());
8686
JobRepository jobRepository = jobRepositories.entrySet().iterator().next().getValue();
8787
Assertions.assertInstanceOf(DummyJobRepository.class, jobRepository);
88+
Map<String, JobRegistryBeanPostProcessor> jobRegistryBeanPostProcessorMap = context
89+
.getBeansOfType(JobRegistryBeanPostProcessor.class);
90+
Assertions.assertEquals(1, jobRegistryBeanPostProcessorMap.size());
8891
}
8992

9093
@Test
@@ -98,13 +101,15 @@ void testDefaultInfrastructureBeansRegistration() {
98101
JobExplorer jobExplorer = context.getBean(JobExplorer.class);
99102
JobRegistry jobRegistry = context.getBean(JobRegistry.class);
100103
JobOperator jobOperator = context.getBean(JobOperator.class);
104+
JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor = context.getBean(JobRegistryBeanPostProcessor.class);
101105

102106
// then
103107
Assertions.assertNotNull(jobLauncher);
104108
Assertions.assertNotNull(jobRepository);
105109
Assertions.assertNotNull(jobExplorer);
106110
Assertions.assertNotNull(jobRegistry);
107111
Assertions.assertNotNull(jobOperator);
112+
Assertions.assertNotNull(jobRegistryBeanPostProcessor);
108113
}
109114

110115
@Configuration
@@ -154,6 +159,13 @@ public JobRepository jobRepository() {
154159
return new DummyJobRepository();
155160
}
156161

162+
@Bean
163+
public JobRegistryBeanPostProcessor jobRegistryBeanPostProcessor(JobRegistry jobRegistry) {
164+
JobRegistryBeanPostProcessor postProcessor = new JobRegistryBeanPostProcessor();
165+
postProcessor.setJobRegistry(jobRegistry);
166+
return postProcessor;
167+
}
168+
157169
}
158170

159171
}

spring-batch-docs/modules/ROOT/pages/job/advanced-meta-data.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ example has been given an `id` so that it can be included in child
222222
contexts (for example, as a parent bean definition) and cause all jobs created
223223
there to also be registered automatically.
224224

225+
As of version 5.1, the `@EnableBatchProcessing` annotation automatically registers a `jobRegistryBeanPostProcessor` bean in the application context.
226+
225227
[[automaticjobregistrar]]
226228
=== AutomaticJobRegistrar
227229

0 commit comments

Comments
 (0)