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

commit b47b2777f9125cd7a0084cd211d4afa282e226b4
Author: Albumen Kevin <[email protected]>
AuthorDate: Tue Aug 31 17:09:13 2021 +0800

    Add Callback Service build ProviderModel
---
 .../apache/dubbo/rpc/model/ApplicationModel.java   |  9 +--------
 .../org/apache/dubbo/rpc/model/ConsumerModel.java  | 14 +++++++++++++
 .../org/apache/dubbo/rpc/model/FrameworkModel.java |  4 +---
 .../org/apache/dubbo/rpc/model/ModuleModel.java    |  4 +---
 .../org/apache/dubbo/rpc/model/ProviderModel.java  | 15 ++++++++++++++
 .../org/apache/dubbo/rpc/model/ServiceModel.java   |  5 ++++-
 .../org/apache/dubbo/config/ReferenceConfig.java   |  2 +-
 .../org/apache/dubbo/config/ServiceConfig.java     |  1 +
 .../dubbo/registry/client/InstanceAddressURL.java  |  7 ++-----
 .../rpc/protocol/dubbo/CallbackServiceCodec.java   | 23 ++++++++++++++++++----
 10 files changed, 59 insertions(+), 25 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 3af7956..da9591e 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
@@ -246,13 +246,6 @@ public class ApplicationModel extends ScopeModel {
 
     @Override
     public String toString() {
-        return "ApplicationModel{" +
-            "moduleModels=" + moduleModels +
-            ", initFlag=" + initFlag +
-            ", environment=" + environment +
-            ", configManager=" + configManager +
-            ", serviceRepository=" + serviceRepository +
-            ", frameworkModel=" + frameworkModel +
-            '}';
+        return "ApplicationModel";
     }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java
index f6df44d..444b85a 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java
@@ -71,6 +71,20 @@ public class ConsumerModel extends ServiceModel {
         this.methodConfigs = methodConfigs == null ? new HashMap<>() : 
methodConfigs;
     }
 
+    public ConsumerModel(String serviceKey,
+                         Object proxyObject,
+                         ServiceDescriptor serviceModel,
+                         ReferenceConfigBase<?> referenceConfig,
+                         ModuleModel moduleModel,
+                         ServiceMetadata metadata,
+                         Map<String, AsyncMethodInfo> methodConfigs) {
+
+        super(proxyObject, serviceKey, serviceModel, referenceConfig, 
moduleModel, metadata);
+        Assert.notEmptyString(serviceKey, "Service name can't be null or 
blank");
+
+        this.methodConfigs = methodConfigs == null ? new HashMap<>() : 
methodConfigs;
+    }
+
     public AsyncMethodInfo getMethodConfig(String methodName) {
         return methodConfigs.get(methodName);
     }
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 8dee53d..7b3740f 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
@@ -68,8 +68,6 @@ public class FrameworkModel extends ScopeModel {
 
     @Override
     public String toString() {
-        return "FrameworkModel{" +
-            "applicationModels=" + applicationModels +
-            '}';
+        return "FrameworkModel";
     }
 }
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 284d31a..e9757f3 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
@@ -39,8 +39,6 @@ public class ModuleModel extends ScopeModel {
 
     @Override
     public String toString() {
-        return "ModuleModel{" +
-            "applicationModel=" + applicationModel +
-            '}';
+        return "ModuleModel";
     }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java
index 2aab894..235f7a5 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java
@@ -60,6 +60,21 @@ public class ProviderModel extends ServiceModel {
         this.urls = new ArrayList<>(1);
     }
 
+    public ProviderModel(String serviceKey,
+                         Object serviceInstance,
+                         ServiceDescriptor serviceModel,
+                         ServiceConfigBase<?> serviceConfig,
+                         ModuleModel moduleModel,
+                         ServiceMetadata serviceMetadata) {
+        super(serviceInstance, serviceKey, serviceModel, serviceConfig, 
moduleModel, serviceMetadata);
+        if (null == serviceInstance) {
+            throw new IllegalArgumentException("Service[" + serviceKey + 
"]Target is NULL.");
+        }
+
+        initMethod(serviceModel.getServiceInterfaceClass());
+        this.urls = new ArrayList<>(1);
+    }
+
     public Object getServiceInstance() {
         return getProxyObject();
     }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java
index 92c6fdc..35bf5e3 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ServiceModel.java
@@ -38,10 +38,13 @@ public class ServiceModel {
     }
 
     public ServiceModel(Object proxyObject, String serviceKey, 
ServiceDescriptor serviceModel, AbstractInterfaceConfig config, ServiceMetadata 
serviceMetadata) {
+        this(proxyObject, serviceKey, serviceModel, config, 
ScopeModelUtil.getModuleModel(config != null ? config.getScopeModel() : null), 
serviceMetadata);
+    }
+    public ServiceModel(Object proxyObject, String serviceKey, 
ServiceDescriptor serviceModel, AbstractInterfaceConfig config, ModuleModel 
moduleModel, ServiceMetadata serviceMetadata) {
         this.proxyObject = proxyObject;
         this.serviceKey = serviceKey;
         this.serviceModel = serviceModel;
-        this.moduleModel = ScopeModelUtil.getModuleModel(config != null ? 
config.getScopeModel() : null);
+        this.moduleModel = moduleModel;
         this.config = config;
         this.serviceMetadata = serviceMetadata;
     }
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index 171745f..c66202f 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
@@ -260,7 +260,7 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
         ServiceRepository repository = 
getApplicationModel().getApplicationServiceRepository();
         ServiceDescriptor serviceDescriptor = 
repository.registerService(interfaceClass);
         consumerModel = new ConsumerModel(serviceMetadata.getServiceKey(), 
proxy, serviceDescriptor, this,
-            serviceMetadata, createAsyncMethodInfo());
+            getScopeModel(), serviceMetadata, createAsyncMethodInfo());
 
         repository.registerConsumer(consumerModel);
 
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index 8423ef0..7ce2e3f 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
@@ -362,6 +362,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
             ref,
             serviceDescriptor,
             this,
+            getScopeModel(),
             serviceMetadata);
 
         repository.registerProvider(providerModel);
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java
index fb41ba7..506dcd2 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/InstanceAddressURL.java
@@ -22,7 +22,6 @@ import org.apache.dubbo.common.url.component.URLParam;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.metadata.MetadataInfo;
 import org.apache.dubbo.rpc.RpcContext;
-import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ScopeModel;
 import org.apache.dubbo.rpc.model.ServiceModel;
 
@@ -396,14 +395,12 @@ public class InstanceAddressURL extends URL {
 
     @Override
     public ScopeModel getScopeModel() {
-        URL consumerUrl = RpcContext.getServiceContext().getConsumerUrl();
-        return consumerUrl != null ? consumerUrl.getScopeModel() : 
ApplicationModel.defaultModel().getDefaultModule();
+        return RpcContext.getServiceContext().getConsumerUrl().getScopeModel();
     }
 
     @Override
     public ServiceModel getServiceModel() {
-        URL consumerUrl = RpcContext.getServiceContext().getConsumerUrl();
-        return consumerUrl != null ? consumerUrl.getServiceModel() : null;
+        return 
RpcContext.getServiceContext().getConsumerUrl().getServiceModel();
     }
 
     @Override
diff --git 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
index deaeec9..7c5ce8c 100644
--- 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.rpc.protocol.dubbo;
 
+import org.apache.dubbo.common.BaseServiceMetadata;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.bytecode.Wrapper;
 import org.apache.dubbo.common.extension.ExtensionLoader;
@@ -33,7 +34,11 @@ import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.ProxyFactory;
 import org.apache.dubbo.rpc.RpcInvocation;
+import org.apache.dubbo.rpc.model.ModuleModel;
+import org.apache.dubbo.rpc.model.ProviderModel;
 import org.apache.dubbo.rpc.model.ScopeModelUtil;
+import org.apache.dubbo.rpc.model.ServiceDescriptor;
+import org.apache.dubbo.rpc.model.ServiceMetadata;
 
 import java.io.IOException;
 import java.util.HashMap;
@@ -93,7 +98,7 @@ class CallbackServiceCodec {
      * @throws IOException
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
-    private static String exportOrUnexportCallbackService(Channel channel, URL 
url, Class clazz, Object inst, Boolean export) throws IOException {
+    private static String exportOrUnexportCallbackService(Channel channel, 
RpcInvocation inv, URL url, Class clazz, Object inst, Boolean export) throws 
IOException {
         int instid = System.identityHashCode(inst);
 
         Map<String, String> params = new HashMap<>(3);
@@ -129,7 +134,17 @@ class CallbackServiceCodec {
             // one channel can have multiple callback instances, no need to 
re-export for different instance.
             if (!channel.hasAttribute(cacheKey)) {
                 if (!isInstancesOverLimit(channel, url, clazz.getName(), 
instid, false)) {
-                    
ScopeModelUtil.getApplicationModel(url.getScopeModel()).getApplicationServiceRepository().registerService(clazz);
+                    ModuleModel moduleModel = 
ScopeModelUtil.getModuleModel(inv.getServiceModel().getModuleModel());
+                    ServiceDescriptor serviceDescriptor = 
ScopeModelUtil.getApplicationModel(moduleModel).getApplicationServiceRepository().registerService(clazz);
+                    ProviderModel providerModel = new 
ProviderModel(BaseServiceMetadata.buildServiceKey(exportUrl.getPath(), group, 
exportUrl.getVersion()),
+                        inst,
+                        serviceDescriptor,
+                        null,
+                        moduleModel,
+                        new ServiceMetadata(clazz.getName() + "." + instid, 
exportUrl.getGroup(), exportUrl.getVersion(), clazz));
+                    
moduleModel.getApplicationModel().getApplicationServiceRepository().registerProvider(providerModel);
+                    exportUrl = exportUrl.setScopeModel(moduleModel);
+                    exportUrl = exportUrl.setServiceModel(providerModel);
                     Invoker<?> invoker = PROXY_FACTORY.getInvoker(inst, clazz, 
exportUrl);
                     // should destroy resource?
                     Exporter<?> exporter = PROTOCOL.export(invoker);
@@ -276,10 +291,10 @@ class CallbackServiceCodec {
         Class<?>[] pts = inv.getParameterTypes();
         switch (callbackStatus) {
             case CallbackServiceCodec.CALLBACK_CREATE:
-                inv.setAttachment(INV_ATT_CALLBACK_KEY + paraIndex, 
exportOrUnexportCallbackService(channel, url, pts[paraIndex], args[paraIndex], 
true));
+                inv.setAttachment(INV_ATT_CALLBACK_KEY + paraIndex, 
exportOrUnexportCallbackService(channel, inv,  url, pts[paraIndex], 
args[paraIndex], true));
                 return null;
             case CallbackServiceCodec.CALLBACK_DESTROY:
-                inv.setAttachment(INV_ATT_CALLBACK_KEY + paraIndex, 
exportOrUnexportCallbackService(channel, url, pts[paraIndex], args[paraIndex], 
false));
+                inv.setAttachment(INV_ATT_CALLBACK_KEY + paraIndex, 
exportOrUnexportCallbackService(channel, inv,  url, pts[paraIndex], 
args[paraIndex], false));
                 return null;
             default:
                 return args[paraIndex];

Reply via email to