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