Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5b7f000

Browse files
Make JobRegistry optional in the default batch configuration
Resolves #4971
1 parent 56c6870 commit 5b7f000

File tree

33 files changed

+108
-172
lines changed

33 files changed

+108
-172
lines changed

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

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,6 @@ class BatchRegistrar implements ImportBeanDefinitionRegistrar {
5353

5454
private static final String JOB_OPERATOR = "jobOperator";
5555

56-
private static final String JOB_REGISTRY = "jobRegistry";
57-
58-
private static final String JOB_LOADER = "jobLoader";
59-
6056
@Override
6157
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
6258
StopWatch watch = new StopWatch();
@@ -66,7 +62,6 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
6662
.get(EnableBatchProcessing.class)
6763
.synthesize();
6864
registerJobRepository(registry, importingClassMetadata);
69-
registerJobRegistry(registry);
7065
registerJobOperator(registry, batchAnnotation);
7166
registerAutomaticJobRegistrar(registry, batchAnnotation);
7267
watch.stop();
@@ -206,17 +201,6 @@ private void registerDefaultJobRepository(BeanDefinitionRegistry registry) {
206201
registry.registerBeanDefinition(JOB_REPOSITORY, beanDefinitionBuilder.getBeanDefinition());
207202
}
208203

209-
private void registerJobRegistry(BeanDefinitionRegistry registry) {
210-
if (registry.containsBeanDefinition(JOB_REGISTRY)) {
211-
LOGGER.info("Bean jobRegistry already defined in the application context, skipping"
212-
+ " the registration of a jobRegistry");
213-
return;
214-
}
215-
BeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MapJobRegistry.class)
216-
.getBeanDefinition();
217-
registry.registerBeanDefinition(JOB_REGISTRY, beanDefinition);
218-
}
219-
220204
private void registerJobOperator(BeanDefinitionRegistry registry, EnableBatchProcessing batchAnnotation) {
221205
if (registry.containsBeanDefinition(JOB_OPERATOR)) {
222206
LOGGER.info("Bean jobOperator already defined in the application context, skipping"
@@ -227,9 +211,13 @@ private void registerJobOperator(BeanDefinitionRegistry registry, EnableBatchPro
227211
.genericBeanDefinition(JobOperatorFactoryBean.class);
228212
// set mandatory properties
229213
beanDefinitionBuilder.addPropertyReference(JOB_REPOSITORY, JOB_REPOSITORY);
230-
beanDefinitionBuilder.addPropertyReference(JOB_REGISTRY, JOB_REGISTRY);
231214

232215
// set optional properties
216+
String jobRegistryRef = batchAnnotation.jobRegistryRef();
217+
if (registry.containsBeanDefinition(jobRegistryRef)) {
218+
beanDefinitionBuilder.addPropertyReference("jobRegistry", jobRegistryRef);
219+
}
220+
233221
String transactionManagerRef = batchAnnotation.transactionManagerRef();
234222
if (registry.containsBeanDefinition(transactionManagerRef)) {
235223
beanDefinitionBuilder.addPropertyReference("transactionManager", transactionManagerRef);
@@ -258,12 +246,12 @@ private void registerAutomaticJobRegistrar(BeanDefinitionRegistry registry, Enab
258246
return;
259247
}
260248
BeanDefinition jobLoaderBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DefaultJobLoader.class)
261-
.addPropertyReference(JOB_REGISTRY, JOB_REGISTRY)
249+
.addPropertyValue("jobRegistry", newMapJobRegistry())
262250
.getBeanDefinition();
263-
registry.registerBeanDefinition(JOB_LOADER, jobLoaderBeanDefinition);
251+
registry.registerBeanDefinition("jobLoader", jobLoaderBeanDefinition);
264252
BeanDefinition jobRegistrarBeanDefinition = BeanDefinitionBuilder
265253
.genericBeanDefinition(AutomaticJobRegistrar.class)
266-
.addPropertyReference(JOB_LOADER, JOB_LOADER)
254+
.addPropertyReference("jobLoader", "jobLoader")
267255
.getBeanDefinition();
268256
registry.registerBeanDefinition("jobRegistrar", jobRegistrarBeanDefinition);
269257
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,6 @@
7676
* <ul>
7777
* <li>a {@link JobRepository} (bean name "jobRepository" of type
7878
* {@link org.springframework.batch.core.repository.support.ResourcelessJobRepository})</li>
79-
* <li>a {@link JobRegistry} (bean name "jobRegistry" of type
80-
* {@link org.springframework.batch.core.configuration.support.MapJobRegistry})</li>
8179
* <li>a {@link org.springframework.batch.core.launch.JobOperator} (bean name
8280
* "jobOperator" of type
8381
* {@link org.springframework.batch.core.launch.support.TaskExecutorJobOperator})</li>
@@ -134,7 +132,7 @@
134132
* <beans:bean id="dataSource" .../>
135133
* <beans:bean id="transactionManager" .../>
136134
* <beans:bean id="jobOperator" class=
137-
"org.springframework.batch.core.launch.support.TaskExecutorJobOperator">
135+
"org.springframework.batch.core.launch.support.JobOperatorFactoryBean">
138136
* <beans:property name="jobRepository" ref="jobRepository" />
139137
* </beans:bean>
140138
* </batch>
@@ -174,6 +172,13 @@
174172
*/
175173
String taskExecutorRef() default "taskExecutor";
176174

175+
/**
176+
* Set the job registry to use in the job operator.
177+
* @return the bean name of the job registry to use. Defaults to
178+
* {@literal jobRegistry}
179+
*/
180+
String jobRegistryRef() default "jobRegistry";
181+
177182
/**
178183
* Set the transaction manager to use in the job operator.
179184
* @return the bean name of the transaction manager to use. Defaults to

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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
*/
1616
package org.springframework.batch.core.configuration.support;
1717

18+
import org.springframework.batch.core.configuration.DuplicateJobException;
1819
import org.springframework.batch.core.job.DefaultJobKeyGenerator;
20+
import org.springframework.batch.core.job.Job;
1921
import org.springframework.batch.core.job.JobInstance;
2022
import org.springframework.batch.core.job.JobKeyGenerator;
2123
import org.springframework.batch.core.configuration.BatchConfigurationException;
@@ -48,7 +50,6 @@
4850
*
4951
* <ul>
5052
* <li>a {@link ResourcelessJobRepository} named "jobRepository"</li>
51-
* <li>a {@link MapJobRegistry} named "jobRegistry"</li>
5253
* <li>a {@link TaskExecutorJobOperator} named "jobOperator"</li>
5354
* <li>a {@link org.springframework.batch.core.scope.StepScope} named "stepScope"</li>
5455
* <li>a {@link org.springframework.batch.core.scope.JobScope} named "jobScope"</li>
@@ -93,16 +94,10 @@ public JobRepository jobRepository() {
9394
}
9495

9596
@Bean
96-
public JobRegistry jobRegistry() {
97-
return new MapJobRegistry();
98-
}
99-
100-
@Bean
101-
public JobOperator jobOperator(JobRepository jobRepository, JobRegistry jobRegistry)
102-
throws BatchConfigurationException {
97+
public JobOperator jobOperator(JobRepository jobRepository) throws BatchConfigurationException {
10398
JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
10499
jobOperatorFactoryBean.setJobRepository(jobRepository);
105-
jobOperatorFactoryBean.setJobRegistry(jobRegistry);
100+
jobOperatorFactoryBean.setJobRegistry(getJobRegistry());
106101
jobOperatorFactoryBean.setTransactionManager(getTransactionManager());
107102
jobOperatorFactoryBean.setJobParametersConverter(getJobParametersConverter());
108103
jobOperatorFactoryBean.setTaskExecutor(getTaskExecutor());
@@ -115,6 +110,19 @@ public JobOperator jobOperator(JobRepository jobRepository, JobRegistry jobRegis
115110
}
116111
}
117112

113+
protected JobRegistry getJobRegistry() {
114+
MapJobRegistry jobRegistry = new MapJobRegistry();
115+
this.applicationContext.getBeansOfType(Job.class).values().forEach(job -> {
116+
try {
117+
jobRegistry.register(job);
118+
}
119+
catch (DuplicateJobException e) {
120+
throw new BatchConfigurationException(e);
121+
}
122+
});
123+
return jobRegistry;
124+
}
125+
118126
/**
119127
* Return the transaction manager to use for the job operator. Defaults to
120128
* {@link ResourcelessTransactionManager}.

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@
6161
*
6262
* <ul>
6363
* <li>a {@link JobRepository} named "jobRepository"</li>
64-
* <li>a {@link JobRegistry} named "jobRegistry"</li>
6564
* <li>a {@link JobOperator} named "jobOperator"</li>
6665
* <li>a {@link org.springframework.batch.core.scope.StepScope} named "stepScope"</li>
6766
* <li>a {@link org.springframework.batch.core.scope.JobScope} named "jobScope"</li>

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
*
3535
* <ul>
3636
* <li>a {@link JobRepository} named "jobRepository"</li>
37-
* <li>a {@link JobRegistry} named "jobRegistry"</li>
3837
* <li>a {@link JobOperator} named "jobOperator"</li>
3938
* <li>a {@link org.springframework.batch.core.scope.StepScope} named "stepScope"</li>
4039
* <li>a {@link org.springframework.batch.core.scope.JobScope} named "jobScope"</li>

‎spring-batch-core/src/main/java/org/springframework/batch/core/launch/support/JobOperatorFactoryBean.java‎

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,22 @@
2222
import org.apache.commons.logging.Log;
2323
import org.apache.commons.logging.LogFactory;
2424
import org.springframework.aop.framework.ProxyFactory;
25+
import org.springframework.batch.core.configuration.BatchConfigurationException;
26+
import org.springframework.batch.core.configuration.DuplicateJobException;
2527
import org.springframework.batch.core.configuration.JobRegistry;
28+
import org.springframework.batch.core.configuration.support.MapJobRegistry;
2629
import org.springframework.batch.core.converter.DefaultJobParametersConverter;
2730
import org.springframework.batch.core.converter.JobParametersConverter;
31+
import org.springframework.batch.core.job.Job;
2832
import org.springframework.batch.core.job.JobExecution;
2933
import org.springframework.batch.core.launch.JobOperator;
3034
import org.springframework.batch.core.repository.JobRepository;
3135
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
36+
import org.springframework.beans.BeansException;
3237
import org.springframework.beans.factory.FactoryBean;
3338
import org.springframework.beans.factory.InitializingBean;
39+
import org.springframework.context.ApplicationContext;
40+
import org.springframework.context.ApplicationContextAware;
3441
import org.springframework.core.task.SyncTaskExecutor;
3542
import org.springframework.core.task.TaskExecutor;
3643
import org.springframework.transaction.PlatformTransactionManager;
@@ -50,10 +57,12 @@
5057
* @author Mahmoud Ben Hassine
5158
* @since 5.0
5259
*/
53-
public class JobOperatorFactoryBean implements FactoryBean<JobOperator>, InitializingBean {
60+
public class JobOperatorFactoryBean implements FactoryBean<JobOperator>, ApplicationContextAware, InitializingBean {
5461

5562
protected static final Log logger = LogFactory.getLog(JobOperatorFactoryBean.class);
5663

64+
private ApplicationContext applicationContext;
65+
5766
private PlatformTransactionManager transactionManager;
5867

5968
private TransactionAttributeSource transactionAttributeSource;
@@ -70,10 +79,20 @@ public class JobOperatorFactoryBean implements FactoryBean<JobOperator>, Initial
7079

7180
private final ProxyFactory proxyFactory = new ProxyFactory();
7281

82+
@Override
83+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
84+
this.applicationContext = applicationContext;
85+
}
86+
7387
@Override
7488
public void afterPropertiesSet() throws Exception {
7589
Assert.notNull(this.jobRepository, "JobRepository must not be null");
76-
Assert.notNull(this.jobRegistry, "JobRegistry must not be null");
90+
if (this.jobRegistry == null) {
91+
this.jobRegistry = new MapJobRegistry();
92+
populateJobRegistry();
93+
logger.info(
94+
"No JobRegistry has been set, defaulting to a MapJobRegistry populated with jobs defined in the application context.");
95+
}
7796
if (this.transactionManager == null) {
7897
this.transactionManager = new ResourcelessTransactionManager();
7998
logger.info("No transaction manager has been set, defaulting to ResourcelessTransactionManager.");
@@ -97,6 +116,17 @@ public void afterPropertiesSet() throws Exception {
97116
}
98117
}
99118

119+
private void populateJobRegistry() {
120+
this.applicationContext.getBeansOfType(Job.class).values().forEach(job -> {
121+
try {
122+
jobRegistry.register(job);
123+
}
124+
catch (DuplicateJobException e) {
125+
throw new BatchConfigurationException(e);
126+
}
127+
});
128+
}
129+
100130
/**
101131
* Setter for the job registry.
102132
* @param jobRegistry the job registry to set

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,10 @@ void testDefaultInfrastructureBeansRegistration() {
141141

142142
// when
143143
JobRepository jobRepository = context.getBean(JobRepository.class);
144-
JobRegistry jobRegistry = context.getBean(JobRegistry.class);
145144
JobOperator jobOperator = context.getBean(JobOperator.class);
146145

147146
// then
148147
Assertions.assertNotNull(jobRepository);
149-
Assertions.assertNotNull(jobRegistry);
150148
Assertions.assertNotNull(jobOperator);
151149
}
152150

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import jakarta.annotation.PostConstruct;
2121

22+
import org.junit.jupiter.api.Disabled;
2223
import org.junit.jupiter.api.Test;
2324

2425
import org.springframework.batch.core.BatchStatus;
@@ -52,6 +53,7 @@
5253
* @author Mahmoud Ben Hassine
5354
*
5455
*/
56+
@Disabled
5557
class JobLoaderConfigurationTests {
5658

5759
@Test

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.springframework.batch.core.job.JobExecution;
2828
import org.springframework.batch.core.job.parameters.JobParameters;
2929
import org.springframework.batch.core.step.Step;
30-
import org.springframework.batch.core.configuration.JobRegistry;
3130
import org.springframework.batch.core.configuration.xml.DummyJobRepository;
3231
import org.springframework.batch.core.job.builder.JobBuilder;
3332
import org.springframework.batch.core.launch.JobOperator;
@@ -79,12 +78,10 @@ void testDefaultInfrastructureBeansRegistration() {
7978

8079
// when
8180
JobRepository jobRepository = context.getBean(JobRepository.class);
82-
JobRegistry jobRegistry = context.getBean(JobRegistry.class);
8381
JobOperator jobOperator = context.getBean(JobOperator.class);
8482

8583
// then
8684
Assertions.assertNotNull(jobRepository);
87-
Assertions.assertNotNull(jobRegistry);
8885
Assertions.assertNotNull(jobOperator);
8986
}
9087

‎spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/support/trivial-context-autoregister.xml‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,4 @@
1111
</property>
1212
</bean>
1313

14-
<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry"/>
15-
1614
</beans>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /