2525import org .springframework .batch .core .configuration .support .JobRegistrySmartInitializingSingleton ;
2626import org .springframework .batch .core .configuration .support .MapJobRegistry ;
2727import org .springframework .batch .core .launch .support .JobOperatorFactoryBean ;
28- import org .springframework .batch .core .launch .support .TaskExecutorJobLauncher ;
2928import org .springframework .batch .core .repository .support .JdbcJobRepositoryFactoryBean ;
29+ import org .springframework .batch .core .repository .support .MongoJobRepositoryFactoryBean ;
30+ import org .springframework .batch .core .repository .support .ResourcelessJobRepository ;
3031import org .springframework .beans .factory .config .BeanDefinition ;
3132import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
3233import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
3334import org .springframework .context .annotation .ImportBeanDefinitionRegistrar ;
3435import org .springframework .core .log .LogMessage ;
3536import org .springframework .core .type .AnnotationMetadata ;
37+ import org .springframework .transaction .annotation .Isolation ;
3638import org .springframework .util .StopWatch ;
3739import org .springframework .util .StringUtils ;
3840
@@ -52,6 +54,8 @@ class BatchRegistrar implements ImportBeanDefinitionRegistrar {
5254
5355 private static final String JOB_REPOSITORY = "jobRepository" ;
5456
57+ private static final String JOB_OPERATOR = "jobOperator" ;
58+
5559 private static final String JOB_REGISTRY = "jobRegistry" ;
5660
5761 private static final String JOB_LOADER = "jobLoader" ;
@@ -64,7 +68,7 @@ public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, B
6468 EnableBatchProcessing batchAnnotation = importingClassMetadata .getAnnotations ()
6569 .get (EnableBatchProcessing .class )
6670 .synthesize ();
67- registerJobRepository (registry , batchAnnotation );
71+ registerJobRepository (registry , importingClassMetadata );
6872 registerJobRegistry (registry );
6973 registerJobRegistrySmartInitializingSingleton (registry );
7074 registerJobOperator (registry , batchAnnotation );
@@ -82,65 +86,126 @@ private void validateState(AnnotationMetadata importingClassMetadata) {
8286 }
8387 }
8488
85- private void registerJobRepository (BeanDefinitionRegistry registry , EnableBatchProcessing batchAnnotation ) {
89+ private void registerJobRepository (BeanDefinitionRegistry registry , AnnotationMetadata importingClassMetadata ) {
8690 if (registry .containsBeanDefinition (JOB_REPOSITORY )) {
8791 LOGGER .info ("Bean jobRepository already defined in the application context, skipping"
8892 + " the registration of a jobRepository" );
8993 return ;
9094 }
95+ if (importingClassMetadata .hasAnnotation (EnableJdbcJobRepository .class .getName ())) {
96+ registerJdbcJobRepository (registry , importingClassMetadata );
97+ }
98+ else {
99+ if (importingClassMetadata .hasAnnotation (EnableMongoJobRepository .class .getName ())) {
100+ registerMongoJobRepository (registry , importingClassMetadata );
101+ }
102+ else {
103+ registerDefaultJobRepository (registry );
104+ }
105+ }
106+ }
107+
108+ private void registerJdbcJobRepository (BeanDefinitionRegistry registry , AnnotationMetadata importingClassMetadata ) {
109+ EnableJdbcJobRepository jdbcJobRepositoryAnnotation = importingClassMetadata .getAnnotations ()
110+ .get (EnableJdbcJobRepository .class )
111+ .synthesize ();
91112 BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder
92113 .genericBeanDefinition (JdbcJobRepositoryFactoryBean .class );
93114
94115 // set mandatory properties
95- String dataSourceRef = batchAnnotation .dataSourceRef ();
116+ String dataSourceRef = jdbcJobRepositoryAnnotation .dataSourceRef ();
96117 beanDefinitionBuilder .addPropertyReference ("dataSource" , dataSourceRef );
97118
98- String transactionManagerRef = batchAnnotation .transactionManagerRef ();
119+ String transactionManagerRef = jdbcJobRepositoryAnnotation .transactionManagerRef ();
99120 beanDefinitionBuilder .addPropertyReference ("transactionManager" , transactionManagerRef );
100121
101122 // set optional properties
102- String executionContextSerializerRef = batchAnnotation .executionContextSerializerRef ();
123+ String executionContextSerializerRef = jdbcJobRepositoryAnnotation .executionContextSerializerRef ();
103124 if (registry .containsBeanDefinition (executionContextSerializerRef )) {
104125 beanDefinitionBuilder .addPropertyReference ("serializer" , executionContextSerializerRef );
105126 }
106127
107- String conversionServiceRef = batchAnnotation .conversionServiceRef ();
128+ String conversionServiceRef = jdbcJobRepositoryAnnotation .conversionServiceRef ();
108129 if (registry .containsBeanDefinition (conversionServiceRef )) {
109130 beanDefinitionBuilder .addPropertyReference ("conversionService" , conversionServiceRef );
110131 }
111132
112- String incrementerFactoryRef = batchAnnotation .incrementerFactoryRef ();
133+ String incrementerFactoryRef = jdbcJobRepositoryAnnotation .incrementerFactoryRef ();
113134 if (registry .containsBeanDefinition (incrementerFactoryRef )) {
114135 beanDefinitionBuilder .addPropertyReference ("incrementerFactory" , incrementerFactoryRef );
115136 }
116137
117- String jobKeyGeneratorRef = batchAnnotation .jobKeyGeneratorRef ();
118- if (registry .containsBeanDefinition (jobKeyGeneratorRef )) {
119- beanDefinitionBuilder .addPropertyReference ("jobKeyGenerator" , jobKeyGeneratorRef );
120- }
121-
122- String charset = batchAnnotation .charset ();
138+ String charset = jdbcJobRepositoryAnnotation .charset ();
123139 if (charset != null ) {
124140 beanDefinitionBuilder .addPropertyValue ("charset" , Charset .forName (charset ));
125141 }
126142
127- String tablePrefix = batchAnnotation .tablePrefix ();
143+ String tablePrefix = jdbcJobRepositoryAnnotation .tablePrefix ();
128144 if (tablePrefix != null ) {
129145 beanDefinitionBuilder .addPropertyValue ("tablePrefix" , tablePrefix );
130146 }
131147
132- String isolationLevelForCreate = batchAnnotation .isolationLevelForCreate ();
148+ String databaseType = jdbcJobRepositoryAnnotation .databaseType ();
149+ if (StringUtils .hasText (databaseType )) {
150+ beanDefinitionBuilder .addPropertyValue ("databaseType" , databaseType );
151+ }
152+
153+ String jdbcOperationsRef = jdbcJobRepositoryAnnotation .jdbcOperationsRef ();
154+ if (registry .containsBeanDefinition (jdbcOperationsRef )) {
155+ beanDefinitionBuilder .addPropertyReference ("jdbcOperations" , jdbcOperationsRef );
156+ }
157+
158+ beanDefinitionBuilder .addPropertyValue ("maxVarCharLength" , jdbcJobRepositoryAnnotation .maxVarCharLength ());
159+ beanDefinitionBuilder .addPropertyValue ("clobType" , jdbcJobRepositoryAnnotation .clobType ());
160+ beanDefinitionBuilder .addPropertyValue ("validateTransactionState" ,
161+ jdbcJobRepositoryAnnotation .validateTransactionState ());
162+
163+ Isolation isolationLevelForCreate = jdbcJobRepositoryAnnotation .isolationLevelForCreate ();
164+ if (isolationLevelForCreate != null ) {
165+ beanDefinitionBuilder .addPropertyValue ("isolationLevelForCreateEnum" , isolationLevelForCreate );
166+ }
167+
168+ String jobKeyGeneratorRef = jdbcJobRepositoryAnnotation .jobKeyGeneratorRef ();
169+ if (registry .containsBeanDefinition (jobKeyGeneratorRef )) {
170+ beanDefinitionBuilder .addPropertyReference ("jobKeyGenerator" , jobKeyGeneratorRef );
171+ }
172+
173+ registry .registerBeanDefinition (JOB_REPOSITORY , beanDefinitionBuilder .getBeanDefinition ());
174+ }
175+
176+ private void registerMongoJobRepository (BeanDefinitionRegistry registry ,
177+ AnnotationMetadata importingClassMetadata ) {
178+ BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder
179+ .genericBeanDefinition (MongoJobRepositoryFactoryBean .class );
180+ EnableMongoJobRepository mongoJobRepositoryAnnotation = importingClassMetadata .getAnnotations ()
181+ .get (EnableMongoJobRepository .class )
182+ .synthesize ();
183+ String mongoOperationsRef = mongoJobRepositoryAnnotation .mongoOperationsRef ();
184+ if (registry .containsBeanDefinition (mongoOperationsRef )) {
185+ beanDefinitionBuilder .addPropertyReference ("mongoOperations" , mongoOperationsRef );
186+ }
187+ String transactionManagerRef = mongoJobRepositoryAnnotation .transactionManagerRef ();
188+ if (registry .containsBeanDefinition (transactionManagerRef )) {
189+ beanDefinitionBuilder .addPropertyReference ("transactionManager" , transactionManagerRef );
190+ }
191+ Isolation isolationLevelForCreate = mongoJobRepositoryAnnotation .isolationLevelForCreate ();
133192 if (isolationLevelForCreate != null ) {
134193 beanDefinitionBuilder .addPropertyValue ("isolationLevelForCreate" , isolationLevelForCreate );
135194 }
136195
137- String databaseType = batchAnnotation . databaseType ();
138- if (StringUtils . hasText ( databaseType )) {
139- beanDefinitionBuilder .addPropertyValue ( "databaseType " , databaseType );
196+ String jobKeyGeneratorRef = mongoJobRepositoryAnnotation . jobKeyGeneratorRef ();
197+ if (registry . containsBeanDefinition ( jobKeyGeneratorRef )) {
198+ beanDefinitionBuilder .addPropertyReference ( "jobKeyGenerator " , jobKeyGeneratorRef );
140199 }
200+ beanDefinitionBuilder .addPropertyValue ("validateTransactionState" ,
201+ mongoJobRepositoryAnnotation .validateTransactionState ());
141202
142- beanDefinitionBuilder .addPropertyValue ("maxVarCharLength" , batchAnnotation .maxVarCharLength ());
143- beanDefinitionBuilder .addPropertyValue ("clobType" , batchAnnotation .clobType ());
203+ registry .registerBeanDefinition (JOB_REPOSITORY , beanDefinitionBuilder .getBeanDefinition ());
204+ }
205+
206+ private void registerDefaultJobRepository (BeanDefinitionRegistry registry ) {
207+ BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder
208+ .genericBeanDefinition (ResourcelessJobRepository .class );
144209 registry .registerBeanDefinition (JOB_REPOSITORY , beanDefinitionBuilder .getBeanDefinition ());
145210 }
146211
@@ -171,7 +236,7 @@ private void registerJobRegistrySmartInitializingSingleton(BeanDefinitionRegistr
171236 }
172237
173238 private void registerJobOperator (BeanDefinitionRegistry registry , EnableBatchProcessing batchAnnotation ) {
174- if (registry .containsBeanDefinition ("jobOperator" )) {
239+ if (registry .containsBeanDefinition (JOB_OPERATOR )) {
175240 LOGGER .info ("Bean jobOperator already defined in the application context, skipping"
176241 + " the registration of a jobOperator" );
177242 return ;
@@ -186,12 +251,16 @@ private void registerJobOperator(BeanDefinitionRegistry registry, EnableBatchPro
186251 beanDefinitionBuilder .addPropertyReference (JOB_REGISTRY , JOB_REGISTRY );
187252
188253 // set optional properties
254+ String taskExecutorRef = batchAnnotation .taskExecutorRef ();
255+ if (registry .containsBeanDefinition (taskExecutorRef )) {
256+ beanDefinitionBuilder .addPropertyReference ("taskExecutor" , taskExecutorRef );
257+ }
189258 String jobParametersConverterRef = batchAnnotation .jobParametersConverterRef ();
190259 if (registry .containsBeanDefinition (jobParametersConverterRef )) {
191260 beanDefinitionBuilder .addPropertyReference ("jobParametersConverter" , jobParametersConverterRef );
192261 }
193262
194- registry .registerBeanDefinition ("jobOperator" , beanDefinitionBuilder .getBeanDefinition ());
263+ registry .registerBeanDefinition (JOB_OPERATOR , beanDefinitionBuilder .getBeanDefinition ());
195264 }
196265
197266 private void registerAutomaticJobRegistrar (BeanDefinitionRegistry registry , EnableBatchProcessing batchAnnotation ) {
0 commit comments