From 40b4be3c14f44420dd23adb3fb93fd1a6a2f5317 Mon Sep 17 00:00:00 2001 From: Mahmoud Ben Hassine Date: Wed, 21 Sep 2022 02:49:09 +0200 Subject: [PATCH] Add transaction support in JobExplorerFactoryBean This commit adds support to create a transactional proxy around the JobExplorer created by the JobExplorerFactoryBean. Resolves #1307 --- .../annotation/BatchRegistrar.java | 3 + .../support/DefaultBatchConfiguration.java | 1 + .../AbstractJobExplorerFactoryBean.java | 68 ++++++++++++++++++- .../support/JobExplorerFactoryBean.java | 10 +-- .../support/JobExplorerFactoryBeanTests.java | 14 ++++ .../SimpleJobExplorerIntegrationTests.java | 1 + .../batch/core/job/SimpleJobTests.java | 1 + .../batch/core/job/flow/FlowJobTests.java | 4 +- .../RemoteStepExecutionAggregatorTests.java | 4 +- .../JobRegistryIntegrationTests-context.xml | 1 + ...andlerWithStepScopeParserTests-context.xml | 1 + .../xml/RepositoryJobParserTests-context.xml | 1 + .../OptimisticLockingFailureTests-context.xml | 1 + .../item/ScriptItemProcessorTests-context.xml | 1 + .../resources/simple-job-launcher-context.xml | 2 +- ...emoteChunkStepIntegrationTests-context.xml | 1 + .../resources/simple-job-launcher-context.xml | 1 + .../resources/adhoc-job-launcher-context.xml | 6 +- .../resources/simple-job-launcher-context.xml | 2 +- .../skipSample-job-launcher-context.xml | 2 +- 20 files changed, 105 insertions(+), 20 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/annotation/BatchRegistrar.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/annotation/BatchRegistrar.java index 419477c58..6176119c9 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/annotation/BatchRegistrar.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/annotation/BatchRegistrar.java @@ -136,6 +136,9 @@ class BatchRegistrar implements ImportBeanDefinitionRegistrar { String dataSourceRef = batchAnnotation.dataSourceRef(); beanDefinitionBuilder.addPropertyReference("dataSource", dataSourceRef); + String transactionManagerRef = batchAnnotation.transactionManagerRef(); + beanDefinitionBuilder.addPropertyReference("transactionManager", transactionManagerRef); + // set optional properties String executionContextSerializerRef = batchAnnotation.executionContextSerializerRef(); if (registry.containsBeanDefinition(executionContextSerializerRef)) { diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/support/DefaultBatchConfiguration.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/support/DefaultBatchConfiguration.java index d8c64e724..bafe56a48 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/support/DefaultBatchConfiguration.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/support/DefaultBatchConfiguration.java @@ -157,6 +157,7 @@ public class DefaultBatchConfiguration implements ApplicationContextAware { public JobExplorer jobExplorer() throws BatchConfigurationException { JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean(); jobExplorerFactoryBean.setDataSource(getDataSource()); + jobExplorerFactoryBean.setTransactionManager(getTransactionManager()); jobExplorerFactoryBean.setJdbcOperations(getJdbcOperations()); jobExplorerFactoryBean.setCharset(getCharset()); jobExplorerFactoryBean.setTablePrefix(getTablePrefix()); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/AbstractJobExplorerFactoryBean.java b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/AbstractJobExplorerFactoryBean.java index 5d99a7179..7022e05ce 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/AbstractJobExplorerFactoryBean.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/explore/support/AbstractJobExplorerFactoryBean.java @@ -16,12 +16,23 @@ package org.springframework.batch.core.explore.support; +import java.util.Properties; + +import org.springframework.aop.framework.ProxyFactory; import org.springframework.batch.core.explore.JobExplorer; import org.springframework.batch.core.repository.dao.ExecutionContextDao; import org.springframework.batch.core.repository.dao.JobExecutionDao; import org.springframework.batch.core.repository.dao.JobInstanceDao; import org.springframework.batch.core.repository.dao.StepExecutionDao; import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionManager; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource; +import org.springframework.transaction.interceptor.TransactionInterceptor; +import org.springframework.util.Assert; /** * A {@link FactoryBean} that automates the creation of a {@link SimpleJobExplorer}. It @@ -32,7 +43,15 @@ import org.springframework.beans.factory.FactoryBean; * @author Mahmoud Ben Hassine * @since 2.0 */ -public abstract class AbstractJobExplorerFactoryBean implements FactoryBean { +public abstract class AbstractJobExplorerFactoryBean implements FactoryBean, InitializingBean { + + private static final String TRANSACTION_ISOLATION_LEVEL_PREFIX = "ISOLATION_"; + + private static final String TRANSACTION_PROPAGATION_PREFIX = "PROPAGATION_"; + + private PlatformTransactionManager transactionManager; + + private ProxyFactory proxyFactory = new ProxyFactory(); /** * Creates a job instance data access object (DAO). @@ -62,6 +81,30 @@ public abstract class AbstractJobExplorerFactoryBean implements FactoryBean + diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/InlineItemHandlerWithStepScopeParserTests-context.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/InlineItemHandlerWithStepScopeParserTests-context.xml index bcbbbcb9a..102f232f2 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/InlineItemHandlerWithStepScopeParserTests-context.xml +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/InlineItemHandlerWithStepScopeParserTests-context.xml @@ -21,6 +21,7 @@ + diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/RepositoryJobParserTests-context.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/RepositoryJobParserTests-context.xml index 8452fd89d..0aae9eb98 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/RepositoryJobParserTests-context.xml +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/RepositoryJobParserTests-context.xml @@ -21,6 +21,7 @@ + diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/OptimisticLockingFailureTests-context.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/OptimisticLockingFailureTests-context.xml index 68df17976..07a2eb0c7 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/OptimisticLockingFailureTests-context.xml +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/repository/dao/OptimisticLockingFailureTests-context.xml @@ -50,6 +50,7 @@ + diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/step/item/ScriptItemProcessorTests-context.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/step/item/ScriptItemProcessorTests-context.xml index d21ca0cd8..81c9afb18 100644 --- a/spring-batch-core/src/test/resources/org/springframework/batch/core/step/item/ScriptItemProcessorTests-context.xml +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/step/item/ScriptItemProcessorTests-context.xml @@ -30,6 +30,7 @@ + + p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager" /> diff --git a/spring-batch-integration/src/test/resources/org/springframework/batch/integration/chunk/RemoteChunkStepIntegrationTests-context.xml b/spring-batch-integration/src/test/resources/org/springframework/batch/integration/chunk/RemoteChunkStepIntegrationTests-context.xml index 79d1ce37f..147fe1452 100644 --- a/spring-batch-integration/src/test/resources/org/springframework/batch/integration/chunk/RemoteChunkStepIntegrationTests-context.xml +++ b/spring-batch-integration/src/test/resources/org/springframework/batch/integration/chunk/RemoteChunkStepIntegrationTests-context.xml @@ -76,6 +76,7 @@ + diff --git a/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml b/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml index d6e9ee27d..a986354e4 100644 --- a/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml +++ b/spring-batch-integration/src/test/resources/simple-job-launcher-context.xml @@ -23,6 +23,7 @@ + diff --git a/spring-batch-samples/src/main/resources/adhoc-job-launcher-context.xml b/spring-batch-samples/src/main/resources/adhoc-job-launcher-context.xml index ed8d3e454..6f4b148ff 100644 --- a/spring-batch-samples/src/main/resources/adhoc-job-launcher-context.xml +++ b/spring-batch-samples/src/main/resources/adhoc-job-launcher-context.xml @@ -33,11 +33,7 @@ - - - - - + diff --git a/spring-batch-samples/src/main/resources/simple-job-launcher-context.xml b/spring-batch-samples/src/main/resources/simple-job-launcher-context.xml index bbf14928f..7995dae4a 100644 --- a/spring-batch-samples/src/main/resources/simple-job-launcher-context.xml +++ b/spring-batch-samples/src/main/resources/simple-job-launcher-context.xml @@ -27,7 +27,7 @@ + p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager"/> diff --git a/spring-batch-samples/src/main/resources/skipSample-job-launcher-context.xml b/spring-batch-samples/src/main/resources/skipSample-job-launcher-context.xml index 0840a9262..e82c0ee36 100644 --- a/spring-batch-samples/src/main/resources/skipSample-job-launcher-context.xml +++ b/spring-batch-samples/src/main/resources/skipSample-job-launcher-context.xml @@ -18,7 +18,7 @@ p:jobExplorer-ref="jobExplorer" p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry" /> + p:dataSource-ref="dataSource" p:transactionManager-ref="transactionManager"/>