This is an automated email from the ASF dual-hosted git repository. zhangliang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/shardingsphere-elasticjob-lite.git
The following commit(s) were added to refs/heads/master by this push: new beef86d Associated original data source switching for spring boot (#892) beef86d is described below commit beef86de20629093a827abd991399a1b06ddbf91 Author: Long Chen <544409...@qq.com> AuthorDate: Thu Jul 2 15:20:41 2020 +0800 Associated original data source switching for spring boot (#892) * Support for dynamic switching of data source base on spring boot * Associated original data source switching for spring boot * Remove dependence mysql-connector-java --- .../console/config/DynamicDataSourceConfig.java | 38 +++++++++++++------- .../lite/console/domain/DataSourceFactory.java | 41 ++++++++++++++++++++++ .../domain/EventTraceDataSourceConfiguration.java | 3 +- .../domain/EventTraceDataSourceFactory.java | 10 +++--- ...entTraceDataSourceConfigurationServiceImpl.java | 17 +++++++-- .../SessionEventTraceDataSourceConfiguration.java | 2 ++ 6 files changed, 90 insertions(+), 21 deletions(-) diff --git a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/config/DynamicDataSourceConfig.java b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/config/DynamicDataSourceConfig.java index 4e44a6f..99a1b31 100644 --- a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/config/DynamicDataSourceConfig.java +++ b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/config/DynamicDataSourceConfig.java @@ -19,7 +19,9 @@ package org.apache.shardingsphere.elasticjob.lite.console.config; import java.util.HashMap; import java.util.Map; + import javax.sql.DataSource; + import org.apache.commons.dbcp.BasicDataSource; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; @@ -42,6 +44,8 @@ public class DynamicDataSourceConfig { public static final String DATASOURCE_PASSWORD = "spring.datasource.default.password"; + public static final String DEFAULT_DATASOURCE_NAME = "default"; + /** * Declare dynamicDataSource instead of default dataSource. * @param environment spring environment @@ -52,13 +56,12 @@ public class DynamicDataSourceConfig { public DynamicDataSource dynamicDataSource(final Environment environment) { DataSource defaultDataSource = createDefaultDataSource(environment); DynamicDataSource dynamicDataSource = new DynamicDataSource(); - dynamicDataSource.dataSourceMap.put("default", defaultDataSource); - dynamicDataSource.setTargetDataSources(dynamicDataSource.dataSourceMap); + dynamicDataSource.addDataSource(DEFAULT_DATASOURCE_NAME, defaultDataSource); dynamicDataSource.setDefaultTargetDataSource(defaultDataSource); return dynamicDataSource; } - private static DataSource createDefaultDataSource(final Environment environment) { + private DataSource createDefaultDataSource(final Environment environment) { String driverName = environment.getProperty(DRIVER_CLASS_NAME); String url = environment.getProperty(DATASOURCE_URL); String username = environment.getProperty(DATASOURCE_USERNAME); @@ -69,25 +72,28 @@ public class DynamicDataSourceConfig { public static class DynamicDataSource extends AbstractRoutingDataSource { - private final Map<Object, Object> dataSourceMap = new HashMap<>(); + private final Map<Object, Object> dataSourceMap = new HashMap<>(10); @Override protected Object determineCurrentLookupKey() { return DynamicDataSourceContextHolder.getDataSourceName(); } - } - - public static class DynamicDataSourceContextHolder { - - private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>(); /** - * Specify a dataSource. + * Add a data source. * @param dataSourceName data source name + * @param dataSource data source */ - public static void setDataSourceName(final String dataSourceName) { - CONTEXT_HOLDER.set(dataSourceName); + public void addDataSource(final String dataSourceName, final DataSource dataSource) { + dataSourceMap.put(dataSourceName, dataSource); + setTargetDataSources(dataSourceMap); + afterPropertiesSet(); } + } + + public static class DynamicDataSourceContextHolder { + + private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>(); /** * Get the specify dataSource. @@ -96,5 +102,13 @@ public class DynamicDataSourceConfig { public static String getDataSourceName() { return CONTEXT_HOLDER.get(); } + + /** + * Specify a dataSource. + * @param dataSourceName data source name + */ + public static void setDataSourceName(final String dataSourceName) { + CONTEXT_HOLDER.set(dataSourceName); + } } } diff --git a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/DataSourceFactory.java b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/DataSourceFactory.java new file mode 100644 index 0000000..a25b7d4 --- /dev/null +++ b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/DataSourceFactory.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.apache.shardingsphere.elasticjob.lite.console.domain; + +import javax.sql.DataSource; + +import org.apache.commons.dbcp.BasicDataSource; +import org.springframework.boot.jdbc.DataSourceBuilder; + +/** + * Dynamic data source factory. + */ +public final class DataSourceFactory { + + /** + * Create a DataSource. + * @param config event trace data source config + * @return data source + */ + public static DataSource createDataSource(final EventTraceDataSourceConfiguration config) { + // Determine whether the data source is valid. + new EventTraceDataSource(config).init(); + return DataSourceBuilder.create().type(BasicDataSource.class).driverClassName(config.getDriver()).url(config.getUrl()) + .username(config.getUsername()).password(config.getPassword()).build(); + } +} diff --git a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/EventTraceDataSourceConfiguration.java b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/EventTraceDataSourceConfiguration.java index a8b8870..93e3d26 100644 --- a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/EventTraceDataSourceConfiguration.java +++ b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/EventTraceDataSourceConfiguration.java @@ -57,9 +57,10 @@ public final class EventTraceDataSourceConfiguration implements Serializable { @XmlAttribute private boolean activated; - public EventTraceDataSourceConfiguration(final String driver, final String url, final String username) { + public EventTraceDataSourceConfiguration(final String driver, final String url, final String username, final String password) { this.driver = driver; this.url = url; this.username = username; + this.password = password; } } diff --git a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/EventTraceDataSourceFactory.java b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/EventTraceDataSourceFactory.java index 4a25b8d..f43b302 100644 --- a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/EventTraceDataSourceFactory.java +++ b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/domain/EventTraceDataSourceFactory.java @@ -17,16 +17,17 @@ package org.apache.shardingsphere.elasticjob.lite.console.domain; +import java.util.concurrent.ConcurrentHashMap; + import com.google.common.base.Charsets; import com.google.common.base.Strings; import com.google.common.hash.HashCode; import com.google.common.hash.Hasher; import com.google.common.hash.Hashing; + import lombok.AccessLevel; import lombok.NoArgsConstructor; -import java.util.concurrent.ConcurrentHashMap; - /** * Event trace data source factory. */ @@ -57,10 +58,7 @@ public final class EventTraceDataSourceFactory { if (null != result) { return result; } - EventTraceDataSourceConfiguration eventTraceDataSourceConfiguration = new EventTraceDataSourceConfiguration(driverClassName, url, username); - if (null != password) { - eventTraceDataSourceConfiguration.setPassword(password); - } + EventTraceDataSourceConfiguration eventTraceDataSourceConfiguration = new EventTraceDataSourceConfiguration(driverClassName, url, username, password); result = new EventTraceDataSource(eventTraceDataSourceConfiguration); result.init(); DATA_SOURCE_REGISTRY.put(hashCode, result); diff --git a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/service/impl/EventTraceDataSourceConfigurationServiceImpl.java b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/service/impl/EventTraceDataSourceConfigurationServiceImpl.java index ba920dc..6ef8ff8 100644 --- a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/service/impl/EventTraceDataSourceConfigurationServiceImpl.java +++ b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/service/impl/EventTraceDataSourceConfigurationServiceImpl.java @@ -17,16 +17,22 @@ package org.apache.shardingsphere.elasticjob.lite.console.service.impl; +import java.util.Optional; + +import javax.sql.DataSource; + +import org.apache.shardingsphere.elasticjob.lite.console.config.DynamicDataSourceConfig.DynamicDataSource; +import org.apache.shardingsphere.elasticjob.lite.console.config.DynamicDataSourceConfig.DynamicDataSourceContextHolder; +import org.apache.shardingsphere.elasticjob.lite.console.domain.DataSourceFactory; import org.apache.shardingsphere.elasticjob.lite.console.domain.EventTraceDataSourceConfiguration; import org.apache.shardingsphere.elasticjob.lite.console.domain.EventTraceDataSourceConfigurations; import org.apache.shardingsphere.elasticjob.lite.console.domain.GlobalConfiguration; import org.apache.shardingsphere.elasticjob.lite.console.repository.ConfigurationsXmlRepository; import org.apache.shardingsphere.elasticjob.lite.console.repository.impl.ConfigurationsXmlRepositoryImpl; import org.apache.shardingsphere.elasticjob.lite.console.service.EventTraceDataSourceConfigurationService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Optional; - /** * Event trace data source configuration service implementation. */ @@ -34,6 +40,9 @@ import java.util.Optional; public final class EventTraceDataSourceConfigurationServiceImpl implements EventTraceDataSourceConfigurationService { private ConfigurationsXmlRepository configurationsXmlRepository = new ConfigurationsXmlRepositoryImpl(); + + @Autowired + private DynamicDataSource dynamicDataSource; @Override public EventTraceDataSourceConfigurations loadAll() { @@ -45,6 +54,8 @@ public final class EventTraceDataSourceConfigurationServiceImpl implements Event GlobalConfiguration configs = loadGlobal(); EventTraceDataSourceConfiguration result = find(name, configs.getEventTraceDataSourceConfigurations()); setActivated(configs, result); + // Activate the dataSource by data source name for spring boot + DynamicDataSourceContextHolder.setDataSourceName(name); return result; } @@ -90,6 +101,8 @@ public final class EventTraceDataSourceConfigurationServiceImpl implements Event if (result) { configurationsXmlRepository.save(configs); } + DataSource dataSource = DataSourceFactory.createDataSource(config); + dynamicDataSource.addDataSource(config.getName(), dataSource); return result; } diff --git a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/util/SessionEventTraceDataSourceConfiguration.java b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/util/SessionEventTraceDataSourceConfiguration.java index fdc0ca4..ce26b1f 100644 --- a/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/util/SessionEventTraceDataSourceConfiguration.java +++ b/elastic-job-lite-console/src/main/java/org/apache/shardingsphere/elasticjob/lite/console/util/SessionEventTraceDataSourceConfiguration.java @@ -17,6 +17,7 @@ package org.apache.shardingsphere.elasticjob.lite.console.util; +import org.apache.shardingsphere.elasticjob.lite.console.config.DynamicDataSourceConfig.DynamicDataSourceContextHolder; import org.apache.shardingsphere.elasticjob.lite.console.domain.EventTraceDataSourceConfiguration; import lombok.AccessLevel; @@ -45,6 +46,7 @@ public final class SessionEventTraceDataSourceConfiguration { * @param eventTraceDataSourceConfiguration event trace data source configuration */ public static void setDataSourceConfiguration(final EventTraceDataSourceConfiguration eventTraceDataSourceConfiguration) { + DynamicDataSourceContextHolder.setDataSourceName(eventTraceDataSourceConfiguration.getName()); SessionEventTraceDataSourceConfiguration.eventTraceDataSourceConfiguration = eventTraceDataSourceConfiguration; } }