You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2020/07/02 07:20:49 UTC

[shardingsphere-elasticjob-lite] branch master updated: Associated original data source switching for spring boot (#892)

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 <54...@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;
     }
 }