Skip to content

Commit c770192

Browse files
committed
Make MongoDB sequence incrementers configurable
Resolves #5018
1 parent cde185c commit c770192

File tree

4 files changed

+107
-2
lines changed

4 files changed

+107
-2
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,22 @@ private void registerMongoJobRepository(BeanDefinitionRegistry registry,
189189
if (registry.containsBeanDefinition(jobKeyGeneratorRef)) {
190190
beanDefinitionBuilder.addPropertyReference("jobKeyGenerator", jobKeyGeneratorRef);
191191
}
192+
193+
String jobInstanceIncrementerRef = mongoJobRepositoryAnnotation.jobInstanceIncrementerRef();
194+
if (registry.containsBeanDefinition(jobInstanceIncrementerRef)) {
195+
beanDefinitionBuilder.addPropertyReference("jobInstanceIncrementer", jobInstanceIncrementerRef);
196+
}
197+
198+
String jobExecutionIncrementerRef = mongoJobRepositoryAnnotation.jobExecutionIncrementerRef();
199+
if (registry.containsBeanDefinition(jobExecutionIncrementerRef)) {
200+
beanDefinitionBuilder.addPropertyReference("jobExecutionIncrementer", jobExecutionIncrementerRef);
201+
}
202+
203+
String stepExecutionIncrementerRef = mongoJobRepositoryAnnotation.stepExecutionIncrementerRef();
204+
if (registry.containsBeanDefinition(stepExecutionIncrementerRef)) {
205+
beanDefinitionBuilder.addPropertyReference("stepExecutionIncrementer", stepExecutionIncrementerRef);
206+
}
207+
192208
beanDefinitionBuilder.addPropertyValue("validateTransactionState",
193209
mongoJobRepositoryAnnotation.validateTransactionState());
194210

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,25 @@
7777
*/
7878
String jobKeyGeneratorRef() default "jobKeyGenerator";
7979

80+
/**
81+
* The incrementer that will be used to generate unique ids for job instances.
82+
* @return the bean name of the job instance incrementer to use. Defaults to
83+
* {@literal jobInstanceIncrementer}.
84+
*/
85+
String jobInstanceIncrementerRef() default "jobInstanceIncrementer";
86+
87+
/**
88+
* The incrementer that will be used to generate unique ids for job executions.
89+
* @return the bean name of the job execution incrementer to use. Defaults to
90+
* {@literal jobExecutionIncrementer}.
91+
*/
92+
String jobExecutionIncrementerRef() default "jobExecutionIncrementer";
93+
94+
/**
95+
* The incrementer that will be used to generate unique ids for step executions.
96+
* @return the bean name of the step execution incrementer to use. Defaults to
97+
* {@literal stepExecutionIncrementer}.
98+
*/
99+
String stepExecutionIncrementerRef() default "stepExecutionIncrementer";
100+
80101
}

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@
2121
import org.springframework.batch.core.job.JobKeyGenerator;
2222
import org.springframework.batch.core.launch.JobOperator;
2323
import org.springframework.batch.core.repository.JobRepository;
24+
import org.springframework.batch.core.repository.dao.mongodb.MongoSequenceIncrementer;
2425
import org.springframework.batch.core.repository.support.MongoJobRepositoryFactoryBean;
2526
import org.springframework.context.annotation.Bean;
2627
import org.springframework.context.annotation.Configuration;
2728
import org.springframework.data.mongodb.MongoTransactionManager;
2829
import org.springframework.data.mongodb.core.MongoOperations;
30+
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
2931
import org.springframework.transaction.annotation.Isolation;
3032

3133
/**
@@ -74,6 +76,9 @@ public JobRepository jobRepository() throws BatchConfigurationException {
7476
jobRepositoryFactoryBean.setIsolationLevelForCreateEnum(getIsolationLevelForCreate());
7577
jobRepositoryFactoryBean.setValidateTransactionState(getValidateTransactionState());
7678
jobRepositoryFactoryBean.setJobKeyGenerator(getJobKeyGenerator());
79+
jobRepositoryFactoryBean.setJobInstanceIncrementer(getJobInstanceIncrementer());
80+
jobRepositoryFactoryBean.setJobExecutionIncrementer(getJobExecutionIncrementer());
81+
jobRepositoryFactoryBean.setStepExecutionIncrementer(getStepExecutionIncrementer());
7782
jobRepositoryFactoryBean.afterPropertiesSet();
7883
return jobRepositoryFactoryBean.getObject();
7984
}
@@ -148,4 +153,31 @@ protected JobKeyGenerator getJobKeyGenerator() {
148153
return new DefaultJobKeyGenerator();
149154
}
150155

156+
/**
157+
* Return the incrementer to be used to generate ids for new job instances.
158+
* @return the incrementer to be used to generate ids for new job instances
159+
* @since 6.0
160+
*/
161+
protected DataFieldMaxValueIncrementer getJobInstanceIncrementer() {
162+
return new MongoSequenceIncrementer(getMongoOperations(), "BATCH_JOB_INSTANCE_SEQ");
163+
}
164+
165+
/**
166+
* Return the incrementer to be used to generate ids for new job executions.
167+
* @return the incrementer to be used to generate ids for new job executions
168+
* @since 6.0
169+
*/
170+
protected DataFieldMaxValueIncrementer getJobExecutionIncrementer() {
171+
return new MongoSequenceIncrementer(getMongoOperations(), "BATCH_JOB_EXECUTION_SEQ");
172+
}
173+
174+
/**
175+
* Return the incrementer to be used to generate ids for new step executions.
176+
* @return the incrementer to be used to generate ids for new step executions
177+
* @since 6.0
178+
*/
179+
protected DataFieldMaxValueIncrementer getStepExecutionIncrementer() {
180+
return new MongoSequenceIncrementer(getMongoOperations(), "BATCH_STEP_EXECUTION_SEQ");
181+
}
182+
151183
}

