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