Skip to content

Commit 80eee6b

Browse files
kazuki43zoophilwebb
authored andcommitted
Support spring transaction manager properties
Add Spring TransactionManager properties to allow timeout and rollback settings to be configured. See gh-7561
1 parent 30ea133 commit 80eee6b

15 files changed

+275
-26
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BasicBatchConfigurer.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
3131
import org.springframework.batch.core.repository.JobRepository;
3232
import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean;
33+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
3334
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
3435
import org.springframework.orm.jpa.JpaTransactionManager;
3536
import org.springframework.transaction.PlatformTransactionManager;
@@ -40,13 +41,16 @@
4041
*
4142
* @author Dave Syer
4243
* @author Andy Wilkinson
44+
* @author Kazuki Shimizu
4345
*/
4446
public class BasicBatchConfigurer implements BatchConfigurer {
4547

4648
private static final Log logger = LogFactory.getLog(BasicBatchConfigurer.class);
4749

4850
private final BatchProperties properties;
4951

52+
private final TransactionProperties transactionProperties;
53+
5054
private final DataSource dataSource;
5155

5256
private final EntityManagerFactory entityManagerFactory;
@@ -62,21 +66,24 @@ public class BasicBatchConfigurer implements BatchConfigurer {
6266
/**
6367
* Create a new {@link BasicBatchConfigurer} instance.
6468
* @param properties the batch properties
69+
* @param transactionProperties the transaction properties
6570
* @param dataSource the underlying data source
6671
*/
67-
protected BasicBatchConfigurer(BatchProperties properties, DataSource dataSource) {
68-
this(properties, dataSource, null);
72+
protected BasicBatchConfigurer(BatchProperties properties, TransactionProperties transactionProperties, DataSource dataSource) {
73+
this(properties, transactionProperties, dataSource, null);
6974
}
7075

7176
/**
7277
* Create a new {@link BasicBatchConfigurer} instance.
7378
* @param properties the batch properties
79+
* @param transactionProperties the transaction properties
7480
* @param dataSource the underlying data source
7581
* @param entityManagerFactory the entity manager factory (or {@code null})
7682
*/
77-
protected BasicBatchConfigurer(BatchProperties properties, DataSource dataSource,
83+
protected BasicBatchConfigurer(BatchProperties properties, TransactionProperties transactionProperties, DataSource dataSource,
7884
EntityManagerFactory entityManagerFactory) {
7985
this.properties = properties;
86+
this.transactionProperties = transactionProperties;
8087
this.entityManagerFactory = entityManagerFactory;
8188
this.dataSource = dataSource;
8289
}
@@ -150,10 +157,15 @@ protected JobRepository createJobRepository() throws Exception {
150157
}
151158

152159
protected PlatformTransactionManager createTransactionManager() {
160+
PlatformTransactionManager txManager;
153161
if (this.entityManagerFactory != null) {
154-
return new JpaTransactionManager(this.entityManagerFactory);
162+
txManager = new JpaTransactionManager(this.entityManagerFactory);
163+
}
164+
else {
165+
txManager = new DataSourceTransactionManager(this.dataSource);
155166
}
156-
return new DataSourceTransactionManager(this.dataSource);
167+
this.transactionProperties.applyTo(txManager);
168+
return txManager;
157169
}
158170

159171
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/batch/BatchAutoConfiguration.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,13 @@
3737
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3838
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3939
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
40+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
4041
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4142
import org.springframework.context.annotation.Bean;
4243
import org.springframework.context.annotation.Configuration;
4344
import org.springframework.core.io.ResourceLoader;
4445
import org.springframework.jdbc.core.JdbcOperations;
46+
import org.springframework.transaction.PlatformTransactionManager;
4547
import org.springframework.util.StringUtils;
4648

4749
/**
@@ -57,6 +59,7 @@
5759
*
5860
* @author Dave Syer
5961
* @author Eddú Meléndez
62+
* @author Kazuki Shimizu
6063
*/
6164
@Configuration
6265
@ConditionalOnClass({ JobLauncher.class, DataSource.class, JdbcOperations.class })
@@ -133,15 +136,18 @@ public SimpleJobOperator jobOperator(JobExplorer jobExplorer, JobLauncher jobLau
133136
return factory;
134137
}
135138

136-
@ConditionalOnClass(name = "javax.persistence.EntityManagerFactory")
139+
@EnableConfigurationProperties({BatchProperties.class, TransactionProperties.class})
140+
@ConditionalOnClass(value = PlatformTransactionManager.class, name = "javax.persistence.EntityManagerFactory")
137141
@ConditionalOnMissingBean(BatchConfigurer.class)
138142
@Configuration
139143
protected static class JpaBatchConfiguration {
140144

141145
private final BatchProperties properties;
146+
private final TransactionProperties transactionProperties;
142147

143-
protected JpaBatchConfiguration(BatchProperties properties) {
148+
protected JpaBatchConfiguration(BatchProperties properties, TransactionProperties transactionProperties) {
144149
this.properties = properties;
150+
this.transactionProperties = transactionProperties;
145151
}
146152

147153
// The EntityManagerFactory may not be discoverable by type when this condition
@@ -151,14 +157,14 @@ protected JpaBatchConfiguration(BatchProperties properties) {
151157
@ConditionalOnBean(name = "entityManagerFactory")
152158
public BasicBatchConfigurer jpaBatchConfigurer(DataSource dataSource,
153159
EntityManagerFactory entityManagerFactory) {
154-
return new BasicBatchConfigurer(this.properties, dataSource,
160+
return new BasicBatchConfigurer(this.properties, this.transactionProperties, dataSource,
155161
entityManagerFactory);
156162
}
157163

158164
@Bean
159165
@ConditionalOnMissingBean(name = "entityManagerFactory")
160166
public BasicBatchConfigurer basicBatchConfigurer(DataSource dataSource) {
161-
return new BasicBatchConfigurer(this.properties, dataSource);
167+
return new BasicBatchConfigurer(this.properties, this.transactionProperties, dataSource);
162168
}
163169

164170
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
3131
import org.springframework.boot.autoconfigure.domain.EntityScanPackages;
32+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
3233
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3334
import org.springframework.context.ApplicationContext;
3435
import org.springframework.context.annotation.Bean;
@@ -48,12 +49,13 @@
4849
* @author Josh Long
4950
* @author Vince Bickers
5051
* @author Stephane Nicoll
52+
* @author Kazuki Shimizu
5153
* @since 1.4.0
5254
*/
5355
@Configuration
54-
@ConditionalOnClass(SessionFactory.class)
56+
@ConditionalOnClass({SessionFactory.class, PlatformTransactionManager.class})
5557
@ConditionalOnMissingBean(SessionFactory.class)
56-
@EnableConfigurationProperties(Neo4jProperties.class)
58+
@EnableConfigurationProperties({Neo4jProperties.class, TransactionProperties.class})
5759
@SuppressWarnings("deprecation")
5860
public class Neo4jDataAutoConfiguration {
5961

@@ -87,8 +89,11 @@ public Neo4jTemplate neo4jTemplate(SessionFactory sessionFactory) {
8789

8890
@Bean
8991
@ConditionalOnMissingBean(PlatformTransactionManager.class)
90-
public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory) {
91-
return new Neo4jTransactionManager(sessionFactory);
92+
public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory,
93+
TransactionProperties transactionProperties) {
94+
Neo4jTransactionManager transactionManager = new Neo4jTransactionManager(sessionFactory);
95+
transactionProperties.applyTo(transactionManager);
96+
return transactionManager;
9297
}
9398

9499
private String[] getPackagesToScan(ApplicationContext applicationContext) {

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
26+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
27+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2628
import org.springframework.context.annotation.Bean;
2729
import org.springframework.context.annotation.Configuration;
2830
import org.springframework.core.Ordered;
@@ -39,6 +41,7 @@
3941
* @author Dave Syer
4042
* @author Stephane Nicoll
4143
* @author Andy Wilkinson
44+
* @author Kazuki Shimizu
4245
*/
4346
@Configuration
4447
@ConditionalOnClass({ JdbcTemplate.class, PlatformTransactionManager.class })
@@ -47,6 +50,7 @@ public class DataSourceTransactionManagerAutoConfiguration {
4750

4851
@Configuration
4952
@ConditionalOnSingleCandidate(DataSource.class)
53+
@EnableConfigurationProperties(TransactionProperties.class)
5054
static class DataSourceTransactionManagerConfiguration {
5155

5256
private final DataSource dataSource;
@@ -57,8 +61,10 @@ static class DataSourceTransactionManagerConfiguration {
5761

5862
@Bean
5963
@ConditionalOnMissingBean(PlatformTransactionManager.class)
60-
public DataSourceTransactionManager transactionManager() {
61-
return new DataSourceTransactionManager(this.dataSource);
64+
public DataSourceTransactionManager transactionManager(TransactionProperties transactionProperties) {
65+
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(this.dataSource);
66+
transactionProperties.applyTo(transactionManager);
67+
return transactionManager;
6268
}
6369

6470
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/orm/jpa/JpaBaseConfiguration.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3535
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
3636
import org.springframework.boot.autoconfigure.domain.EntityScanPackages;
37+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
3738
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3839
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
3940
import org.springframework.context.annotation.Bean;
@@ -59,8 +60,9 @@
5960
* @author Dave Syer
6061
* @author Oliver Gierke
6162
* @author Andy Wilkinson
63+
* @author Kazuki Shimizu
6264
*/
63-
@EnableConfigurationProperties(JpaProperties.class)
65+
@EnableConfigurationProperties({JpaProperties.class, TransactionProperties.class})
6466
@Import(DataSourceInitializedPublisher.Registrar.class)
6567
public abstract class JpaBaseConfiguration implements BeanFactoryAware {
6668

@@ -81,8 +83,10 @@ protected JpaBaseConfiguration(DataSource dataSource, JpaProperties properties,
8183

8284
@Bean
8385
@ConditionalOnMissingBean(PlatformTransactionManager.class)
84-
public PlatformTransactionManager transactionManager() {
85-
return new JpaTransactionManager();
86+
public PlatformTransactionManager transactionManager(TransactionProperties transactionProperties) {
87+
JpaTransactionManager transactionManager = new JpaTransactionManager();
88+
transactionProperties.applyTo(transactionManager);
89+
return transactionManager;
8690
}
8791

8892
@Bean
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*
2+
* Copyright 2012-2016 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.transaction;
18+
19+
import org.springframework.boot.context.properties.ConfigurationProperties;
20+
import org.springframework.transaction.PlatformTransactionManager;
21+
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
22+
23+
/**
24+
* External configuration properties for a {@link org.springframework.transaction.PlatformTransactionManager} created by
25+
* Spring. All {@literal spring.transaction.} properties are also applied to the {@code PlatformTransactionManager}.
26+
*
27+
* @author Kazuki Shimizu
28+
* @since 1.5.0
29+
*/
30+
@ConfigurationProperties(prefix = "spring.transaction")
31+
public class TransactionProperties {
32+
33+
/**
34+
* The default transaction timeout (sec).
35+
*/
36+
private Integer defaultTimeout;
37+
38+
/**
39+
* The indicating flag whether perform the rollback processing on commit failure (If perform rollback, set to the true).
40+
*/
41+
private Boolean rollbackOnCommitFailure;
42+
43+
public Integer getDefaultTimeout() {
44+
return this.defaultTimeout;
45+
}
46+
47+
public void setDefaultTimeout(Integer defaultTimeout) {
48+
this.defaultTimeout = defaultTimeout;
49+
}
50+
51+
public Boolean getRollbackOnCommitFailure() {
52+
return this.rollbackOnCommitFailure;
53+
}
54+
55+
public void setRollbackOnCommitFailure(Boolean rollbackOnCommitFailure) {
56+
this.rollbackOnCommitFailure = rollbackOnCommitFailure;
57+
}
58+
59+
/**
60+
* Apply all transaction custom properties to a specified {@link PlatformTransactionManager} instance.
61+
*
62+
* @param transactionManager the target transaction manager
63+
* @see AbstractPlatformTransactionManager#setDefaultTimeout(int)
64+
* @see AbstractPlatformTransactionManager#setRollbackOnCommitFailure(boolean)
65+
*/
66+
public void applyTo(PlatformTransactionManager transactionManager) {
67+
if (transactionManager instanceof AbstractPlatformTransactionManager) {
68+
AbstractPlatformTransactionManager abstractPlatformTransactionManager =
69+
(AbstractPlatformTransactionManager) transactionManager;
70+
if (this.defaultTimeout != null) {
71+
abstractPlatformTransactionManager.setDefaultTimeout(this.defaultTimeout);
72+
}
73+
if (this.rollbackOnCommitFailure != null) {
74+
abstractPlatformTransactionManager.setRollbackOnCommitFailure(this.rollbackOnCommitFailure);
75+
}
76+
}
77+
}
78+
79+
}

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/transaction/jta/AtomikosJtaConfiguration.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.boot.ApplicationHome;
3131
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3232
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
33+
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
3334
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3435
import org.springframework.boot.jta.XAConnectionFactoryWrapper;
3536
import org.springframework.boot.jta.XADataSourceWrapper;
@@ -50,18 +51,21 @@
5051
* @author Phillip Webb
5152
* @author Andy Wilkinson
5253
* @author Stephane Nicoll
54+
* @author Kazuki Shimizu
5355
* @since 1.2.0
5456
*/
5557
@Configuration
56-
@EnableConfigurationProperties(AtomikosProperties.class)
58+
@EnableConfigurationProperties({AtomikosProperties.class, JtaProperties.class, TransactionProperties.class})
5759
@ConditionalOnClass({ JtaTransactionManager.class, UserTransactionManager.class })
5860
@ConditionalOnMissingBean(PlatformTransactionManager.class)
5961
class AtomikosJtaConfiguration {
6062

6163
private final JtaProperties jtaProperties;
64+
private final TransactionProperties transactionProperties;
6265

63-
AtomikosJtaConfiguration(JtaProperties jtaProperties) {
66+
AtomikosJtaConfiguration(JtaProperties jtaProperties, TransactionProperties transactionProperties) {
6467
this.jtaProperties = jtaProperties;
68+
this.transactionProperties = transactionProperties;
6569
}
6670

6771
@Bean(initMethod = "init", destroyMethod = "shutdownForce")
@@ -111,7 +115,9 @@ public static AtomikosDependsOnBeanFactoryPostProcessor atomikosDependsOnBeanFac
111115
@Bean
112116
public JtaTransactionManager transactionManager(UserTransaction userTransaction,
113117
TransactionManager transactionManager) {
114-
return new JtaTransactionManager(userTransaction, transactionManager);
118+
JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(userTransaction, transactionManager);
119+
this.transactionProperties.applyTo(jtaTransactionManager);
120+
return jtaTransactionManager;
115121
}
116122

117123
@Configuration

0 commit comments

Comments
 (0)