spring-batch-core/src/main/java/org/springframework/batch/core/repository/support/MongoJobRepositoryFactoryBean.java

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,12 @@
2020
import org.springframework.batch.core.repository.dao.mongodb.MongoExecutionContextDao;
2121
import org.springframework.batch.core.repository.dao.mongodb.MongoJobExecutionDao;
2222
import org.springframework.batch.core.repository.dao.mongodb.MongoJobInstanceDao;
23+
import org.springframework.batch.core.repository.dao.mongodb.MongoSequenceIncrementer;
2324
import org.springframework.batch.core.repository.dao.mongodb.MongoStepExecutionDao;
2425
import org.springframework.beans.factory.InitializingBean;
2526
import org.springframework.data.mongodb.core.MongoOperations;
2627
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
28+
import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
2729
import org.springframework.util.Assert;
2830

2931
/**
@@ -41,10 +43,28 @@ public class MongoJobRepositoryFactoryBean extends AbstractJobRepositoryFactoryB
4143

4244
private @Nullable MongoOperations mongoOperations;
4345

46+
private @Nullable DataFieldMaxValueIncrementer jobInstanceIncrementer;
47+
48+
private @Nullable DataFieldMaxValueIncrementer jobExecutionIncrementer;
49+
50+
private @Nullable DataFieldMaxValueIncrementer stepExecutionIncrementer;
51+
4452
public void setMongoOperations(MongoOperations mongoOperations) {
4553
this.mongoOperations = mongoOperations;
4654
}
4755

56+
public void setJobInstanceIncrementer(DataFieldMaxValueIncrementer jobInstanceIncrementer) {
57+
this.jobInstanceIncrementer = jobInstanceIncrementer;
58+
}
59+
60+
public void setJobExecutionIncrementer(DataFieldMaxValueIncrementer jobExecutionIncrementer) {
61+
this.jobExecutionIncrementer = jobExecutionIncrementer;
62+
}
63+
64+
public void setStepExecutionIncrementer(DataFieldMaxValueIncrementer stepExecutionIncrementer) {
65+
this.stepExecutionIncrementer = stepExecutionIncrementer;
66+
}
67+
4868
@Override
4969
protected Object getTarget() throws Exception {
5070
MongoJobInstanceDao jobInstanceDao = createJobInstanceDao();
@@ -60,17 +80,22 @@ protected Object getTarget() throws Exception {
6080
protected MongoJobInstanceDao createJobInstanceDao() {
6181
MongoJobInstanceDao mongoJobInstanceDao = new MongoJobInstanceDao(this.mongoOperations);
6282
mongoJobInstanceDao.setJobKeyGenerator(this.jobKeyGenerator);
83+
mongoJobInstanceDao.setJobInstanceIncrementer(this.jobInstanceIncrementer);
6384
return mongoJobInstanceDao;
6485
}
6586

6687
@Override
6788
protected MongoJobExecutionDao createJobExecutionDao() {
68-
return new MongoJobExecutionDao(this.mongoOperations);
89+
MongoJobExecutionDao mongoJobExecutionDao = new MongoJobExecutionDao(this.mongoOperations);
90+
mongoJobExecutionDao.setJobExecutionIncrementer(this.jobExecutionIncrementer);
91+
return mongoJobExecutionDao;
6992
}
7093

7194
@Override
7295
protected MongoStepExecutionDao createStepExecutionDao() {
73-
return new MongoStepExecutionDao(this.mongoOperations);
96+
MongoStepExecutionDao mongoStepExecutionDao = new MongoStepExecutionDao(this.mongoOperations);
97+
mongoStepExecutionDao.setStepExecutionIncrementer(this.stepExecutionIncrementer);
98+
return mongoStepExecutionDao;
7499
}
75100

76101
@Override
@@ -82,6 +107,17 @@ protected MongoExecutionContextDao createExecutionContextDao() {
82107
public void afterPropertiesSet() throws Exception {
83108
super.afterPropertiesSet();
84109
Assert.notNull(this.mongoOperations, "MongoOperations must not be null.");
110+
if (this.jobInstanceIncrementer == null) {
111+
this.jobInstanceIncrementer = new MongoSequenceIncrementer(this.mongoOperations, "BATCH_JOB_INSTANCE_SEQ");
112+
}
113+
if (this.jobExecutionIncrementer == null) {
114+
this.jobExecutionIncrementer = new MongoSequenceIncrementer(this.mongoOperations,
115+
"BATCH_JOB_EXECUTION_SEQ");
116+
}
117+
if (this.stepExecutionIncrementer == null) {
118+
this.stepExecutionIncrementer = new MongoSequenceIncrementer(this.mongoOperations,
119+
"BATCH_STEP_EXECUTION_SEQ");
120+
}
85121
}
86122

87123
}

0 commit comments

Comments
 (0)