From dc05965c9867c84b04352bc1e3f4d0f570ee9b05 Mon Sep 17 00:00:00 2001 From: terrymanu Date: Mon, 26 Mar 2018 13:40:41 +0800 Subject: [PATCH] For #673: remove build() from MasterSlaveRuleConfiguration --- .../config/MasterSlaveRuleConfiguration.java | 41 +------------------ .../ShardingConfigurationException.java | 9 ++++ .../core/rule/MasterSlaveRule.java | 17 ++++---- .../YamlMasterSlaveRuleConfiguration.java | 22 +++++++++- .../YamlShardingRuleConfiguration.java | 10 ++--- .../YamlMasterSlaveRuleConfigurationTest.java | 3 +- .../YamlShardingRuleConfigurationTest.java | 3 +- .../SpringMasterSlaveDataSource.java | 16 ++++++-- .../spring/MasterSlaveNamespaceTest.java | 6 +-- .../api/MasterSlaveDataSourceFactory.java | 2 +- .../datasource/MasterSlaveDataSource.java | 15 +++---- .../AbstractShardingMasterSlaveTest.java | 13 +++--- .../connection/ShardingConnectionTest.java | 9 ++-- .../datasource/MasterSlaveDataSourceTest.java | 8 ++-- .../SpringMasterSlaveDataSource.java | 16 ++++++-- ...erSlaveDataSourceBeanDefinitionParser.java | 13 +++--- ...OrchestrationMasterSlaveNamespaceTest.java | 6 +-- .../internal/OrchestrationFacade.java | 2 +- .../OrchestrationMasterSlaveDataSource.java | 2 +- .../config/ConfigurationListenerManager.java | 2 +- .../datasource/DataSourceListenerManager.java | 2 +- .../instance/InstanceListenerManager.java | 2 +- 22 files changed, 114 insertions(+), 105 deletions(-) diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/api/config/MasterSlaveRuleConfiguration.java b/sharding-core/src/main/java/io/shardingjdbc/core/api/config/MasterSlaveRuleConfiguration.java index 563ea2381f..11d30ad79c 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/api/config/MasterSlaveRuleConfiguration.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/api/config/MasterSlaveRuleConfiguration.java @@ -17,12 +17,7 @@ package io.shardingjdbc.core.api.config; -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; import io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithm; -import io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithmType; -import io.shardingjdbc.core.exception.ShardingConfigurationException; -import io.shardingjdbc.core.rule.MasterSlaveRule; import lombok.Getter; import lombok.Setter; @@ -44,39 +39,5 @@ public class MasterSlaveRuleConfiguration { private Collection slaveDataSourceNames = new LinkedList<>(); - private MasterSlaveLoadBalanceAlgorithmType loadBalanceAlgorithmType; - - private String loadBalanceAlgorithmClassName; - - /** - * Build master-slave rule. - * - * @return master-slave rule - */ - public MasterSlaveRule build() { - Preconditions.checkNotNull(name, "name cannot be null."); - Preconditions.checkNotNull(masterDataSourceName, "masterDataSourceName cannot be null."); - Preconditions.checkNotNull(slaveDataSourceNames, "slaveDataSourceNames cannot be null."); - Preconditions.checkArgument(!slaveDataSourceNames.isEmpty(), "slaveDataSourceNames cannot be empty."); - return new MasterSlaveRule(name, masterDataSourceName, slaveDataSourceNames, getLoadBalanceAlgorithm()); - } - - private MasterSlaveLoadBalanceAlgorithm getLoadBalanceAlgorithm() { - if (null == loadBalanceAlgorithmType) { - return Strings.isNullOrEmpty(loadBalanceAlgorithmClassName) ? null : newInstance(loadBalanceAlgorithmClassName); - } - return loadBalanceAlgorithmType.getAlgorithm(); - } - - private MasterSlaveLoadBalanceAlgorithm newInstance(final String masterSlaveLoadBalanceAlgorithmClassName) { - try { - Class result = Class.forName(masterSlaveLoadBalanceAlgorithmClassName); - if (!MasterSlaveLoadBalanceAlgorithm.class.isAssignableFrom(result)) { - throw new ShardingConfigurationException("Class %s should be implement %s", masterSlaveLoadBalanceAlgorithmClassName, MasterSlaveLoadBalanceAlgorithm.class.getName()); - } - return (MasterSlaveLoadBalanceAlgorithm) result.newInstance(); - } catch (final ReflectiveOperationException ex) { - throw new ShardingConfigurationException("Class %s should have public privilege and no argument constructor", masterSlaveLoadBalanceAlgorithmClassName); - } - } + private MasterSlaveLoadBalanceAlgorithm loadBalanceAlgorithm; } diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/exception/ShardingConfigurationException.java b/sharding-core/src/main/java/io/shardingjdbc/core/exception/ShardingConfigurationException.java index 80add6e7f1..ac9e6d33cf 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/exception/ShardingConfigurationException.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/exception/ShardingConfigurationException.java @@ -35,4 +35,13 @@ public final class ShardingConfigurationException extends RuntimeException { public ShardingConfigurationException(final String errorMessage, final Object... args) { super(String.format(errorMessage, args)); } + + /** + * Constructs an exception with cause exception. + * + * @param cause cause exception + */ + public ShardingConfigurationException(final Exception cause) { + super(cause); + } } diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/rule/MasterSlaveRule.java b/sharding-core/src/main/java/io/shardingjdbc/core/rule/MasterSlaveRule.java index 44afa0433d..c70d35d536 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/rule/MasterSlaveRule.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/rule/MasterSlaveRule.java @@ -20,6 +20,7 @@ package io.shardingjdbc.core.rule; import com.google.common.base.Preconditions; import io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithm; import io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithmType; +import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; import lombok.Getter; import java.util.Collection; @@ -38,20 +39,16 @@ public final class MasterSlaveRule { private final Collection slaveDataSourceNames; - private final MasterSlaveLoadBalanceAlgorithm strategy; + private final MasterSlaveLoadBalanceAlgorithm loadBalanceAlgorithm; - public MasterSlaveRule(final String name, final String masterDataSourceName, final Collection slaveDataSourceNames) { - this(name, masterDataSourceName, slaveDataSourceNames, null); - } - - public MasterSlaveRule(final String name, final String masterDataSourceName, final Collection slaveDataSourceNames, final MasterSlaveLoadBalanceAlgorithm strategy) { + public MasterSlaveRule(final MasterSlaveRuleConfiguration config) { + this.name = config.getName(); + this.masterDataSourceName = config.getMasterDataSourceName(); + this.slaveDataSourceNames = config.getSlaveDataSourceNames(); + this.loadBalanceAlgorithm = null == config.getLoadBalanceAlgorithm() ? MasterSlaveLoadBalanceAlgorithmType.getDefaultAlgorithmType().getAlgorithm() : config.getLoadBalanceAlgorithm(); Preconditions.checkNotNull(name); Preconditions.checkNotNull(masterDataSourceName); Preconditions.checkNotNull(slaveDataSourceNames); Preconditions.checkState(!slaveDataSourceNames.isEmpty()); - this.name = name; - this.masterDataSourceName = masterDataSourceName; - this.slaveDataSourceNames = slaveDataSourceNames; - this.strategy = null == strategy ? MasterSlaveLoadBalanceAlgorithmType.getDefaultAlgorithmType().getAlgorithm() : strategy; } } diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/yaml/masterslave/YamlMasterSlaveRuleConfiguration.java b/sharding-core/src/main/java/io/shardingjdbc/core/yaml/masterslave/YamlMasterSlaveRuleConfiguration.java index f2b12be01b..5c7a6acf00 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/yaml/masterslave/YamlMasterSlaveRuleConfiguration.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/yaml/masterslave/YamlMasterSlaveRuleConfiguration.java @@ -17,8 +17,11 @@ package io.shardingjdbc.core.yaml.masterslave; +import com.google.common.base.Strings; +import io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithm; import io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithmType; import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; +import io.shardingjdbc.core.exception.ShardingConfigurationException; import lombok.Getter; import lombok.Setter; @@ -58,8 +61,23 @@ public class YamlMasterSlaveRuleConfiguration { result.setName(name); result.setMasterDataSourceName(masterDataSourceName); result.setSlaveDataSourceNames(slaveDataSourceNames); - result.setLoadBalanceAlgorithmType(loadBalanceAlgorithmType); - result.setLoadBalanceAlgorithmClassName(loadBalanceAlgorithmClassName); + if (null != loadBalanceAlgorithmType) { + result.setLoadBalanceAlgorithm(loadBalanceAlgorithmType.getAlgorithm()); + } else if (!Strings.isNullOrEmpty(loadBalanceAlgorithmClassName)) { + result.setLoadBalanceAlgorithm(newInstance(loadBalanceAlgorithmClassName)); + } return result; } + + private MasterSlaveLoadBalanceAlgorithm newInstance(final String masterSlaveLoadBalanceAlgorithmClassName) { + try { + Class result = Class.forName(masterSlaveLoadBalanceAlgorithmClassName); + if (!MasterSlaveLoadBalanceAlgorithm.class.isAssignableFrom(result)) { + throw new ShardingConfigurationException("Class %s should be implement %s", masterSlaveLoadBalanceAlgorithmClassName, MasterSlaveLoadBalanceAlgorithm.class.getName()); + } + return (MasterSlaveLoadBalanceAlgorithm) result.newInstance(); + } catch (final ReflectiveOperationException ex) { + throw new ShardingConfigurationException("Class %s should have public privilege and no argument constructor", masterSlaveLoadBalanceAlgorithmClassName); + } + } } diff --git a/sharding-core/src/main/java/io/shardingjdbc/core/yaml/sharding/YamlShardingRuleConfiguration.java b/sharding-core/src/main/java/io/shardingjdbc/core/yaml/sharding/YamlShardingRuleConfiguration.java index 308fca6cbb..7d22aea837 100644 --- a/sharding-core/src/main/java/io/shardingjdbc/core/yaml/sharding/YamlShardingRuleConfiguration.java +++ b/sharding-core/src/main/java/io/shardingjdbc/core/yaml/sharding/YamlShardingRuleConfiguration.java @@ -83,13 +83,9 @@ public class YamlShardingRuleConfiguration { result.setDefaultKeyGeneratorClass(defaultKeyGeneratorClass); Collection masterSlaveRuleConfigs = new LinkedList<>(); for (Entry entry : masterSlaveRules.entrySet()) { - MasterSlaveRuleConfiguration msRuleConfig = new MasterSlaveRuleConfiguration(); - msRuleConfig.setName(entry.getKey()); - msRuleConfig.setMasterDataSourceName(entry.getValue().getMasterDataSourceName()); - msRuleConfig.setSlaveDataSourceNames(entry.getValue().getSlaveDataSourceNames()); - msRuleConfig.setLoadBalanceAlgorithmType(entry.getValue().getLoadBalanceAlgorithmType()); - msRuleConfig.setLoadBalanceAlgorithmClassName(entry.getValue().getLoadBalanceAlgorithmClassName()); - masterSlaveRuleConfigs.add(msRuleConfig); + MasterSlaveRuleConfiguration each = entry.getValue().getMasterSlaveRuleConfiguration(); + each.setName(entry.getKey()); + masterSlaveRuleConfigs.add(each); } result.setMasterSlaveRuleConfigs(masterSlaveRuleConfigs); return result; diff --git a/sharding-core/src/test/java/io/shardingjdbc/core/yaml/masterslave/YamlMasterSlaveRuleConfigurationTest.java b/sharding-core/src/test/java/io/shardingjdbc/core/yaml/masterslave/YamlMasterSlaveRuleConfigurationTest.java index 262b11c2aa..92c4766b9a 100644 --- a/sharding-core/src/test/java/io/shardingjdbc/core/yaml/masterslave/YamlMasterSlaveRuleConfigurationTest.java +++ b/sharding-core/src/test/java/io/shardingjdbc/core/yaml/masterslave/YamlMasterSlaveRuleConfigurationTest.java @@ -49,7 +49,6 @@ public final class YamlMasterSlaveRuleConfigurationTest { assertThat(actual.getName(), is("master_slave_ds")); assertThat(actual.getMasterDataSourceName(), is("master_ds")); assertThat(actual.getSlaveDataSourceNames(), CoreMatchers.>is(Arrays.asList("slave_ds_0", "slave_ds_1"))); - assertThat(actual.getLoadBalanceAlgorithmType(), is(MasterSlaveLoadBalanceAlgorithmType.RANDOM)); - assertThat(actual.getLoadBalanceAlgorithmClassName(), is("TestLoadBalanceAlgorithmClassName")); + assertThat(actual.getLoadBalanceAlgorithm(), is(MasterSlaveLoadBalanceAlgorithmType.RANDOM.getAlgorithm())); } } diff --git a/sharding-core/src/test/java/io/shardingjdbc/core/yaml/sharding/YamlShardingRuleConfigurationTest.java b/sharding-core/src/test/java/io/shardingjdbc/core/yaml/sharding/YamlShardingRuleConfigurationTest.java index 2b09d9e70d..d3a17ee302 100644 --- a/sharding-core/src/test/java/io/shardingjdbc/core/yaml/sharding/YamlShardingRuleConfigurationTest.java +++ b/sharding-core/src/test/java/io/shardingjdbc/core/yaml/sharding/YamlShardingRuleConfigurationTest.java @@ -99,8 +99,7 @@ public final class YamlShardingRuleConfigurationTest { assertThat(actual.getName(), is("master_slave_ds")); assertThat(actual.getMasterDataSourceName(), is("master_ds")); assertThat(actual.getSlaveDataSourceNames(), CoreMatchers.>is(Arrays.asList("slave_ds_0", "slave_ds_1"))); - assertThat(actual.getLoadBalanceAlgorithmType(), is(MasterSlaveLoadBalanceAlgorithmType.ROUND_ROBIN)); - assertThat(actual.getLoadBalanceAlgorithmClassName(), is("TestLoadBalanceAlgorithmClassName")); + assertThat(actual.getLoadBalanceAlgorithm(), is(MasterSlaveLoadBalanceAlgorithmType.ROUND_ROBIN.getAlgorithm())); } private void assertWithoutDefaultStrategy(final ShardingRuleConfiguration actual) { diff --git a/sharding-jdbc-core-spring/sharding-jdbc-core-spring-namespace/src/main/java/io/shardingjdbc/spring/datasource/SpringMasterSlaveDataSource.java b/sharding-jdbc-core-spring/sharding-jdbc-core-spring-namespace/src/main/java/io/shardingjdbc/spring/datasource/SpringMasterSlaveDataSource.java index eac00eb55c..af30d1be6b 100644 --- a/sharding-jdbc-core-spring/sharding-jdbc-core-spring-namespace/src/main/java/io/shardingjdbc/spring/datasource/SpringMasterSlaveDataSource.java +++ b/sharding-jdbc-core-spring/sharding-jdbc-core-spring-namespace/src/main/java/io/shardingjdbc/spring/datasource/SpringMasterSlaveDataSource.java @@ -19,8 +19,8 @@ package io.shardingjdbc.spring.datasource; import io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithm; import io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithmType; +import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; import io.shardingjdbc.core.jdbc.core.datasource.MasterSlaveDataSource; -import io.shardingjdbc.core.rule.MasterSlaveRule; import javax.sql.DataSource; import java.sql.SQLException; @@ -36,11 +36,21 @@ public class SpringMasterSlaveDataSource extends MasterSlaveDataSource { public SpringMasterSlaveDataSource(final Map dataSourceMap, final String name, final String masterDataSourceName, final Collection slaveDataSourceNames, final MasterSlaveLoadBalanceAlgorithm strategy, final Map configMap) throws SQLException { - super(dataSourceMap, new MasterSlaveRule(name, masterDataSourceName, slaveDataSourceNames, strategy), configMap); + super(dataSourceMap, getMasterSlaveRuleConfiguration(name, masterDataSourceName, slaveDataSourceNames, strategy), configMap); } public SpringMasterSlaveDataSource(final Map dataSourceMap, final String name, final String masterDataSourceName, final Collection slaveDataSourceNames, final MasterSlaveLoadBalanceAlgorithmType strategyType, final Map configMap) throws SQLException { - super(dataSourceMap, new MasterSlaveRule(name, masterDataSourceName, slaveDataSourceNames, strategyType.getAlgorithm()), configMap); + super(dataSourceMap, getMasterSlaveRuleConfiguration(name, masterDataSourceName, slaveDataSourceNames, strategyType.getAlgorithm()), configMap); + } + + private static MasterSlaveRuleConfiguration getMasterSlaveRuleConfiguration( + final String name, final String masterDataSourceName, final Collection slaveDataSourceNames, final MasterSlaveLoadBalanceAlgorithm loadBalanceAlgorithm) { + MasterSlaveRuleConfiguration result = new MasterSlaveRuleConfiguration(); + result.setName(name); + result.setMasterDataSourceName(masterDataSourceName); + result.setSlaveDataSourceNames(slaveDataSourceNames); + result.setLoadBalanceAlgorithm(loadBalanceAlgorithm); + return result; } } diff --git a/sharding-jdbc-core-spring/sharding-jdbc-core-spring-namespace/src/test/java/io/shardingjdbc/spring/MasterSlaveNamespaceTest.java b/sharding-jdbc-core-spring/sharding-jdbc-core-spring-namespace/src/test/java/io/shardingjdbc/spring/MasterSlaveNamespaceTest.java index 24a2b704b9..b6bf6378b8 100644 --- a/sharding-jdbc-core-spring/sharding-jdbc-core-spring-namespace/src/test/java/io/shardingjdbc/spring/MasterSlaveNamespaceTest.java +++ b/sharding-jdbc-core-spring/sharding-jdbc-core-spring-namespace/src/test/java/io/shardingjdbc/spring/MasterSlaveNamespaceTest.java @@ -56,15 +56,15 @@ public class MasterSlaveNamespaceTest extends AbstractJUnit4SpringContextTests { public void assertTypeMasterSlaveDataSource() { MasterSlaveRule randomSlaveRule = getMasterSlaveRule("randomMasterSlaveDataSource"); MasterSlaveRule roundRobinSlaveRule = getMasterSlaveRule("roundRobinMasterSlaveDataSource"); - assertTrue(randomSlaveRule.getStrategy() instanceof RandomMasterSlaveLoadBalanceAlgorithm); - assertTrue(roundRobinSlaveRule.getStrategy() instanceof RoundRobinMasterSlaveLoadBalanceAlgorithm); + assertTrue(randomSlaveRule.getLoadBalanceAlgorithm() instanceof RandomMasterSlaveLoadBalanceAlgorithm); + assertTrue(roundRobinSlaveRule.getLoadBalanceAlgorithm() instanceof RoundRobinMasterSlaveLoadBalanceAlgorithm); } @Test public void assertRefMasterSlaveDataSource() { MasterSlaveLoadBalanceAlgorithm randomStrategy = this.applicationContext.getBean("randomStrategy", MasterSlaveLoadBalanceAlgorithm.class); MasterSlaveRule masterSlaveRule = getMasterSlaveRule("refMasterSlaveDataSource"); - assertTrue(masterSlaveRule.getStrategy() == randomStrategy); + assertTrue(masterSlaveRule.getLoadBalanceAlgorithm() == randomStrategy); } @Test diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/api/MasterSlaveDataSourceFactory.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/api/MasterSlaveDataSourceFactory.java index 0d1240c623..0e9b629d9a 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/api/MasterSlaveDataSourceFactory.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/api/MasterSlaveDataSourceFactory.java @@ -50,7 +50,7 @@ public final class MasterSlaveDataSourceFactory { */ public static DataSource createDataSource( final Map dataSourceMap, final MasterSlaveRuleConfiguration masterSlaveRuleConfig, final Map configMap) throws SQLException { - return new MasterSlaveDataSource(dataSourceMap, masterSlaveRuleConfig.build(), configMap); + return new MasterSlaveDataSource(dataSourceMap, masterSlaveRuleConfig, configMap); } /** diff --git a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/core/datasource/MasterSlaveDataSource.java b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/core/datasource/MasterSlaveDataSource.java index 5d40eb06f6..2eec97509d 100644 --- a/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/core/datasource/MasterSlaveDataSource.java +++ b/sharding-jdbc-core/src/main/java/io/shardingjdbc/core/jdbc/core/datasource/MasterSlaveDataSource.java @@ -18,6 +18,7 @@ package io.shardingjdbc.core.jdbc.core.datasource; import io.shardingjdbc.core.api.ConfigMapContext; +import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; import io.shardingjdbc.core.constant.SQLType; import io.shardingjdbc.core.hint.HintManagerHolder; import io.shardingjdbc.core.jdbc.adapter.AbstractDataSourceAdapter; @@ -54,13 +55,13 @@ public class MasterSlaveDataSource extends AbstractDataSourceAdapter { private MasterSlaveRule masterSlaveRule; - public MasterSlaveDataSource(final Map dataSourceMap, final MasterSlaveRule masterSlaveRule, final Map configMap) throws SQLException { - super(getAllDataSources(dataSourceMap, masterSlaveRule.getMasterDataSourceName(), masterSlaveRule.getSlaveDataSourceNames())); + public MasterSlaveDataSource(final Map dataSourceMap, final MasterSlaveRuleConfiguration masterSlaveRuleConfig, final Map configMap) throws SQLException { + super(getAllDataSources(dataSourceMap, masterSlaveRuleConfig.getMasterDataSourceName(), masterSlaveRuleConfig.getSlaveDataSourceNames())); this.dataSourceMap = dataSourceMap; + this.masterSlaveRule = new MasterSlaveRule(masterSlaveRuleConfig); if (!configMap.isEmpty()) { ConfigMapContext.getInstance().getMasterSlaveConfig().putAll(configMap); } - this.masterSlaveRule = masterSlaveRule; } private static Collection getAllDataSources(final Map dataSourceMap, final String masterDataSourceName, final Collection slaveDataSourceNames) { @@ -115,7 +116,7 @@ public class MasterSlaveDataSource extends AbstractDataSourceAdapter { DML_FLAG.set(true); return new NamedDataSource(masterSlaveRule.getMasterDataSourceName(), dataSourceMap.get(masterSlaveRule.getMasterDataSourceName())); } - String selectedSourceName = masterSlaveRule.getStrategy().getDataSource( + String selectedSourceName = masterSlaveRule.getLoadBalanceAlgorithm().getDataSource( masterSlaveRule.getName(), masterSlaveRule.getMasterDataSourceName(), new ArrayList<>(masterSlaveRule.getSlaveDataSourceNames())); DataSource selectedSource = dataSourceMap.get(selectedSourceName); return new NamedDataSource(selectedSourceName, selectedSource); @@ -129,11 +130,11 @@ public class MasterSlaveDataSource extends AbstractDataSourceAdapter { * Renew master-slave data source. * * @param dataSourceMap data source map - * @param masterSlaveRule new master-slave rule + * @param masterSlaveRuleConfig new master-slave rule configuration */ - public void renew(final Map dataSourceMap, final MasterSlaveRule masterSlaveRule) { + public void renew(final Map dataSourceMap, final MasterSlaveRuleConfiguration masterSlaveRuleConfig) { this.dataSourceMap = dataSourceMap; - this.masterSlaveRule = masterSlaveRule; + this.masterSlaveRule = new MasterSlaveRule(masterSlaveRuleConfig); } @Override diff --git a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingMasterSlaveTest.java b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingMasterSlaveTest.java index 2e0692095f..ae46823315 100644 --- a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingMasterSlaveTest.java +++ b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/integrate/type/sharding/AbstractShardingMasterSlaveTest.java @@ -18,6 +18,7 @@ package io.shardingjdbc.core.integrate.type.sharding; import com.google.common.base.Joiner; +import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; import io.shardingjdbc.core.api.config.ShardingRuleConfiguration; import io.shardingjdbc.core.api.config.TableRuleConfiguration; import io.shardingjdbc.core.api.config.strategy.StandardShardingStrategyConfiguration; @@ -30,7 +31,6 @@ import io.shardingjdbc.core.integrate.fixture.RangeModuloDatabaseShardingAlgorit import io.shardingjdbc.core.integrate.jaxb.SQLShardingRule; import io.shardingjdbc.core.jdbc.core.datasource.MasterSlaveDataSource; import io.shardingjdbc.core.jdbc.core.datasource.ShardingDataSource; -import io.shardingjdbc.core.rule.MasterSlaveRule; import org.junit.After; import javax.sql.DataSource; @@ -155,10 +155,13 @@ public abstract class AbstractShardingMasterSlaveTest extends AbstractSQLAssertT return result; } - private MasterSlaveDataSource getMasterSlaveDataSource(final Map masterSlaveDataSourceMap, - final String name, final String masterDataSourceName, final String slaveDataSourceName) throws SQLException { - return new MasterSlaveDataSource( - masterSlaveDataSourceMap, new MasterSlaveRule(name, masterDataSourceName, Collections.singleton(slaveDataSourceName)), Collections.emptyMap()); + private MasterSlaveDataSource getMasterSlaveDataSource( + final Map masterSlaveDataSourceMap, final String name, final String masterDataSourceName, final String slaveDataSourceName) throws SQLException { + MasterSlaveRuleConfiguration config = new MasterSlaveRuleConfiguration(); + config.setName(name); + config.setMasterDataSourceName(masterDataSourceName); + config.setSlaveDataSourceNames(Collections.singleton(slaveDataSourceName)); + return new MasterSlaveDataSource(masterSlaveDataSourceMap, config, Collections.emptyMap()); } @After diff --git a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/connection/ShardingConnectionTest.java b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/connection/ShardingConnectionTest.java index ff70c25981..398bd51730 100644 --- a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/connection/ShardingConnectionTest.java +++ b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/connection/ShardingConnectionTest.java @@ -17,13 +17,13 @@ package io.shardingjdbc.core.jdbc.core.connection; +import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; import io.shardingjdbc.core.api.config.ShardingRuleConfiguration; import io.shardingjdbc.core.api.config.TableRuleConfiguration; import io.shardingjdbc.core.constant.SQLType; import io.shardingjdbc.core.fixture.TestDataSource; import io.shardingjdbc.core.jdbc.core.ShardingContext; import io.shardingjdbc.core.jdbc.core.datasource.MasterSlaveDataSource; -import io.shardingjdbc.core.rule.MasterSlaveRule; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; @@ -54,8 +54,11 @@ public final class ShardingConnectionTest { Map dataSourceMap = new HashMap<>(2, 1); dataSourceMap.put("test_ds_master", masterDataSource); dataSourceMap.put("test_ds_slave", slaveDataSource); - masterSlaveDataSource = new MasterSlaveDataSource( - dataSourceMap, new MasterSlaveRule("test_ds", "test_ds_master", Collections.singletonList("test_ds_slave")), Collections.emptyMap()); + MasterSlaveRuleConfiguration config = new MasterSlaveRuleConfiguration(); + config.setName("test_ds"); + config.setMasterDataSourceName("test_ds_master"); + config.setSlaveDataSourceNames(Collections.singletonList("test_ds_slave")); + masterSlaveDataSource = new MasterSlaveDataSource(dataSourceMap, config, Collections.emptyMap()); ((TestDataSource) slaveDataSource).setThrowExceptionWhenClosing(true); } diff --git a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/datasource/MasterSlaveDataSourceTest.java b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/datasource/MasterSlaveDataSourceTest.java index 8315ed1ef5..58cb964fd8 100644 --- a/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/datasource/MasterSlaveDataSourceTest.java +++ b/sharding-jdbc-core/src/test/java/io/shardingjdbc/core/jdbc/core/datasource/MasterSlaveDataSourceTest.java @@ -20,7 +20,6 @@ package io.shardingjdbc.core.jdbc.core.datasource; import io.shardingjdbc.core.api.HintManager; import io.shardingjdbc.core.api.MasterSlaveDataSourceFactory; import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; -import io.shardingjdbc.core.rule.MasterSlaveRule; import io.shardingjdbc.core.constant.DatabaseType; import io.shardingjdbc.core.constant.SQLType; import io.shardingjdbc.core.fixture.TestDataSource; @@ -60,8 +59,11 @@ public final class MasterSlaveDataSourceTest { Map dataSourceMap = new HashMap<>(2, 1); dataSourceMap.put("test_ds_master", masterDataSource); dataSourceMap.put("test_ds_slave", slaveDataSource); - masterSlaveDataSource = new MasterSlaveDataSource( - dataSourceMap, new MasterSlaveRule("test_ds", "test_ds_master", Collections.singletonList("test_ds_slave")), Collections.emptyMap()); + MasterSlaveRuleConfiguration config = new MasterSlaveRuleConfiguration(); + config.setName("test_ds"); + config.setMasterDataSourceName("test_ds_master"); + config.setSlaveDataSourceNames(Collections.singletonList("test_ds_slave")); + masterSlaveDataSource = new MasterSlaveDataSource(dataSourceMap, config, Collections.emptyMap()); } @Before diff --git a/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/main/java/io/shardingjdbc/orchestration/spring/datasource/SpringMasterSlaveDataSource.java b/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/main/java/io/shardingjdbc/orchestration/spring/datasource/SpringMasterSlaveDataSource.java index c198e2626f..2b3a792977 100644 --- a/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/main/java/io/shardingjdbc/orchestration/spring/datasource/SpringMasterSlaveDataSource.java +++ b/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/main/java/io/shardingjdbc/orchestration/spring/datasource/SpringMasterSlaveDataSource.java @@ -19,8 +19,8 @@ package io.shardingjdbc.orchestration.spring.datasource; import io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithm; import io.shardingjdbc.core.api.algorithm.masterslave.MasterSlaveLoadBalanceAlgorithmType; +import io.shardingjdbc.core.api.config.MasterSlaveRuleConfiguration; import io.shardingjdbc.core.jdbc.core.datasource.MasterSlaveDataSource; -import io.shardingjdbc.core.rule.MasterSlaveRule; import javax.sql.DataSource; import java.sql.SQLException; @@ -37,11 +37,21 @@ public class SpringMasterSlaveDataSource extends MasterSlaveDataSource { public SpringMasterSlaveDataSource(final Map dataSourceMap, final String name, final String masterDataSourceName, final Collection slaveDataSourceNames, final MasterSlaveLoadBalanceAlgorithm strategy) throws SQLException { - super(dataSourceMap, new MasterSlaveRule(name, masterDataSourceName, slaveDataSourceNames, strategy), Collections.emptyMap()); + super(dataSourceMap, getMasterSlaveRuleConfiguration(name, masterDataSourceName, slaveDataSourceNames, strategy), Collections.emptyMap()); } public SpringMasterSlaveDataSource(final Map dataSourceMap, final String name, final String masterDataSourceName, final Collection slaveDataSourceNames, final MasterSlaveLoadBalanceAlgorithmType strategyType) throws SQLException { - super(dataSourceMap, new MasterSlaveRule(name, masterDataSourceName, slaveDataSourceNames, strategyType.getAlgorithm()), Collections.emptyMap()); + super(dataSourceMap, getMasterSlaveRuleConfiguration(name, masterDataSourceName, slaveDataSourceNames, strategyType.getAlgorithm()), Collections.emptyMap()); + } + + private static MasterSlaveRuleConfiguration getMasterSlaveRuleConfiguration( + final String name, final String masterDataSourceName, final Collection slaveDataSourceNames, final MasterSlaveLoadBalanceAlgorithm loadBalanceAlgorithm) { + MasterSlaveRuleConfiguration result = new MasterSlaveRuleConfiguration(); + result.setName(name); + result.setMasterDataSourceName(masterDataSourceName); + result.setSlaveDataSourceNames(slaveDataSourceNames); + result.setLoadBalanceAlgorithm(loadBalanceAlgorithm); + return result; } } diff --git a/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/main/java/io/shardingjdbc/orchestration/spring/namespace/parser/OrchestrationMasterSlaveDataSourceBeanDefinitionParser.java b/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/main/java/io/shardingjdbc/orchestration/spring/namespace/parser/OrchestrationMasterSlaveDataSourceBeanDefinitionParser.java index 99121d186e..d18d8c7522 100644 --- a/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/main/java/io/shardingjdbc/orchestration/spring/namespace/parser/OrchestrationMasterSlaveDataSourceBeanDefinitionParser.java +++ b/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/main/java/io/shardingjdbc/orchestration/spring/namespace/parser/OrchestrationMasterSlaveDataSourceBeanDefinitionParser.java @@ -75,7 +75,7 @@ public class OrchestrationMasterSlaveDataSourceBeanDefinitionParser extends Abst private AbstractBeanDefinition getOrchestrationSpringMasterSlaveDataSourceBean(final Element element, final ParserContext parserContext) { BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(OrchestrationMasterSlaveDataSource.class); factory.addConstructorArgValue(parseDataSources(element)); - factory.addConstructorArgValue(parseMasterSlaveRuleConfig(element, parserContext)); + factory.addConstructorArgValue(parseMasterSlaveRuleConfig(element)); factory.addConstructorArgValue(parseConfigMap(element, parserContext, factory.getBeanDefinition())); factory.addConstructorArgValue(parseOrchestrationConfiguration(element)); factory.setInitMethodName("init"); @@ -101,16 +101,17 @@ public class OrchestrationMasterSlaveDataSourceBeanDefinitionParser extends Abst return element.getAttribute("registry-center-ref"); } - private BeanDefinition parseMasterSlaveRuleConfig(final Element element, final ParserContext parserContext) { + private BeanDefinition parseMasterSlaveRuleConfig(final Element element) { BeanDefinitionBuilder factory = BeanDefinitionBuilder.rootBeanDefinition(MasterSlaveRuleConfiguration.class); factory.addPropertyValue("name", parseId(element)); factory.addPropertyValue("masterDataSourceName", parseMasterDataSourceRef(element)); factory.addPropertyValue("slaveDataSourceNames", parseSlaveDataSources(element)); String strategyRef = parseStrategyRef(element); + MasterSlaveLoadBalanceAlgorithmType strategyType = parseStrategyType(element); if (!Strings.isNullOrEmpty(strategyRef)) { - factory.addPropertyValue("loadBalanceAlgorithmClassName", parserContext.getRegistry().getBeanDefinition(strategyRef).getBeanClassName()); - } else { - factory.addPropertyValue("loadBalanceAlgorithmType", parseStrategyType(element)); + factory.addPropertyReference("loadBalanceAlgorithm", strategyRef); + } else if (null != strategyType) { + factory.addPropertyValue("loadBalanceAlgorithm", strategyType.getAlgorithm()); } return factory.getBeanDefinition(); } @@ -136,7 +137,7 @@ public class OrchestrationMasterSlaveDataSourceBeanDefinitionParser extends Abst private MasterSlaveLoadBalanceAlgorithmType parseStrategyType(final Element element) { String result = element.getAttribute(MasterSlaveDataSourceBeanDefinitionParserTag.STRATEGY_TYPE_ATTRIBUTE); - return Strings.isNullOrEmpty(result) ? MasterSlaveLoadBalanceAlgorithmType.getDefaultAlgorithmType() : MasterSlaveLoadBalanceAlgorithmType.valueOf(result); + return Strings.isNullOrEmpty(result) ? null : MasterSlaveLoadBalanceAlgorithmType.valueOf(result); } private Map parseConfigMap(final Element element, final ParserContext parserContext, final BeanDefinition beanDefinition) { diff --git a/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/test/java/io/shardingjdbc/orchestration/spring/OrchestrationMasterSlaveNamespaceTest.java b/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/test/java/io/shardingjdbc/orchestration/spring/OrchestrationMasterSlaveNamespaceTest.java index 1be8a90453..b11f6097f5 100644 --- a/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/test/java/io/shardingjdbc/orchestration/spring/OrchestrationMasterSlaveNamespaceTest.java +++ b/sharding-jdbc-orchestration-spring/sharding-jdbc-orchestration-spring-namespace/src/test/java/io/shardingjdbc/orchestration/spring/OrchestrationMasterSlaveNamespaceTest.java @@ -65,15 +65,15 @@ public class OrchestrationMasterSlaveNamespaceTest extends AbstractJUnit4SpringC public void assertTypeMasterSlaveDataSource() { MasterSlaveRule randomSlaveRule = getMasterSlaveRule("randomMasterSlaveDataSource"); MasterSlaveRule roundRobinSlaveRule = getMasterSlaveRule("roundRobinMasterSlaveDataSource"); - assertTrue(randomSlaveRule.getStrategy() instanceof RandomMasterSlaveLoadBalanceAlgorithm); - assertTrue(roundRobinSlaveRule.getStrategy() instanceof RoundRobinMasterSlaveLoadBalanceAlgorithm); + assertTrue(randomSlaveRule.getLoadBalanceAlgorithm() instanceof RandomMasterSlaveLoadBalanceAlgorithm); + assertTrue(roundRobinSlaveRule.getLoadBalanceAlgorithm() instanceof RoundRobinMasterSlaveLoadBalanceAlgorithm); } @Test public void assertRefMasterSlaveDataSource() { MasterSlaveLoadBalanceAlgorithm randomStrategy = this.applicationContext.getBean("randomStrategy", MasterSlaveLoadBalanceAlgorithm.class); MasterSlaveRule masterSlaveRule = getMasterSlaveRule("refMasterSlaveDataSource"); - assertTrue(EqualsBuilder.reflectionEquals(masterSlaveRule.getStrategy(), randomStrategy)); + assertTrue(EqualsBuilder.reflectionEquals(masterSlaveRule.getLoadBalanceAlgorithm(), randomStrategy)); } private MasterSlaveRule getMasterSlaveRule(final String masterSlaveDataSourceName) { diff --git a/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/OrchestrationFacade.java b/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/OrchestrationFacade.java index 3fd59469ab..89fc2fcc54 100644 --- a/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/OrchestrationFacade.java +++ b/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/OrchestrationFacade.java @@ -145,7 +145,7 @@ public final class OrchestrationFacade implements AutoCloseable { result.setName(masterSlaveDataSource.getMasterSlaveRule().getName()); result.setMasterDataSourceName(masterSlaveDataSource.getMasterSlaveRule().getMasterDataSourceName()); result.setSlaveDataSourceNames(masterSlaveDataSource.getMasterSlaveRule().getSlaveDataSourceNames()); - result.setLoadBalanceAlgorithmClassName(masterSlaveDataSource.getMasterSlaveRule().getStrategy().getClass().getName()); + result.setLoadBalanceAlgorithm(masterSlaveDataSource.getMasterSlaveRule().getLoadBalanceAlgorithm()); return result; } diff --git a/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/OrchestrationMasterSlaveDataSource.java b/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/OrchestrationMasterSlaveDataSource.java index 432dd20e3f..fbd1265323 100644 --- a/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/OrchestrationMasterSlaveDataSource.java +++ b/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/OrchestrationMasterSlaveDataSource.java @@ -44,7 +44,7 @@ public class OrchestrationMasterSlaveDataSource extends MasterSlaveDataSource im public OrchestrationMasterSlaveDataSource(final Map dataSourceMap, final MasterSlaveRuleConfiguration masterSlaveRuleConfig, final Map configMap, final OrchestrationConfiguration config) throws SQLException { - super(dataSourceMap, masterSlaveRuleConfig.build(), configMap); + super(dataSourceMap, masterSlaveRuleConfig, configMap); orchestrationFacade = new OrchestrationFacade(config); this.dataSourceMap = dataSourceMap; this.masterSlaveRuleConfig = masterSlaveRuleConfig; diff --git a/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/config/ConfigurationListenerManager.java b/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/config/ConfigurationListenerManager.java index 3b03b2da59..2e8ad08790 100644 --- a/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/config/ConfigurationListenerManager.java +++ b/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/config/ConfigurationListenerManager.java @@ -84,7 +84,7 @@ public final class ConfigurationListenerManager implements ListenerManager { @Override public void onChange(final DataChangedEvent event) { if (DataChangedEvent.Type.UPDATED == event.getEventType()) { - masterSlaveDataSource.renew(dataSourceService.getAvailableDataSources(), dataSourceService.getAvailableMasterSlaveRuleConfiguration().build()); + masterSlaveDataSource.renew(dataSourceService.getAvailableDataSources(), dataSourceService.getAvailableMasterSlaveRuleConfiguration()); } } }); diff --git a/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/state/datasource/DataSourceListenerManager.java b/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/state/datasource/DataSourceListenerManager.java index abc2d6cec2..c1b1ac63c6 100644 --- a/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/state/datasource/DataSourceListenerManager.java +++ b/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/state/datasource/DataSourceListenerManager.java @@ -78,7 +78,7 @@ public final class DataSourceListenerManager implements ListenerManager { if (masterSlaveRuleConfiguration.getSlaveDataSourceNames().isEmpty()) { throw new ShardingJdbcException("No available slave datasource, can't apply the configuration!"); } - masterSlaveDataSource.renew(dataSourceService.getAvailableDataSources(), masterSlaveRuleConfiguration.build()); + masterSlaveDataSource.renew(dataSourceService.getAvailableDataSources(), masterSlaveRuleConfiguration); } } }); diff --git a/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/state/instance/InstanceListenerManager.java b/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/state/instance/InstanceListenerManager.java index 4aac6ae1cc..f38d7920a8 100644 --- a/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/state/instance/InstanceListenerManager.java +++ b/sharding-jdbc-orchestration/src/main/java/io/shardingjdbc/orchestration/internal/state/instance/InstanceListenerManager.java @@ -82,7 +82,7 @@ public final class InstanceListenerManager implements ListenerManager { dataSourceMap.put(each, new CircuitBreakerDataSource()); } } - masterSlaveDataSource.renew(dataSourceMap, configService.loadMasterSlaveRuleConfiguration().build()); + masterSlaveDataSource.renew(dataSourceMap, configService.loadMasterSlaveRuleConfiguration()); } } }); -- GitLab