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];
