Support spring transaction manager properties
Add Spring TransactionManager properties to allow timeout and rollback settings to be configured. See gh-7561
This commit is contained in:
		
							parent
							
								
									30ea1338de
								
							
						
					
					
						commit
						80eee6b30f
					
				| 
						 | 
				
			
			@ -30,6 +30,7 @@ import org.springframework.batch.core.launch.JobLauncher;
 | 
			
		|||
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
 | 
			
		||||
import org.springframework.batch.core.repository.JobRepository;
 | 
			
		||||
import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
 | 
			
		||||
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 | 
			
		||||
import org.springframework.orm.jpa.JpaTransactionManager;
 | 
			
		||||
import org.springframework.transaction.PlatformTransactionManager;
 | 
			
		||||
| 
						 | 
				
			
			@ -40,6 +41,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Kazuki Shimizu
 | 
			
		||||
 */
 | 
			
		||||
public class BasicBatchConfigurer implements BatchConfigurer {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -47,6 +49,8 @@ public class BasicBatchConfigurer implements BatchConfigurer {
 | 
			
		|||
 | 
			
		||||
	private final BatchProperties properties;
 | 
			
		||||
 | 
			
		||||
	private final TransactionProperties transactionProperties;
 | 
			
		||||
 | 
			
		||||
	private final DataSource dataSource;
 | 
			
		||||
 | 
			
		||||
	private final EntityManagerFactory entityManagerFactory;
 | 
			
