From e699a9d2997ab7a5b16cc44e01766c766da4414b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?WangLiang/=E7=8E=8B=E8=89=AF?= <841369634@qq.com> Date: Fri, 23 Oct 2020 13:16:22 +0800 Subject: [PATCH] bugfix: fix the 'RootContext.DEFAULT_BRANCH_TYPE' is wrong in some cases (#3214) --- .../java/io/seata/core/context/RootContext.java | 16 ++++++++-------- .../io/seata/rm/datasource/DataSourceProxy.java | 6 +++++- .../rm/datasource/xa/DataSourceProxyXA.java | 13 ++++++++----- .../boot/autoconfigure/StarterConstants.java | 3 +++ .../datasource/AutoDataSourceProxyRegistrar.java | 9 ++------- .../SeataAutoDataSourceProxyAdvice.java | 5 ++++- 6 files changed, 30 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/io/seata/core/context/RootContext.java b/core/src/main/java/io/seata/core/context/RootContext.java index cc8821f55..db2410788 100644 --- a/core/src/main/java/io/seata/core/context/RootContext.java +++ b/core/src/main/java/io/seata/core/context/RootContext.java @@ -19,11 +19,8 @@ import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import io.seata.common.DefaultValues; import io.seata.common.exception.ShouldNeverHappenException; import io.seata.common.util.StringUtils; -import io.seata.config.ConfigurationFactory; -import io.seata.core.constants.ConfigurationKeys; import io.seata.core.model.BranchType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,13 +58,16 @@ public class RootContext { private static ContextCore CONTEXT_HOLDER = ContextCoreLoader.load(); - private static BranchType DEFAULT_BRANCH_TYPE = BranchType.get(ConfigurationFactory.getInstance() - .getConfig(ConfigurationKeys.DATA_SOURCE_PROXY_MODE, DefaultValues.DEFAULT_DATA_SOURCE_PROXY_MODE)); + private static BranchType DEFAULT_BRANCH_TYPE; public static void setDefaultBranchType(BranchType defaultBranchType) { if (defaultBranchType != AT && defaultBranchType != XA) { - throw new IllegalArgumentException("The default branch type must be AT or XA." + - " the value of the argument is: " + defaultBranchType); + throw new IllegalArgumentException("The default branch type must be " + AT + " or " + XA + "." + + " the value of the argument is: " + defaultBranchType); + } + if (DEFAULT_BRANCH_TYPE != null && DEFAULT_BRANCH_TYPE != defaultBranchType && LOGGER.isWarnEnabled()) { + LOGGER.warn("The `{}.DEFAULT_BRANCH_TYPE` has been set repeatedly. The value changes from {} to {}", + RootContext.class.getSimpleName(), DEFAULT_BRANCH_TYPE, defaultBranchType); } DEFAULT_BRANCH_TYPE = defaultBranchType; } @@ -170,7 +170,7 @@ public class RootContext { return branchType; } //Returns the default branch type. - return DEFAULT_BRANCH_TYPE; + return DEFAULT_BRANCH_TYPE != null ? DEFAULT_BRANCH_TYPE : BranchType.AT; } return null; } diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java b/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java index 2fdc9f4b6..b9d8c0233 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/DataSourceProxy.java @@ -15,16 +15,17 @@ */ package io.seata.rm.datasource; -import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import javax.sql.DataSource; import io.seata.common.thread.NamedThreadFactory; import io.seata.config.ConfigurationFactory; import io.seata.core.constants.ConfigurationKeys; +import io.seata.core.context.RootContext; import io.seata.core.model.BranchType; import io.seata.core.model.Resource; import io.seata.rm.DefaultResourceManager; @@ -114,6 +115,9 @@ public class DataSourceProxy extends AbstractDataSourceProxy implements Resource } }, 0, TABLE_META_CHECKER_INTERVAL, TimeUnit.MILLISECONDS); } + + //Set the default branch type to 'AT' in the RootContext. + RootContext.setDefaultBranchType(this.getBranchType()); } /** diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/xa/DataSourceProxyXA.java b/rm-datasource/src/main/java/io/seata/rm/datasource/xa/DataSourceProxyXA.java index e0bca8424..596f4f908 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/xa/DataSourceProxyXA.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/xa/DataSourceProxyXA.java @@ -15,6 +15,11 @@ */ package io.seata.rm.datasource.xa; +import java.sql.Connection; +import java.sql.SQLException; +import javax.sql.DataSource; +import javax.sql.XAConnection; + import io.seata.core.context.RootContext; import io.seata.core.model.BranchType; import io.seata.rm.datasource.SeataDataSourceProxy; @@ -23,11 +28,6 @@ import io.seata.rm.datasource.util.XAUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.sql.DataSource; -import javax.sql.XAConnection; -import java.sql.Connection; -import java.sql.SQLException; - /** * DataSource proxy for XA mode. * @@ -49,6 +49,9 @@ public class DataSourceProxyXA extends AbstractDataSourceProxyXA { this.dataSource = dataSource; this.branchType = BranchType.XA; JdbcUtils.initDataSourceResource(this, dataSource, resourceGroupId); + + //Set the default branch type to 'XA' in the RootContext. + RootContext.setDefaultBranchType(this.getBranchType()); } @Override diff --git a/seata-spring-boot-starter/src/main/java/io/seata/spring/boot/autoconfigure/StarterConstants.java b/seata-spring-boot-starter/src/main/java/io/seata/spring/boot/autoconfigure/StarterConstants.java index 83e1e3285..a2a2d908f 100644 --- a/seata-spring-boot-starter/src/main/java/io/seata/spring/boot/autoconfigure/StarterConstants.java +++ b/seata-spring-boot-starter/src/main/java/io/seata/spring/boot/autoconfigure/StarterConstants.java @@ -17,6 +17,7 @@ package io.seata.spring.boot.autoconfigure; import java.util.HashMap; +import io.seata.spring.boot.autoconfigure.properties.SeataProperties; import io.seata.spring.boot.autoconfigure.properties.client.LockProperties; import io.seata.spring.boot.autoconfigure.properties.client.LogProperties; import io.seata.spring.boot.autoconfigure.properties.client.RmProperties; @@ -86,6 +87,8 @@ public interface StarterConstants { private static final long serialVersionUID = -8902807645596274597L; { + put(SEATA_PREFIX, SeataProperties.class); + put(CLIENT_RM_PREFIX, RmProperties.class); put(CLIENT_TM_PREFIX, TmProperties.class); put(LOCK_PREFIX, LockProperties.class); diff --git a/spring/src/main/java/io/seata/spring/annotation/datasource/AutoDataSourceProxyRegistrar.java b/spring/src/main/java/io/seata/spring/annotation/datasource/AutoDataSourceProxyRegistrar.java index 970daebce..29e61922f 100644 --- a/spring/src/main/java/io/seata/spring/annotation/datasource/AutoDataSourceProxyRegistrar.java +++ b/spring/src/main/java/io/seata/spring/annotation/datasource/AutoDataSourceProxyRegistrar.java @@ -15,16 +15,14 @@ */ package io.seata.spring.annotation.datasource; -import io.seata.core.context.RootContext; -import io.seata.core.model.BranchType; +import java.util.Map; + import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.type.AnnotationMetadata; -import java.util.Map; - /** * @author xingfudeshi@gmail.com * The type auto data source proxy registrar @@ -45,9 +43,6 @@ public class AutoDataSourceProxyRegistrar implements ImportBeanDefinitionRegistr String[] excludes = (String[]) annotationAttributes.get(ATTRIBUTE_KEY_EXCLUDES); String dataSourceProxyMode = (String) annotationAttributes.get(ATTRIBUTE_KEY_DATA_SOURCE_PROXY_MODE); - //Set the default branch type to RootContext. - RootContext.setDefaultBranchType(BranchType.get(dataSourceProxyMode)); - //register seataDataSourceBeanPostProcessor bean def if (!registry.containsBeanDefinition(BEAN_NAME_SEATA_DATA_SOURCE_BEAN_POST_PROCESSOR)) { AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder diff --git a/spring/src/main/java/io/seata/spring/annotation/datasource/SeataAutoDataSourceProxyAdvice.java b/spring/src/main/java/io/seata/spring/annotation/datasource/SeataAutoDataSourceProxyAdvice.java index 433a23852..0e497874e 100644 --- a/spring/src/main/java/io/seata/spring/annotation/datasource/SeataAutoDataSourceProxyAdvice.java +++ b/spring/src/main/java/io/seata/spring/annotation/datasource/SeataAutoDataSourceProxyAdvice.java @@ -15,8 +15,8 @@ */ package io.seata.spring.annotation.datasource; -import javax.sql.DataSource; import java.lang.reflect.Method; +import javax.sql.DataSource; import io.seata.core.context.RootContext; import io.seata.core.model.BranchType; @@ -46,6 +46,9 @@ public class SeataAutoDataSourceProxyAdvice implements MethodInterceptor, Introd } else { throw new IllegalArgumentException("Unknown dataSourceProxyMode: " + dataSourceProxyMode); } + + //Set the default branch type in the RootContext. + RootContext.setDefaultBranchType(this.dataSourceProxyMode); } @Override -- GitLab