You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/08/29 01:59:29 UTC

[dubbo] branch 3.0-multi-instances updated: Resolve recursive creation of Scope Model

This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0-multi-instances
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0-multi-instances by this push:
     new 37a9995  Resolve recursive creation of Scope Model
37a9995 is described below

commit 37a9995732fd4f41f365ba30fb182918c7ffeedb
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Sun Aug 29 09:59:09 2021 +0800

    Resolve recursive creation of Scope Model
---
 .../org/apache/dubbo/rpc/model/ApplicationModel.java     | 16 +++++++++++++---
 .../java/org/apache/dubbo/rpc/model/FrameworkModel.java  | 15 ++++++++++++---
 .../java/org/apache/dubbo/rpc/model/ModuleModel.java     |  8 +++++++-
 .../main/java/org/apache/dubbo/rpc/model/ScopeModel.java | 13 +++++++++++++
 .../rpc/model/ScopeModelAwareExtensionProcessor.java     |  7 ++++---
 5 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
index 0ccfff4..22e54f3 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
@@ -62,17 +62,27 @@ public class ApplicationModel extends ScopeModel {
     private FrameworkModel frameworkModel;
 
     public ApplicationModel(FrameworkModel frameworkModel) {
+        this(frameworkModel, true);
+    }
+
+    public ApplicationModel(FrameworkModel frameworkModel, boolean shouldInit) {
         super(frameworkModel, new ExtensionDirector(frameworkModel.getExtensionDirector(), ExtensionScope.APPLICATION));
         this.frameworkModel = frameworkModel;
         frameworkModel.addApplication(this);
-        postProcessAfterCreated();
+
+        if (shouldInit) {
+            postConstruct();
+        }
     }
 
     public static ApplicationModel defaultModel() {
-        if (defaultInstance == null) {
+        if (defaultInstance == null || !defaultInstance.isReady()) {
             synchronized (ApplicationModel.class) {
                 if (defaultInstance == null) {
-                    defaultInstance = new ApplicationModel(FrameworkModel.defaultModel());
+                    defaultInstance = new ApplicationModel(FrameworkModel.defaultModel(), false);
+                }
+                if (!defaultInstance.isReady()) {
+                    defaultInstance.postConstruct();
                 }
             }
         }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
index 438c465..e097605 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
@@ -37,15 +37,24 @@ public class FrameworkModel extends ScopeModel {
     private List<ApplicationModel> applicationModels = Collections.synchronizedList(new ArrayList<>());
 
     public FrameworkModel() {
+        this(true);
+    }
+
+    public FrameworkModel(boolean shouldInit) {
         super(null, new ExtensionDirector(null, ExtensionScope.FRAMEWORK));
-        postProcessAfterCreated();
+        if (shouldInit) {
+            postConstruct();
+        }
     }
 
     public static FrameworkModel defaultModel() {
-        if (defaultInstance == null) {
+        if (defaultInstance == null || !defaultInstance.isReady()) {
             synchronized (FrameworkModel.class) {
                 if (defaultInstance == null) {
-                    defaultInstance = new FrameworkModel();
+                    defaultInstance = new FrameworkModel(false);
+                }
+                if (!defaultInstance.isReady()) {
+                    defaultInstance.postConstruct();
                 }
             }
         }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
index 0ddb8b9..b5141e9 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
@@ -27,10 +27,16 @@ public class ModuleModel extends ScopeModel {
     private final ApplicationModel applicationModel;
 
     public ModuleModel(ApplicationModel applicationModel) {
+        this(applicationModel, true);
+    }
+
+    public ModuleModel(ApplicationModel applicationModel, boolean shouldInit) {
         super(applicationModel, new ExtensionDirector(applicationModel.getExtensionDirector(), ExtensionScope.MODULE));
         this.applicationModel = applicationModel;
         applicationModel.addModule(this);
-        postProcessAfterCreated();
+        if(shouldInit) {
+            postConstruct();
+        }
     }
 
     public ApplicationModel getApplicationModel() {
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
index 5d96f11..76751e3 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
 import org.apache.dubbo.common.extension.ExtensionAccessor;
 import org.apache.dubbo.common.extension.ExtensionDirector;
 
+import javax.annotation.PostConstruct;
 import java.util.Set;
 
 public abstract class ScopeModel implements ExtensionAccessor {
@@ -30,6 +31,8 @@ public abstract class ScopeModel implements ExtensionAccessor {
 
     private final ScopeBeanFactory beanFactory;
 
+    private volatile boolean ready = false;
+
     public ScopeModel(ScopeModel parent, ExtensionDirector extensionDirector) {
         this.parent = parent;
         this.extensionDirector = extensionDirector;
@@ -37,6 +40,16 @@ public abstract class ScopeModel implements ExtensionAccessor {
         this.beanFactory = new ScopeBeanFactory(parent!=null?parent.getBeanFactory():null, extensionDirector);
     }
 
+    @PostConstruct
+    public void postConstruct() {
+        postProcessAfterCreated();
+        ready = true;
+    }
+
+    public boolean isReady() {
+        return ready;
+    }
+
     public ExtensionDirector getExtensionDirector() {
         return extensionDirector;
     }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessor.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessor.java
index 4c47c22..f586037 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessor.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModelAwareExtensionProcessor.java
@@ -18,25 +18,26 @@ package org.apache.dubbo.rpc.model;
 
 import org.apache.dubbo.common.extension.ExtensionPostProcessor;
 
+import java.util.concurrent.atomic.AtomicBoolean;
+
 public class ScopeModelAwareExtensionProcessor implements ExtensionPostProcessor {
     private ScopeModel scopeModel;
     private FrameworkModel frameworkModel;
     private ApplicationModel applicationModel;
     private ModuleModel moduleModel;
-    private volatile boolean inited;
+    private final AtomicBoolean inited = new AtomicBoolean(false);
 
     public ScopeModelAwareExtensionProcessor(ScopeModel scopeModel) {
         this.scopeModel = scopeModel;
     }
 
     private void init() {
-        if (inited) {
+        if (!inited.compareAndSet(false, true)) {
             return;
         }
         frameworkModel = ScopeModelUtil.getFrameworkModel(scopeModel);
         applicationModel = ScopeModelUtil.getApplicationModel(scopeModel);
         moduleModel = ScopeModelUtil.getModuleModel(scopeModel);
-        inited = true;
     }
 
     @Override