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;
}
}