		||||
| 
						 | 
				
			
			@ -62,21 +66,24 @@ public class BasicBatchConfigurer implements BatchConfigurer {
 | 
			
		|||
	/**
 | 
			
		||||
	 * Create a new {@link BasicBatchConfigurer} instance.
 | 
			
		||||
	 * @param properties the batch properties
 | 
			
		||||
	 * @param transactionProperties the transaction properties
 | 
			
		||||
	 * @param dataSource the underlying data source
 | 
			
		||||
	 */
 | 
			
		||||
	protected BasicBatchConfigurer(BatchProperties properties, DataSource dataSource) {
 | 
			
		||||
		this(properties, dataSource, null);
 | 
			
		||||
	protected BasicBatchConfigurer(BatchProperties properties, TransactionProperties transactionProperties, DataSource dataSource) {
 | 
			
		||||
		this(properties, transactionProperties, dataSource, null);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Create a new {@link BasicBatchConfigurer} instance.
 | 
			
		||||
	 * @param properties the batch properties
 | 
			
		||||
	 * @param transactionProperties the transaction properties
 | 
			
		||||
	 * @param dataSource the underlying data source
 | 
			
		||||
	 * @param entityManagerFactory the entity manager factory (or {@code null})
 | 
			
		||||
	 */
 | 
			
		||||
	protected BasicBatchConfigurer(BatchProperties properties, DataSource dataSource,
 | 
			
		||||
	protected BasicBatchConfigurer(BatchProperties properties, TransactionProperties transactionProperties, DataSource dataSource,
 | 
			
		||||
			EntityManagerFactory entityManagerFactory) {
 | 
			
		||||
		this.properties = properties;
 | 
			
		||||
		this.transactionProperties = transactionProperties;
 | 
			
		||||
		this.entityManagerFactory = entityManagerFactory;
 | 
			
		||||
		this.dataSource = dataSource;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -150,10 +157,15 @@ public class BasicBatchConfigurer implements BatchConfigurer {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	protected PlatformTransactionManager createTransactionManager() {
 | 
			
		||||
		PlatformTransactionManager txManager;
 | 
			
		||||
		if (this.entityManagerFactory != null) {
 | 
			
		||||
			return new JpaTransactionManager(this.entityManagerFactory);
 | 
			
		||||
			txManager = new JpaTransactionManager(this.entityManagerFactory);
 | 
			
		||||
		}
 | 
			
		||||
		return new DataSourceTransactionManager(this.dataSource);
 | 
			
		||||
		else {
 | 
			
		||||
			txManager = new DataSourceTransactionManager(this.dataSource);
 | 
			
		||||
		}
 | 
			
		||||
		this.transactionProperties.applyTo(txManager);
 | 
			
		||||
		return txManager;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,11 +37,13 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
 | 
			
		||||
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.core.io.ResourceLoader;
 | 
			
		||||
import org.springframework.jdbc.core.JdbcOperations;
 | 
			
		||||
import org.springframework.transaction.PlatformTransactionManager;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			@ -57,6 +59,7 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Dave Syer
 | 
			
		||||
 * @author Eddú Meléndez
 | 
			
		||||
 * @author Kazuki Shimizu
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@ConditionalOnClass({ JobLauncher.class, DataSource.class, JdbcOperations.class })
 | 
			
		||||
| 
						 | 
				
			
			@ -133,15 +136,18 @@ public class BatchAutoConfiguration {
 | 
			
		|||
		return factory;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@ConditionalOnClass(name = "javax.persistence.EntityManagerFactory")
 | 
			
		||||
	@EnableConfigurationProperties({BatchProperties.class, TransactionProperties.class})
 | 
			
		||||
	@ConditionalOnClass(value = PlatformTransactionManager.class, name = "javax.persistence.EntityManagerFactory")
 | 
			
		||||
	@ConditionalOnMissingBean(BatchConfigurer.class)
 | 
			
		||||
	@Configuration
 | 
			
		||||
	protected static class JpaBatchConfiguration {
 | 
			
		||||
 | 
			
		||||
		private final BatchProperties properties;
 | 
			
		||||
		private final TransactionProperties transactionProperties;
 | 
			
		||||
 | 
			
		||||
		protected JpaBatchConfiguration(BatchProperties properties) {
 | 
			
		||||
		protected JpaBatchConfiguration(BatchProperties properties, TransactionProperties transactionProperties) {
 | 
			
		||||
			this.properties = properties;
 | 
			
		||||
			this.transactionProperties = transactionProperties;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// The EntityManagerFactory may not be discoverable by type when this condition
 | 
			
		||||
| 
						 | 
				
			
			@ -151,14 +157,14 @@ public class BatchAutoConfiguration {
 | 
			
		|||
		@ConditionalOnBean(name = "entityManagerFactory")
 | 
			
		||||
		public BasicBatchConfigurer jpaBatchConfigurer(DataSource dataSource,
 | 
			
		||||
				EntityManagerFactory entityManagerFactory) {
 | 
			
		||||
			return new BasicBatchConfigurer(this.properties, dataSource,
 | 
			
		||||
			return new BasicBatchConfigurer(this.properties, this.transactionProperties, dataSource,
 | 
			
		||||
					entityManagerFactory);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		@Bean
 | 
			
		||||
		@ConditionalOnMissingBean(name = "entityManagerFactory")
 | 
			
		||||
		public BasicBatchConfigurer basicBatchConfigurer(DataSource dataSource) {
 | 
			
		||||
			return new BasicBatchConfigurer(this.properties, dataSource);
 | 
			
		||||
			return new BasicBatchConfigurer(this.properties, this.transactionProperties, dataSource);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,6 +29,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
 | 
			
		||||
import org.springframework.boot.autoconfigure.domain.EntityScanPackages;
 | 
			
		||||
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.context.ApplicationContext;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
| 
						 | 
				
			
			@ -48,12 +49,13 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
 | 
			
		|||
 * @author Josh Long
 | 
			
		||||
 * @author Vince Bickers
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Kazuki Shimizu
 | 
			
		||||
 * @since 1.4.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@ConditionalOnClass(SessionFactory.class)
 | 
			
		||||
@ConditionalOnClass({SessionFactory.class, PlatformTransactionManager.class})
 | 
			
		||||
@ConditionalOnMissingBean(SessionFactory.class)
 | 
			
		||||
@EnableConfigurationProperties(Neo4jProperties.class)
 | 
			
		||||
@EnableConfigurationProperties({Neo4jProperties.class, TransactionProperties.class})
 | 
			
		||||
@SuppressWarnings("deprecation")
 | 
			
		||||
public class Neo4jDataAutoConfiguration {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -87,8 +89,11 @@ public class Neo4jDataAutoConfiguration {
 | 
			
		|||
 | 
			
		||||
	@Bean
 | 
			
		||||
	@ConditionalOnMissingBean(PlatformTransactionManager.class)
 | 
			
		||||
	public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory) {
 | 
			
		||||
		return new Neo4jTransactionManager(sessionFactory);
 | 
			
		||||
	public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory,
 | 
			
		||||
			TransactionProperties transactionProperties) {
 | 
			
		||||
		Neo4jTransactionManager transactionManager = new Neo4jTransactionManager(sessionFactory);
 | 
			
		||||
		transactionProperties.applyTo(transactionManager);
 | 
			
		||||
		return transactionManager;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private String[] getPackagesToScan(ApplicationContext applicationContext) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,6 +23,8 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
 | 
			
		||||
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.core.Ordered;
 | 
			
		||||
| 
						 | 
				
			
			@ -39,6 +41,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
 | 
			
		|||
 * @author Dave Syer
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Kazuki Shimizu
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@ConditionalOnClass({ JdbcTemplate.class, PlatformTransactionManager.class })
 | 
			
		||||
| 
						 | 
				
			
			@ -47,6 +50,7 @@ public class DataSourceTransactionManagerAutoConfiguration {
 | 
			
		|||
 | 
			
		||||
	@Configuration
 | 
			
		||||
	@ConditionalOnSingleCandidate(DataSource.class)
 | 
			
		||||
	@EnableConfigurationProperties(TransactionProperties.class)
 | 
			
		||||
	static class DataSourceTransactionManagerConfiguration {
 | 
			
		||||
 | 
			
		||||
		private final DataSource dataSource;
 | 
			
		||||
| 
						 | 
				
			
			@ -57,8 +61,10 @@ public class DataSourceTransactionManagerAutoConfiguration {
 | 
			
		|||
 | 
			
		||||
		@Bean
 | 
			
		||||
		@ConditionalOnMissingBean(PlatformTransactionManager.class)
 | 
			
		||||
		public DataSourceTransactionManager transactionManager() {
 | 
			
		||||
			return new DataSourceTransactionManager(this.dataSource);
 | 
			
		||||
		public DataSourceTransactionManager transactionManager(TransactionProperties transactionProperties) {
 | 
			
		||||
			DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(this.dataSource);
 | 
			
		||||
			transactionProperties.applyTo(transactionManager);
 | 
			
		||||
			return transactionManager;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
 | 
			
		||||
import org.springframework.boot.autoconfigure.domain.EntityScanPackages;
 | 
			
		||||
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
| 
						 | 
				
			
			@ -59,8 +60,9 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
 | 
			
		|||
 * @author Dave Syer
 | 
			
		||||
 * @author Oliver Gierke
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Kazuki Shimizu
 | 
			
		||||
 */
 | 
			
		||||
@EnableConfigurationProperties(JpaProperties.class)
 | 
			
		||||
@EnableConfigurationProperties({JpaProperties.class, TransactionProperties.class})
 | 
			
		||||
@Import(DataSourceInitializedPublisher.Registrar.class)
 | 
			
		||||
public abstract class JpaBaseConfiguration implements BeanFactoryAware {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -81,8 +83,10 @@ public abstract class JpaBaseConfiguration implements BeanFactoryAware {
 | 
			
		|||
 | 
			
		||||
	@Bean
 | 
			
		||||
	@ConditionalOnMissingBean(PlatformTransactionManager.class)
 | 
			
		||||
	public PlatformTransactionManager transactionManager() {
 | 
			
		||||
		return new JpaTransactionManager();
 | 
			
		||||
	public PlatformTransactionManager transactionManager(TransactionProperties transactionProperties) {
 | 
			
		||||
		JpaTransactionManager transactionManager = new JpaTransactionManager();
 | 
			
		||||
		transactionProperties.applyTo(transactionManager);
 | 
			
		||||
		return transactionManager;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Bean
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,79 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright 2012-2016 the original author or authors.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
			
		||||
 * you may not use this file except in compliance with the License.
 | 
			
		||||
 * You may obtain a copy of the License at
 | 
			
		||||
 *
 | 
			
		||||
 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
			
		||||
 *
 | 
			
		||||
 * Unless required by applicable law or agreed to in writing, software
 | 
			
		||||
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
			
		||||
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
 * See the License for the specific language governing permissions and
 | 
			
		||||
 * limitations under the License.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
package org.springframework.boot.autoconfigure.transaction;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.context.properties.ConfigurationProperties;
 | 
			
		||||
import org.springframework.transaction.PlatformTransactionManager;
 | 
			
		||||
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * External configuration properties for a {@link org.springframework.transaction.PlatformTransactionManager} created by
 | 
			
		||||
 * Spring. All {@literal spring.transaction.} properties are also applied to the {@code PlatformTransactionManager}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Kazuki Shimizu
 | 
			
		||||
 * @since 1.5.0
 | 
			
		||||
 */
 | 
			
		||||
@ConfigurationProperties(prefix = "spring.transaction")
 | 
			
		||||
public class TransactionProperties {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The default transaction timeout (sec).
 | 
			
		||||
	 */
 | 
			
		||||
	private Integer defaultTimeout;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The indicating flag whether perform the rollback processing on commit failure (If perform rollback, set to the true).
 | 
			
		||||
	 */
 | 
			
		||||
	private Boolean rollbackOnCommitFailure;
 | 
			
		||||
 | 
			
		||||
	public Integer getDefaultTimeout() {
 | 
			
		||||
		return this.defaultTimeout;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setDefaultTimeout(Integer defaultTimeout) {
 | 
			
		||||
		this.defaultTimeout = defaultTimeout;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public Boolean getRollbackOnCommitFailure() {
 | 
			
		||||
		return this.rollbackOnCommitFailure;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void setRollbackOnCommitFailure(Boolean rollbackOnCommitFailure) {
 | 
			
		||||
		this.rollbackOnCommitFailure = rollbackOnCommitFailure;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Apply all transaction custom properties to a specified {@link PlatformTransactionManager} instance.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param transactionManager the target transaction manager
 | 
			
		||||
	 * @see AbstractPlatformTransactionManager#setDefaultTimeout(int)
 | 
			
		||||
	 * @see AbstractPlatformTransactionManager#setRollbackOnCommitFailure(boolean)
 | 
			
		||||
	 */
 | 
			
		||||
	public void applyTo(PlatformTransactionManager transactionManager) {
 | 
			
		||||
		if (transactionManager instanceof AbstractPlatformTransactionManager) {
 | 
			
		||||
			AbstractPlatformTransactionManager abstractPlatformTransactionManager =
 | 
			
		||||
					(AbstractPlatformTransactionManager) transactionManager;
 | 
			
		||||
			if (this.defaultTimeout != null) {
 | 
			
		||||
				abstractPlatformTransactionManager.setDefaultTimeout(this.defaultTimeout);
 | 
			
		||||
			}
 | 
			
		||||
			if (this.rollbackOnCommitFailure != null) {
 | 
			
		||||
				abstractPlatformTransactionManager.setRollbackOnCommitFailure(this.rollbackOnCommitFailure);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +30,7 @@ import com.atomikos.icatch.jta.UserTransactionManager;
 | 
			
		|||
import org.springframework.boot.ApplicationHome;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.jta.XAConnectionFactoryWrapper;
 | 
			
		||||
import org.springframework.boot.jta.XADataSourceWrapper;
 | 
			
		||||
| 
						 | 
				
			
			@ -50,18 +51,21 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * @author Phillip Webb
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Kazuki Shimizu
 | 
			
		||||
 * @since 1.2.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@EnableConfigurationProperties(AtomikosProperties.class)
 | 
			
		||||
@EnableConfigurationProperties({AtomikosProperties.class, JtaProperties.class, TransactionProperties.class})
 | 
			
		||||
@ConditionalOnClass({ JtaTransactionManager.class, UserTransactionManager.class })
 | 
			
		||||
@ConditionalOnMissingBean(PlatformTransactionManager.class)
 | 
			
		||||
class AtomikosJtaConfiguration {
 | 
			
		||||
 | 
			
		||||
	private final JtaProperties jtaProperties;
 | 
			
		||||
	private final TransactionProperties transactionProperties;
 | 
			
		||||
 | 
			
		||||
	AtomikosJtaConfiguration(JtaProperties jtaProperties) {
 | 
			
		||||
	AtomikosJtaConfiguration(JtaProperties jtaProperties, TransactionProperties transactionProperties) {
 | 
			
		||||
		this.jtaProperties = jtaProperties;
 | 
			
		||||
		this.transactionProperties = transactionProperties;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Bean(initMethod = "init", destroyMethod = "shutdownForce")
 | 
			
		||||
| 
						 | 
				
			
			@ -111,7 +115,9 @@ class AtomikosJtaConfiguration {
 | 
			
		|||
	@Bean
 | 
			
		||||
	public JtaTransactionManager transactionManager(UserTransaction userTransaction,
 | 
			
		||||
			TransactionManager transactionManager) {
 | 
			
		||||
		return new JtaTransactionManager(userTransaction, transactionManager);
 | 
			
		||||
		JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(userTransaction, transactionManager);
 | 
			
		||||
		this.transactionProperties.applyTo(jtaTransactionManager);
 | 
			
		||||
		return jtaTransactionManager;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,9 @@ import bitronix.tm.jndi.BitronixContext;
 | 
			
		|||
import org.springframework.boot.ApplicationHome;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.ConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.jta.XAConnectionFactoryWrapper;
 | 
			
		||||
import org.springframework.boot.jta.XADataSourceWrapper;
 | 
			
		||||
import org.springframework.boot.jta.bitronix.BitronixDependentBeanFactoryPostProcessor;
 | 
			
		||||
| 
						 | 
				
			
			@ -46,17 +48,21 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * @author Josh Long
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Andy Wilkinson
 | 
			
		||||
 * @author Kazuki Shimizu
 | 
			
		||||
 * @since 1.2.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@EnableConfigurationProperties({JtaProperties.class, TransactionProperties.class})
 | 
			
		||||
@ConditionalOnClass({ JtaTransactionManager.class, BitronixContext.class })
 | 
			
		||||
@ConditionalOnMissingBean(PlatformTransactionManager.class)
 | 
			
		||||
class BitronixJtaConfiguration {
 | 
			
		||||
 | 
			
		||||
	private final JtaProperties jtaProperties;
 | 
			
		||||
	private final TransactionProperties transactionProperties;
 | 
			
		||||
 | 
			
		||||
	BitronixJtaConfiguration(JtaProperties jtaProperties) {
 | 
			
		||||
	BitronixJtaConfiguration(JtaProperties jtaProperties, TransactionProperties transactionProperties) {
 | 
			
		||||
		this.jtaProperties = jtaProperties;
 | 
			
		||||
		this.transactionProperties = transactionProperties;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Bean
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +111,9 @@ class BitronixJtaConfiguration {
 | 
			
		|||
	@Bean
 | 
			
		||||
	public JtaTransactionManager transactionManager(
 | 
			
		||||
			TransactionManager transactionManager) {
 | 
			
		||||
		return new JtaTransactionManager(transactionManager);
 | 
			
		||||
		JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(transactionManager);
 | 
			
		||||
		this.transactionProperties.applyTo(jtaTransactionManager);
 | 
			
		||||
		return jtaTransactionManager;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@ConditionalOnClass(Message.class)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,8 @@ package org.springframework.boot.autoconfigure.transaction.jta;
 | 
			
		|||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnJndi;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.transaction.PlatformTransactionManager;
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +32,7 @@ import org.springframework.transaction.jta.JtaTransactionManager;
 | 
			
		|||
 *
 | 
			
		||||
 * @author Phillip Webb
 | 
			
		||||
 * @author Stephane Nicoll
 | 
			
		||||
 * @author Kazuki Shimizu
 | 
			
		||||
 * @since 1.2.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
| 
						 | 
				
			
			@ -38,11 +41,20 @@ import org.springframework.transaction.jta.JtaTransactionManager;
 | 
			
		|||
		"java:comp/TransactionManager", "java:appserver/TransactionManager",
 | 
			
		||||
		"java:pm/TransactionManager", "java:/TransactionManager" })
 | 
			
		||||
@ConditionalOnMissingBean(PlatformTransactionManager.class)
 | 
			
		||||
@EnableConfigurationProperties(TransactionProperties.class)
 | 
			
		||||
class JndiJtaConfiguration {
 | 
			
		||||
 | 
			
		||||
	private final TransactionProperties transactionProperties;
 | 
			
		||||
 | 
			
		||||
	JndiJtaConfiguration(TransactionProperties transactionProperties) {
 | 
			
		||||
		this.transactionProperties = transactionProperties;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Bean
 | 
			
		||||
	public JtaTransactionManager transactionManager() {
 | 
			
		||||
		return new JtaTransactionManagerFactoryBean().getObject();
 | 
			
		||||
		JtaTransactionManager transactionManager = new JtaTransactionManagerFactoryBean().getObject();
 | 
			
		||||
		this.transactionProperties.applyTo(transactionManager);
 | 
			
		||||
		return transactionManager;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,8 @@ import org.jboss.tm.XAResourceRecoveryRegistry;
 | 
			
		|||
import org.springframework.boot.ApplicationHome;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 | 
			
		||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 | 
			
		||||
import org.springframework.boot.autoconfigure.transaction.TransactionProperties;
 | 
			
		||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
 | 
			
		||||
import org.springframework.boot.jta.XAConnectionFactoryWrapper;
 | 
			
		||||
import org.springframework.boot.jta.XADataSourceWrapper;
 | 
			
		||||
import org.springframework.boot.jta.narayana.NarayanaBeanFactoryPostProcessor;
 | 
			
		||||
| 
						 | 
				
			
			@ -47,18 +49,22 @@ import org.springframework.util.StringUtils;
 | 
			
		|||
 * JTA Configuration for <a href="http://narayana.io/">Narayana</a>.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Gytis Trikleris
 | 
			
		||||
 * @author Kazuki Shimizu
 | 
			
		||||
 * @since 1.4.0
 | 
			
		||||
 */
 | 
			
		||||
@Configuration
 | 
			
		||||
@ConditionalOnClass({ JtaTransactionManager.class,
 | 
			
		||||
		com.arjuna.ats.jta.UserTransaction.class, XAResourceRecoveryRegistry.class })
 | 
			
		||||
@ConditionalOnMissingBean(PlatformTransactionManager.class)
 | 
			
		||||
@EnableConfigurationProperties({JtaProperties.class, TransactionProperties.class})
 | 
			
		||||
public class NarayanaJtaConfiguration {
 | 
			
		||||
 | 
			
		||||
	private final JtaProperties jtaProperties;
 | 
			
		||||
	private final TransactionProperties transactionProperties;
 | 
			
		||||
 | 
			
		||||
	public NarayanaJtaConfiguration(JtaProperties jtaProperties) {
 | 
			
		||||
	public NarayanaJtaConfiguration(JtaProperties jtaProperties, TransactionProperties transactionProperties) {
 | 
			
		||||
		this.jtaProperties = jtaProperties;
 | 
			
		||||
		this.transactionProperties = transactionProperties;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Bean
 | 
			
		||||
| 
						 | 
				
			
			@ -116,7 +122,9 @@ public class NarayanaJtaConfiguration {
 | 
			
		|||
	@Bean
 | 
			
		||||
	public JtaTransactionManager transactionManager(UserTransaction userTransaction,
 | 
			
		||||
			TransactionManager transactionManager) {
 | 
			
		||||
		return new JtaTransactionManager(userTransaction, transactionManager);
 | 
			
		||||
		JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(userTransaction, transactionManager);
 | 
			
		||||
		this.transactionProperties.applyTo(jtaTransactionManager);
 | 
			
		||||
		return jtaTransactionManager;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Bean
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,6 +58,8 @@ import org.springframework.context.annotation.Bean;
 | 
			
		|||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.jdbc.BadSqlGrammarException;
 | 
			
		||||
import org.springframework.jdbc.core.JdbcTemplate;
 | 
			
		||||
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
 | 
			
		||||
import org.springframework.orm.jpa.JpaTransactionManager;
 | 
			
		||||
import org.springframework.transaction.PlatformTransactionManager;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
| 
						 | 
				
			
			@ -267,6 +269,42 @@ public class BatchAutoConfigurationTests {
 | 
			
		|||
				.queryForList("select * from BATCH_JOB_EXECUTION");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testCustomizeJpaTransactionManagerUsingProperties() throws Exception {
 | 
			
		||||
		this.context = new AnnotationConfigApplicationContext();
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.transaction.default-timeout:30",
 | 
			
		||||
				"spring.transaction.rollback-on-commit-failure:true");
 | 
			
		||||
		this.context.register(TestConfiguration.class,
 | 
			
		||||
				EmbeddedDataSourceConfiguration.class,
 | 
			
		||||
				HibernateJpaAutoConfiguration.class, BatchAutoConfiguration.class,
 | 
			
		||||
				PropertyPlaceholderAutoConfiguration.class);
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		this.context.getBean(BatchConfigurer.class);
 | 
			
		||||
		JpaTransactionManager transactionManager = JpaTransactionManager.class.cast(
 | 
			
		||||
				this.context.getBean(BatchConfigurer.class).getTransactionManager());
 | 
			
		||||
		assertThat(transactionManager.getDefaultTimeout()).isEqualTo(30);
 | 
			
		||||
		assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testCustomizeDataSourceTransactionManagerUsingProperties() throws Exception {
 | 
			
		||||
		this.context = new AnnotationConfigApplicationContext();
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.transaction.default-timeout:30",
 | 
			
		||||
				"spring.transaction.rollback-on-commit-failure:true");
 | 
			
		||||
		this.context.register(TestConfiguration.class,
 | 
			
		||||
				EmbeddedDataSourceConfiguration.class,
 | 
			
		||||
				BatchAutoConfiguration.class,
 | 
			
		||||
				PropertyPlaceholderAutoConfiguration.class);
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		this.context.getBean(BatchConfigurer.class);
 | 
			
		||||
		DataSourceTransactionManager transactionManager = DataSourceTransactionManager.class.cast(
 | 
			
		||||
				this.context.getBean(BatchConfigurer.class).getTransactionManager());
 | 
			
		||||
		assertThat(transactionManager.getDefaultTimeout()).isEqualTo(30);
 | 
			
		||||
		assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
	protected static class EmptyConfiguration {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,7 @@ import org.springframework.context.annotation.Bean;
 | 
			
		|||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
import org.springframework.data.neo4j.mapping.Neo4jMappingContext;
 | 
			
		||||
import org.springframework.data.neo4j.template.Neo4jOperations;
 | 
			
		||||
import org.springframework.data.neo4j.transaction.Neo4jTransactionManager;
 | 
			
		||||
import org.springframework.data.neo4j.web.support.OpenSessionInViewInterceptor;
 | 
			
		||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -73,10 +74,21 @@ public class Neo4jDataAutoConfigurationTests {
 | 
			
		|||
				.hasSize(1);
 | 
			
		||||
		assertThat(this.context.getBeansOfType(SessionFactory.class)).hasSize(1);
 | 
			
		||||
		assertThat(this.context.getBeansOfType(Neo4jOperations.class)).hasSize(1);
 | 
			
		||||
		assertThat(this.context.getBeansOfType(Neo4jTransactionManager.class)).hasSize(1);
 | 
			
		||||
		assertThat(this.context.getBeansOfType(OpenSessionInViewInterceptor.class))
 | 
			
		||||
				.isEmpty();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void customNeo4jTransactionManagerUsingProperties() {
 | 
			
		||||
		load(null,
 | 
			
		||||
				"spring.transaction.default-timeout=30",
 | 
			
		||||
				"spring.transaction.rollback-on-commit-failure:true");
 | 
			
		||||
		Neo4jTransactionManager transactionManager = this.context.getBean(Neo4jTransactionManager.class);
 | 
			
		||||
		assertThat(transactionManager.getDefaultTimeout()).isEqualTo(30);
 | 
			
		||||
		assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void customSessionFactory() {
 | 
			
		||||
		load(CustomSessionFactory.class);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ import javax.sql.DataSource;
 | 
			
		|||
 | 
			
		||||
import org.junit.Test;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 | 
			
		||||
import org.springframework.context.annotation.Bean;
 | 
			
		||||
import org.springframework.context.annotation.Configuration;
 | 
			
		||||
| 
						 | 
				
			
			@ -106,6 +107,19 @@ public class DataSourceTransactionManagerAutoConfigurationTests {
 | 
			
		|||
				.isNotNull();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testCustomizeDataSourceTransactionManagerUsingProperties() throws Exception {
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.transaction.default-timeout:30",
 | 
			
		||||
				"spring.transaction.rollback-on-commit-failure:true");
 | 
			
		||||
		this.context.register(EmbeddedDataSourceConfiguration.class,
 | 
			
		||||
				DataSourceTransactionManagerAutoConfiguration.class);
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		DataSourceTransactionManager transactionManager = this.context.getBean(DataSourceTransactionManager.class);
 | 
			
		||||
		assertThat(transactionManager.getDefaultTimeout()).isEqualTo(30);
 | 
			
		||||
		assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@EnableTransactionManagement
 | 
			
		||||
	protected static class SwitchTransactionsOn {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,7 @@ import org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfigurati
 | 
			
		|||
import org.springframework.boot.orm.jpa.hibernate.SpringJtaPlatform;
 | 
			
		||||
import org.springframework.boot.test.util.EnvironmentTestUtils;
 | 
			
		||||
import org.springframework.jdbc.core.JdbcTemplate;
 | 
			
		||||
import org.springframework.orm.jpa.JpaTransactionManager;
 | 
			
		||||
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
 | 
			
		||||
 | 
			
		||||
import static org.assertj.core.api.Assertions.assertThat;
 | 
			
		||||
| 
						 | 
				
			
			@ -171,6 +172,18 @@ public class HibernateJpaAutoConfigurationTests
 | 
			
		|||
				.isEqualTo(TestJtaPlatform.class.getName());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void testCustomJpaTransactionManagerUsingProperties() throws Exception {
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.transaction.default-timeout:30",
 | 
			
		||||
				"spring.transaction.rollback-on-commit-failure:true");
 | 
			
		||||
		setupTestConfiguration();
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		JpaTransactionManager transactionManager = context.getBean(JpaTransactionManager.class);
 | 
			
		||||
		assertThat(transactionManager.getDefaultTimeout()).isEqualTo(30);
 | 
			
		||||
		assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static class TestJtaPlatform implements JtaPlatform {
 | 
			
		||||
 | 
			
		||||
		@Override
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -245,6 +245,32 @@ public class JtaAutoConfigurationTests {
 | 
			
		|||
		assertThat(dataSource.getMaxPoolSize()).isEqualTo(10);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void atomikosCustomizeJtaTransactionManagerUsingProperties() throws Exception {
 | 
			
		||||
		this.context = new AnnotationConfigApplicationContext();
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.transaction.default-timeout:30",
 | 
			
		||||
				"spring.transaction.rollback-on-commit-failure:true");
 | 
			
		||||
		this.context.register(AtomikosJtaConfiguration.class);
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		JtaTransactionManager transactionManager = this.context.getBean(JtaTransactionManager.class);
 | 
			
		||||
		assertThat(transactionManager.getDefaultTimeout()).isEqualTo(30);
 | 
			
		||||
		assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Test
 | 
			
		||||
	public void bitronixCustomizeJtaTransactionManagerUsingProperties() throws Exception {
 | 
			
		||||
		this.context = new AnnotationConfigApplicationContext();
 | 
			
		||||
		EnvironmentTestUtils.addEnvironment(this.context,
 | 
			
		||||
				"spring.transaction.default-timeout:30",
 | 
			
		||||
				"spring.transaction.rollback-on-commit-failure:true");
 | 
			
		||||
		this.context.register(BitronixJtaConfiguration.class);
 | 
			
		||||
		this.context.refresh();
 | 
			
		||||
		JtaTransactionManager transactionManager = this.context.getBean(JtaTransactionManager.class);
 | 
			
		||||
		assertThat(transactionManager.getDefaultTimeout()).isEqualTo(30);
 | 
			
		||||
		assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@Configuration
 | 
			
		||||
	@EnableConfigurationProperties(JtaProperties.class)
 | 
			
		||||
	public static class JtaPropertiesConfiguration {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue