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

jefflv pushed a commit to branch 3.x-dev
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/3.x-dev by this push:
     new b4755a0  make consumerModel's construct before refer (#3534)
b4755a0 is described below

commit b4755a061f493b97d4b602d19e6b1244454e57b5
Author: jefflv <[email protected]>
AuthorDate: Fri Feb 22 10:26:20 2019 +0800

    make consumerModel's construct before refer (#3534)
    
    * make consumerModel's construct before refer
    
    * group maybe modify during running time
    
    * make sure the value of attribute is not nul
---
 .../java/org/apache/dubbo/common/Constants.java    |  6 +++++
 .../org/apache/dubbo/config/ReferenceConfig.java   | 13 +++++++---
 .../dubbo/rpc/model/ConsumerMethodModel.java       | 29 +++++++++++-----------
 .../org/apache/dubbo/rpc/model/ConsumerModel.java  |  5 ++--
 .../apache/dubbo/rpc/model/ServiceMetadata.java    | 16 +++++++++---
 .../rpc/protocol/dubbo/filter/FutureFilter.java    |  2 +-
 .../rpc/protocol/dubbo/ImplicitCallBackTest.java   | 15 ++++++-----
 7 files changed, 57 insertions(+), 29 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
index 18ef778..9b4e259 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
@@ -807,6 +807,12 @@ public class Constants {
      * Production environment key.
      */
     public static final String PRODUCTION_ENVIRONMENT = "product";
+
+    /**
+     * Consumer side 's proxy class
+     */
+    public static final String PROXY_CLASS_REF = "refClass";
+
     /*
      * private Constants(){ }
      */
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 8f9c1e1..4d89a4a 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
@@ -36,6 +36,7 @@ import org.apache.dubbo.rpc.cluster.directory.StaticDirectory;
 import org.apache.dubbo.rpc.cluster.support.ClusterUtils;
 import org.apache.dubbo.rpc.cluster.support.RegistryAwareCluster;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.ConsumerMethodModel;
 import org.apache.dubbo.rpc.model.ConsumerModel;
 import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;
 import org.apache.dubbo.rpc.service.GenericService;
@@ -251,6 +252,10 @@ public class ReferenceConfig<T> extends 
AbstractReferenceConfig {
         initialized = true;
         checkStubAndLocal(interfaceClass);
         checkMock(interfaceClass);
+
+        ConsumerModel consumerModel = new ConsumerModel(interfaceName, group, 
version, interfaceClass);
+        ApplicationModel.initConsumerModel(getUniqueServiceName(), 
consumerModel);
+
         Map<String, String> map = new HashMap<String, String>();
 
         map.put(Constants.SIDE_KEY, Constants.CONSUMER_SIDE);
@@ -286,7 +291,10 @@ public class ReferenceConfig<T> extends 
AbstractReferenceConfig {
                         map.put(methodConfig.getName() + ".retries", "0");
                     }
                 }
-                attributes.put(methodConfig.getName(), 
convertMethodConfig2AyncInfo(methodConfig));
+                ConsumerMethodModel.AsyncMethodInfo asyncMethodInfo = 
convertMethodConfig2AyncInfo(methodConfig);
+                if (asyncMethodInfo != null) {
+                    
consumerModel.getMethodModel(methodConfig.getName()).addAttribute(Constants.ASYNC_KEY,
 asyncMethodInfo);
+                }
             }
         }
 
@@ -300,8 +308,7 @@ public class ReferenceConfig<T> extends 
AbstractReferenceConfig {
 
         ref = createProxy(map);
 
-        ConsumerModel consumerModel = new ConsumerModel(interfaceName, group, 
version, interfaceClass, interfaceClass.getMethods(), attributes);
-        ApplicationModel.initConsumerModel(getUniqueServiceName(), 
consumerModel);
+        
consumerModel.getServiceMetadata().addAttribute(Constants.PROXY_CLASS_REF, ref);
     }
 
     @SuppressWarnings({"unchecked", "rawtypes", "deprecation"})
diff --git 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerMethodModel.java
 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerMethodModel.java
index 3d597f4..97e962e 100644
--- 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerMethodModel.java
+++ 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerMethodModel.java
@@ -19,7 +19,6 @@ package org.apache.dubbo.rpc.model;
 import org.apache.dubbo.common.Constants;
 
 import java.lang.reflect.Method;
