Search in sources :

Example 11 with TransactionManager

use of cn.taketoday.transaction.TransactionManager in project today-infrastructure by TAKETODAY.

the class TestContextTransactionUtils method retrieveTransactionManager.

/**
 * Retrieve the {@linkplain PlatformTransactionManager transaction manager}
 * to use for the supplied {@linkplain TestContext test context}.
 * <p>The following algorithm is used to retrieve the transaction manager
 * from the {@link cn.taketoday.context.ApplicationContext ApplicationContext}
 * of the supplied test context:
 * <ol>
 * <li>Look up the transaction manager by type and explicit name, if the supplied
 * {@code name} is non-empty, throwing a {@link BeansException} if the named
 * transaction manager does not exist.
 * <li>Attempt to look up the transaction manager via a
 * {@link TransactionManagementConfigurer}, if present.
 * <li>Attempt to look up the single transaction manager by type.
 * <li>Attempt to look up the <em>primary</em> transaction manager by type.
 * <li>Attempt to look up the transaction manager by type and the
 * {@linkplain #DEFAULT_TRANSACTION_MANAGER_NAME default transaction manager
 * name}.
 * </ol>
 *
 * @param testContext the test context for which the transaction manager
 * should be retrieved; never {@code null}
 * @param name the name of the transaction manager to retrieve
 * (may be {@code null} or <em>empty</em>)
 * @return the transaction manager to use, or {@code null} if not found
 * @throws BeansException if an error occurs while retrieving an explicitly
 * named transaction manager
 * @throws IllegalStateException if more than one TransactionManagementConfigurer
 * exists in the ApplicationContext
 */
@Nullable
public static PlatformTransactionManager retrieveTransactionManager(TestContext testContext, @Nullable String name) {
    Assert.notNull(testContext, "TestContext must not be null");
    BeanFactory bf = testContext.getApplicationContext().getAutowireCapableBeanFactory();
    try {
        // Look up by type and explicit name
        if (StringUtils.hasText(name)) {
            return bf.getBean(name, PlatformTransactionManager.class);
        }
    } catch (BeansException ex) {
        logger.error("Failed to retrieve transaction manager named '{}' for test context {}", name, testContext, ex);
        throw ex;
    }
    try {
        // Look up single TransactionManagementConfigurer
        Map<String, TransactionManagementConfigurer> configurers = BeanFactoryUtils.beansOfTypeIncludingAncestors(bf, TransactionManagementConfigurer.class);
        Assert.state(configurers.size() <= 1, "Only one TransactionManagementConfigurer may exist in the ApplicationContext");
        if (configurers.size() == 1) {
            TransactionManager tm = configurers.values().iterator().next().annotationDrivenTransactionManager();
            Assert.state(tm instanceof PlatformTransactionManager, () -> "Transaction manager specified via TransactionManagementConfigurer " + "is not a PlatformTransactionManager: " + tm);
            return (PlatformTransactionManager) tm;
        }
        // Look up single bean by type
        Map<String, PlatformTransactionManager> txMgrs = BeanFactoryUtils.beansOfTypeIncludingAncestors(bf, PlatformTransactionManager.class);
        if (txMgrs.size() == 1) {
            return txMgrs.values().iterator().next();
        }
        try {
            // Look up single bean by type, with support for 'primary' beans
            return bf.getBean(PlatformTransactionManager.class);
        } catch (BeansException ex) {
            logBeansException(testContext, ex, PlatformTransactionManager.class);
        }
        // look up by type and default name
        return bf.getBean(DEFAULT_TRANSACTION_MANAGER_NAME, PlatformTransactionManager.class);
    } catch (BeansException ex) {
        logBeansException(testContext, ex, PlatformTransactionManager.class);
        return null;
    }
}
Also used : TransactionManager(cn.taketoday.transaction.TransactionManager) PlatformTransactionManager(cn.taketoday.transaction.PlatformTransactionManager) BeanFactory(cn.taketoday.beans.factory.BeanFactory) TransactionManagementConfigurer(cn.taketoday.transaction.annotation.TransactionManagementConfigurer) PlatformTransactionManager(cn.taketoday.transaction.PlatformTransactionManager) BeansException(cn.taketoday.beans.BeansException) Nullable(cn.taketoday.lang.Nullable)

Example 12 with TransactionManager

use of cn.taketoday.transaction.TransactionManager in project today-infrastructure by TAKETODAY.

the class TransactionInterceptorTests method determineTransactionManagerWithBeanNameSeveralTimes.

@Test
public void determineTransactionManagerWithBeanNameSeveralTimes() {
    BeanFactory beanFactory = mock(BeanFactory.class);
    TransactionInterceptor ti = transactionInterceptorWithTransactionManagerName("fooTransactionManager", beanFactory);
    PlatformTransactionManager txManager = associateTransactionManager(beanFactory, "fooTransactionManager");
    DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
    TransactionManager actual = ti.determineTransactionManager(attribute);
    assertThat(actual).isSameAs(txManager);
    // Call again, should be cached
    TransactionManager actual2 = ti.determineTransactionManager(attribute);
    assertThat(actual2).isSameAs(txManager);
    verify(beanFactory, times(1)).getBean("fooTransactionManager", PlatformTransactionManager.class);
}
Also used : TransactionManager(cn.taketoday.transaction.TransactionManager) PlatformTransactionManager(cn.taketoday.transaction.PlatformTransactionManager) BeanFactory(cn.taketoday.beans.factory.BeanFactory) PlatformTransactionManager(cn.taketoday.transaction.PlatformTransactionManager) Test(org.junit.jupiter.api.Test)

Aggregations

PlatformTransactionManager (cn.taketoday.transaction.PlatformTransactionManager)12 TransactionManager (cn.taketoday.transaction.TransactionManager)12 BeanFactory (cn.taketoday.beans.factory.BeanFactory)10 Test (org.junit.jupiter.api.Test)6 Nullable (cn.taketoday.lang.Nullable)4 ReactiveTransactionManager (cn.taketoday.transaction.ReactiveTransactionManager)4 CallbackPreferringPlatformTransactionManager (cn.taketoday.transaction.support.CallbackPreferringPlatformTransactionManager)4 BeansException (cn.taketoday.beans.BeansException)2 BeanFactoryAware (cn.taketoday.beans.factory.BeanFactoryAware)2 InitializingBean (cn.taketoday.beans.factory.InitializingBean)2 BeanFactoryAnnotationUtils (cn.taketoday.beans.factory.annotation.BeanFactoryAnnotationUtils)2 NamedThreadLocal (cn.taketoday.core.NamedThreadLocal)2 ReactiveAdapter (cn.taketoday.core.ReactiveAdapter)2 ReactiveAdapterRegistry (cn.taketoday.core.ReactiveAdapterRegistry)2 Assert (cn.taketoday.lang.Assert)2 Logger (cn.taketoday.logging.Logger)2 LoggerFactory (cn.taketoday.logging.LoggerFactory)2 NoTransactionException (cn.taketoday.transaction.NoTransactionException)2 ReactiveTransaction (cn.taketoday.transaction.ReactiveTransaction)2 TransactionStatus (cn.taketoday.transaction.TransactionStatus)2