This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.1
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.1 by this push:
new 031016ec60 Add refresh system properties logic (#11086)
031016ec60 is described below
commit 031016ec600411f2ea9d7d5f07a37475a46f0519
Author: huazhongming <[email protected]>
AuthorDate: Thu Dec 8 17:46:06 2022 +0800
Add refresh system properties logic (#11086)
---
.../apache/dubbo/common/config/Environment.java | 2 +-
.../dubbo/common/config/SystemConfiguration.java | 35 ++++++++++++++++++++--
.../common/config/SystemConfigurationTest.java | 5 ++--
.../dubbo/config/context/ConfigManagerTest.java | 21 +++++++++----
.../dubbo/config/bootstrap/MultiInstanceTest.java | 2 +-
5 files changed, 54 insertions(+), 11 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
index de7ec54b9a..785eb11e8e 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
@@ -81,7 +81,7 @@ public class Environment extends LifecycleAdapter implements
ApplicationExt {
public void initialize() throws IllegalStateException {
if (initialized.compareAndSet(false, true)) {
this.propertiesConfiguration = new
PropertiesConfiguration(scopeModel);
- this.systemConfiguration = new SystemConfiguration();
+ this.systemConfiguration = new SystemConfiguration(scopeModel);
this.environmentConfiguration = new EnvironmentConfiguration();
this.externalConfiguration = new
InmemoryConfiguration("ExternalConfig");
this.appExternalConfiguration = new
InmemoryConfiguration("AppExternalConfig");
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
index 9ea3c207b6..e1cb9d0c7e 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
@@ -17,8 +17,18 @@
package org.apache.dubbo.common.config;
+import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
+import org.apache.dubbo.rpc.model.ScopeModel;
+import org.apache.dubbo.rpc.model.ScopeModelUtil;
+
import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
/**
* FIXME: is this really necessary? PropertiesConfiguration should have
already covered this:
@@ -28,8 +38,23 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public class SystemConfiguration implements Configuration {
+ private static final ErrorTypeAwareLogger logger =
LoggerFactory.getErrorTypeAwareLogger(SystemConfiguration.class);
+
private final Map<String, Object> cache = new ConcurrentHashMap<>();
+ private final ScheduledExecutorService sharedScheduledExecutor;
+
+ public SystemConfiguration(ScopeModel scopeModel) {
+ sharedScheduledExecutor =
ScopeModelUtil.getFrameworkModel(scopeModel).getBeanFactory()
+
.getBean(FrameworkExecutorRepository.class).getSharedScheduledExecutor();
+ sharedScheduledExecutor.scheduleWithFixedDelay(() -> {
+ if (!cache.isEmpty()) {
+ Set<String> keys = cache.keySet();
+ keys.forEach((key) -> overwriteCache(key,
System.getProperty(key)));
+ }
+ }, 60000, 60000, TimeUnit.MILLISECONDS);
+ }
+
@Override
public Object getInternalProperty(String key) {
if (cache.containsKey(key)) {
@@ -72,8 +97,14 @@ public class SystemConfiguration implements Configuration {
}
-
public Map<String, String> getProperties() {
- return (Map) System.getProperties();
+ Properties properties = System.getProperties();
+ Map<String, String> res = new ConcurrentHashMap<>(properties.size());
+ try {
+ res.putAll((Map) properties);
+ } catch (Exception e) {
+ logger.warn("System property get failed", e);
+ }
+ return res;
}
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/SystemConfigurationTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/SystemConfigurationTest.java
index ddb1dfde58..67050f40d6 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/SystemConfigurationTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/SystemConfigurationTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.dubbo.common.config;
+import org.apache.dubbo.rpc.model.ApplicationModel;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
@@ -44,7 +45,7 @@ class SystemConfigurationTest {
@BeforeEach
public void init() {
- sysConfig = new SystemConfiguration();
+ sysConfig = new
SystemConfiguration(ApplicationModel.defaultModel().getDefaultModule());
}
/**
@@ -114,4 +115,4 @@ class SystemConfigurationTest {
MockTwo
}
-}
\ No newline at end of file
+}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
index aaa7fc604d..de5bff64f1 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
@@ -393,22 +393,33 @@ class ConfigManagerTest {
@Test
void testLoadConfigsOfTypeFromProps() {
try {
+ System.setProperty("dubbo.protocols.dubbo1.port", "20880");
+ System.setProperty("dubbo.protocols.dubbo2.port", "20881");
+ System.setProperty("dubbo.protocols.rest1.port", "8080");
+ System.setProperty("dubbo.protocols.rest2.port", "8081");
+
+ ApplicationModel.defaultModel().destroy();
+ ApplicationModel applicationModel =
ApplicationModel.defaultModel();
+ configManager = applicationModel.getApplicationConfigManager();
+ moduleConfigManager =
applicationModel.getDefaultModule().getConfigManager();
+
// dubbo.application.enable-file-cache = false
configManager.loadConfigsOfTypeFromProps(ApplicationConfig.class);
Optional<ApplicationConfig> application =
configManager.getApplication();
Assertions.assertTrue(application.isPresent());
configManager.removeConfig(application.get());
- System.setProperty("dubbo.protocols.dubbo1.port", "20880");
- System.setProperty("dubbo.protocols.dubbo2.port", "20881");
- System.setProperty("dubbo.protocols.rest1.port", "8080");
- System.setProperty("dubbo.protocols.rest2.port", "8081");
configManager.loadConfigsOfTypeFromProps(ProtocolConfig.class);
Collection<ProtocolConfig> protocols =
configManager.getProtocols();
Assertions.assertEquals(protocols.size(), 4);
System.setProperty("dubbo.applications.app1.name", "app-demo1");
System.setProperty("dubbo.applications.app2.name", "app-demo2");
+
+ ApplicationModel.defaultModel().destroy();
+ applicationModel = ApplicationModel.defaultModel();
+ configManager = applicationModel.getApplicationConfigManager();
+ moduleConfigManager =
applicationModel.getDefaultModule().getConfigManager();
try {
configManager.loadConfigsOfTypeFromProps(ApplicationConfig.class);
Assertions.fail();
@@ -456,4 +467,4 @@ class ConfigManagerTest {
Assertions.assertFalse(moduleConfigManager.getConsumers().isEmpty());
}
-}
\ No newline at end of file
+}
diff --git
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
index 4ddcb4450f..2737b75c14 100644
---
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
+++
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/MultiInstanceTest.java
@@ -375,7 +375,7 @@ class MultiInstanceTest {
// stop provider app 2 and check threads
providerBootstrap2.stop();
// shutdown register center after dubbo application to avoid
unregister services blocking
- checkUnclosedThreadsOfApp(stackTraces2, "Found unclosed threads of
app 2: ", null);
+ checkUnclosedThreadsOfApp(stackTraces2, "Found unclosed threads of
app 2: ", new String[]{"Dubbo-framework-shared-scheduler"});
} finally {
if (providerBootstrap1 != null) {