-import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
@@ -35,9 +34,7 @@ public class ConsumerMethodModel {
 
     private final ConcurrentMap<String, Object> attributeMap = new 
ConcurrentHashMap<>();
 
-    private final AsyncMethodInfo asyncInfo;
-
-    public ConsumerMethodModel(Method method, Map<String, Object> attributes) {
+    public ConsumerMethodModel(Method method) {
         this.method = method;
         this.parameterClasses = method.getParameterTypes();
         this.returnClass = method.getReturnType();
@@ -45,28 +42,32 @@ public class ConsumerMethodModel {
         this.methodName = method.getName();
         this.generic = methodName.equals(Constants.$INVOKE) && parameterTypes 
!= null && parameterTypes.length == 3;
 
-        if (attributes != null) {
-            asyncInfo = (AsyncMethodInfo) attributes.get(methodName);
-        } else {
-            asyncInfo = null;
-        }
     }
 
     public Method getMethod() {
         return method;
     }
 
-    public ConcurrentMap<String, Object> getAttributeMap() {
-        return attributeMap;
+//    public ConcurrentMap<String, Object> getAttributeMap() {
+//        return attributeMap;
+//    }
+
+    public void addAttribute(String key, Object value) {
+        this.attributeMap.put(key, value);
     }
 
+    public Object getAttribute(String key) {
+        return this.attributeMap.get(key);
+    }
+
+
     public Class<?> getReturnClass() {
         return returnClass;
     }
 
-    public AsyncMethodInfo getAsyncInfo() {
-        return asyncInfo;
-    }
+//    public AsyncMethodInfo getAsyncInfo() {
+//        return (AsyncMethodInfo) attributeMap.get(Constants.ASYNC_KEY);
+//    }
 
     public String getMethodName() {
         return methodName;
diff --git 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java
 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java
index 039e627..42d23a5 100644
--- 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java
+++ 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java
@@ -30,11 +30,12 @@ public class ConsumerModel {
     private final ServiceMetadata serviceMetadata;
     private final Map<Method, ConsumerMethodModel> methodModels = new 
IdentityHashMap<Method, ConsumerMethodModel>();
 
-    public ConsumerModel(String serviceName, String group, String version, 
Class<?> interfaceClass, Method[] methods, Map<String, Object> attributes) {
+    public ConsumerModel(String serviceName, String group, String version, 
Class<?> interfaceClass) {
         this.serviceMetadata = new ServiceMetadata(serviceName, group, 
version, interfaceClass);
 
+        Method[] methods = interfaceClass.getMethods();
         for (Method method : methods) {
-            methodModels.put(method, new ConsumerMethodModel(method, 
attributes));
+            methodModels.put(method, new ConsumerMethodModel(method));
         }
     }
 
diff --git 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ServiceMetadata.java
 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ServiceMetadata.java
index bb3f326..7ce7b9b 100644
--- 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ServiceMetadata.java
+++ 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ServiceMetadata.java
@@ -27,10 +27,12 @@ public class ServiceMetadata {
 
     private final String serviceKey;
     private final String serviceInterfaceName;
-    private final String group;
+    private final String defaultGroup;
     private final String version;
     private final Class<?> serviceType;
 
+    private volatile String group;
+
     /* will be transferred to remote side */
     private final Map<String, Object> attachments = new 
ConcurrentHashMap<String, Object>();
     /* used locally*/
@@ -38,6 +40,7 @@ public class ServiceMetadata {
 
     public ServiceMetadata(String serviceInterfaceName, String group, String 
version, Class<?> serviceType) {
         this.serviceInterfaceName = serviceInterfaceName;
+        this.defaultGroup = group;
         this.group = group;
         this.version = version;
         this.serviceKey = serviceInterfaceName + ":" + version;
@@ -72,12 +75,19 @@ public class ServiceMetadata {
         return serviceInterfaceName;
     }
 
-    public String getGroup() {
-        return group;
+    public String getDefaultGroup() {
+        return defaultGroup;
     }
 
     public String getVersion() {
         return version;
     }
 
+    public String getGroup() {
+        return group;
+    }
+
+    public void setGroup(String group) {
+        this.group = group;
+    }
 }
diff --git 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/filter/FutureFilter.java
 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/filter/FutureFilter.java
index a4c6b09..4f2c173 100644
--- 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/filter/FutureFilter.java
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/filter/FutureFilter.java
@@ -210,7 +210,7 @@ public class FutureFilter implements Filter {
         if (methodModel == null) {
             return null;
         }
-        final ConsumerMethodModel.AsyncMethodInfo asyncMethodInfo = 
methodModel.getAsyncInfo();
+        final ConsumerMethodModel.AsyncMethodInfo asyncMethodInfo = 
(ConsumerMethodModel.AsyncMethodInfo) 
methodModel.getAttribute(Constants.ASYNC_KEY);
         if (asyncMethodInfo == null) {
             return null;
         }
diff --git 
a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ImplicitCallBackTest.java
 
b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ImplicitCallBackTest.java
index 2c1baa6..9f8a39e 100644
--- 
a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ImplicitCallBackTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ImplicitCallBackTest.java
@@ -112,8 +112,9 @@ public class ImplicitCallBackTest {
         ConsumerMethodModel.AsyncMethodInfo asyncMethodInfo = new 
ConsumerMethodModel.AsyncMethodInfo();
         asyncMethodInfo.setOnthrowInstance(notify);
         asyncMethodInfo.setOnthrowMethod(onThrowMethod);
-        attitudes.put("get", asyncMethodInfo);
-        ApplicationModel.initConsumerModel(consumerUrl.getServiceKey(), new 
ConsumerModel(consumerUrl.getServiceInterface(), "Dubbo", "1.0.0", 
IDemoService.class, IDemoService.class.getMethods(), attitudes));
+        ConsumerModel consumerModel = new 
ConsumerModel(consumerUrl.getServiceInterface(), "Dubbo", "1.0.0", 
IDemoService.class);
+        consumerModel.getMethodModel("get").addAttribute(Constants.ASYNC_KEY, 
asyncMethodInfo);
+        ApplicationModel.initConsumerModel(consumerUrl.getServiceKey(), 
consumerModel);
     }
 
     
//================================================================================================
@@ -123,8 +124,9 @@ public class ImplicitCallBackTest {
         ConsumerMethodModel.AsyncMethodInfo asyncMethodInfo = new 
ConsumerMethodModel.AsyncMethodInfo();
         asyncMethodInfo.setOnreturnInstance(notify);
         asyncMethodInfo.setOnreturnMethod(onReturnMethod);
-        attitudes.put("get", asyncMethodInfo);
-        ApplicationModel.initConsumerModel(consumerUrl.getServiceKey(), new 
ConsumerModel(consumerUrl.getServiceInterface(), "Dubbo", "1.0.0", 
IDemoService.class, IDemoService.class.getMethods(), attitudes));
+        ConsumerModel consumerModel = new 
ConsumerModel(consumerUrl.getServiceInterface(), "Dubbo", "1.0.0", 
IDemoService.class);
+        consumerModel.getMethodModel("get").addAttribute(Constants.ASYNC_KEY, 
asyncMethodInfo);
+        ApplicationModel.initConsumerModel(consumerUrl.getServiceKey(), 
consumerModel);
     }
 
     public void initImplicitCallBackURL_onlyOninvoke() throws Exception {
@@ -132,8 +134,9 @@ public class ImplicitCallBackTest {
         ConsumerMethodModel.AsyncMethodInfo asyncMethodInfo = new 
ConsumerMethodModel.AsyncMethodInfo();
         asyncMethodInfo.setOninvokeInstance(notify);
         asyncMethodInfo.setOninvokeMethod(onInvokeMethod);
-        attitudes.put("get", asyncMethodInfo);
-        ApplicationModel.initConsumerModel(consumerUrl.getServiceKey(), new 
ConsumerModel(consumerUrl.getServiceInterface(), "Dubbo", "1.0.0", 
IDemoService.class, IDemoService.class.getMethods(), attitudes));
+        ConsumerModel consumerModel = new 
ConsumerModel(consumerUrl.getServiceInterface(), "Dubbo", "1.0.0", 
IDemoService.class);
+        consumerModel.getMethodModel("get").addAttribute(Constants.ASYNC_KEY, 
asyncMethodInfo);
+        ApplicationModel.initConsumerModel(consumerUrl.getServiceKey(), 
consumerModel);
     }
 
     @Test

Reply via email to