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) {

Reply via email to