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 56c6870

Browse files
Make transaction manager optional in JobOperatorFactoryBean
Resolves #4970
1 parent 952f756 commit 56c6870

File tree

3 files changed

+34
-12
lines changed

3 files changed

+34
-12
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,13 +226,15 @@ private void registerJobOperator(BeanDefinitionRegistry registry, EnableBatchPro
226226
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder
227227
.genericBeanDefinition(JobOperatorFactoryBean.class);
228228
// set mandatory properties
229-
String transactionManagerRef = batchAnnotation.transactionManagerRef();
230-
beanDefinitionBuilder.addPropertyReference("transactionManager", transactionManagerRef);
231-
232229
beanDefinitionBuilder.addPropertyReference(JOB_REPOSITORY, JOB_REPOSITORY);
233230
beanDefinitionBuilder.addPropertyReference(JOB_REGISTRY, JOB_REGISTRY);
234231

235232
// set optional properties
233+
String transactionManagerRef = batchAnnotation.transactionManagerRef();
234+
if (registry.containsBeanDefinition(transactionManagerRef)) {
235+
beanDefinitionBuilder.addPropertyReference("transactionManager", transactionManagerRef);
236+
}
237+
236238
String taskExecutorRef = batchAnnotation.taskExecutorRef();
237239
if (registry.containsBeanDefinition(taskExecutorRef)) {
238240
beanDefinitionBuilder.addPropertyReference("taskExecutor", taskExecutorRef);

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.batch.core.job.JobExecution;
2929
import org.springframework.batch.core.launch.JobOperator;
3030
import org.springframework.batch.core.repository.JobRepository;
31+
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
3132
import org.springframework.beans.factory.FactoryBean;
3233
import org.springframework.beans.factory.InitializingBean;
3334
import org.springframework.core.task.SyncTaskExecutor;
@@ -73,7 +74,10 @@ public class JobOperatorFactoryBean implements FactoryBean<JobOperator>, Initial
7374
public void afterPropertiesSet() throws Exception {
7475
Assert.notNull(this.jobRepository, "JobRepository must not be null");
7576
Assert.notNull(this.jobRegistry, "JobRegistry must not be null");
76-
Assert.notNull(this.transactionManager, "TransactionManager must not be null");
77+
if (this.transactionManager == null) {
78+
this.transactionManager = new ResourcelessTransactionManager();
79+
logger.info("No transaction manager has been set, defaulting to ResourcelessTransactionManager.");
80+
}
7781
if (this.taskExecutor == null) {
7882
logger.info("No TaskExecutor has been set, defaulting to synchronous executor.");
7983
this.taskExecutor = new SyncTaskExecutor();

‎spring-batch-core/src/test/java/org/springframework/batch/core/launch/support/JobOperatorFactoryBeanTests.java‎

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

18+
import org.jetbrains.annotations.NotNull;
1819
import org.junit.jupiter.api.Assertions;
1920
import org.junit.jupiter.api.Test;
2021
import org.mockito.Mockito;
@@ -25,6 +26,7 @@
2526
import org.springframework.batch.core.converter.JobParametersConverter;
2627
import org.springframework.batch.core.launch.JobOperator;
2728
import org.springframework.batch.core.repository.JobRepository;
29+
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
2830
import org.springframework.test.util.AopTestUtils;
2931
import org.springframework.transaction.PlatformTransactionManager;
3032
import org.springframework.transaction.interceptor.TransactionAttributeSource;
@@ -65,6 +67,26 @@ public void testJobOperatorCreation() throws Exception {
6567
Assertions.assertEquals(this.transactionManager, getTransactionManagerSetOnJobOperator(jobOperator));
6668
}
6769

70+
@Test
71+
public void testDefaultTransactionManagerConfiguration() throws Exception {
72+
// given
73+
JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
74+
jobOperatorFactoryBean.setJobRegistry(this.jobRegistry);
75+
jobOperatorFactoryBean.setJobRepository(this.jobRepository);
76+
jobOperatorFactoryBean.setJobParametersConverter(this.jobParametersConverter);
77+
jobOperatorFactoryBean.afterPropertiesSet();
78+
79+
// when
80+
JobOperator jobOperator = jobOperatorFactoryBean.getObject();
81+
82+
// then
83+
Assertions.assertNotNull(jobOperator);
84+
Object targetObject = AopTestUtils.getTargetObject(jobOperator);
85+
Assertions.assertInstanceOf(TaskExecutorJobOperator.class, targetObject);
86+
Assertions.assertInstanceOf(ResourcelessTransactionManager.class,
87+
getTransactionManagerSetOnJobOperator(jobOperator));
88+
}
89+
6890
@Test
6991
public void testCustomTransactionAttributesSource() throws Exception {
7092
// given
@@ -87,10 +109,7 @@ public void testCustomTransactionAttributesSource() throws Exception {
87109
}
88110

89111
private PlatformTransactionManager getTransactionManagerSetOnJobOperator(JobOperator jobOperator) {
90-
Advised target = (Advised) jobOperator; // proxy created by
91-
// AbstractJobOperatorFactoryBean
92-
Advisor[] advisors = target.getAdvisors();
93-
for (Advisor advisor : advisors) {
112+
for (Advisor advisor : ((Advised) jobOperator).getAdvisors()) {
94113
if (advisor.getAdvice() instanceof TransactionInterceptor transactionInterceptor) {
95114
return (PlatformTransactionManager) transactionInterceptor.getTransactionManager();
96115
}
@@ -99,10 +118,7 @@ private PlatformTransactionManager getTransactionManagerSetOnJobOperator(JobOper
99118
}
100119

101120
private TransactionAttributeSource getTransactionAttributesSourceSetOnJobOperator(JobOperator jobOperator) {
102-
Advised target = (Advised) jobOperator; // proxy created by
103-
// AbstractJobOperatorFactoryBean
104-
Advisor[] advisors = target.getAdvisors();
105-
for (Advisor advisor : advisors) {
121+
for (Advisor advisor : ((Advised) jobOperator).getAdvisors()) {
106122
if (advisor.getAdvice() instanceof TransactionInterceptor transactionInterceptor) {
107123
return transactionInterceptor.getTransactionAttributeSource();
108124
}

0 commit comments

Comments
(0)

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