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

victory pushed a commit to branch 2.7.0-release
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/2.7.0-release by this push:
     new a93e96c  [Dubbo-3226] guarantee interoperability with 2.6.x and lower 
versions (#3229)
a93e96c is described below

commit a93e96c15f225fdad11f2135b27c6944c8a189a2
Author: ken.lj <[email protected]>
AuthorDate: Tue Jan 15 14:35:13 2019 +0800

    [Dubbo-3226] guarantee interoperability with 2.6.x and lower versions 
(#3229)
    
    * guarantee interoperability with 2.6.x and lower versions
    
    * fix unit test, also adjust comments to fit with the code style
    
    * change condition in isFramework270OrHigher() to 'version >= 2.7.0.0'
---
 .../dubbo/rpc/cluster/support/ClusterUtils.java    |  7 ++++
 .../java/org/apache/dubbo/common/Constants.java    |  8 ++---
 .../main/java/org/apache/dubbo/common/Version.java | 39 +++++++++++++++++++---
 .../apache/dubbo/common/version/VersionTest.java   | 28 ++++++++++++++++
 .../dubbo/config/AbstractInterfaceConfig.java      |  2 +-
 .../rpc/protocol/http/HttpRemoteInvocation.java    | 24 ++++---------
 .../dubbo/rpc/protocol/http/HttpProtocol.java      | 23 ++++++++++++-
 .../dubbo/rpc/protocol/http/HttpProtocolTest.java  | 16 ++++-----
 .../rpc/protocol/rmi/RmiRemoteInvocation.java      | 33 +++++++++---------
 .../apache/dubbo/rpc/protocol/rmi/RmiProtocol.java | 19 ++++++++---
 10 files changed, 142 insertions(+), 57 deletions(-)

diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/ClusterUtils.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/ClusterUtils.java
index da5e04d..8901e4c 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/ClusterUtils.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/ClusterUtils.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.cluster.support;
 
 import org.apache.dubbo.common.Constants;
 import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.StringUtils;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -81,8 +82,14 @@ public class ClusterUtils {
             // So, generally, we don't need to care about the group value here.
             // But when comes to group merger, there is an exception, the 
consumer group may be '*' while the provider group can be empty or any other 
values.
             String remoteGroup = map.get(Constants.GROUP_KEY);
+            String remoteRelease = map.get(Constants.RELEASE_KEY);
             map.putAll(localMap);
             map.put(Constants.GROUP_KEY, remoteGroup);
+            // we should always keep the Provider RELEASE_KEY not overrode by 
the the value on Consumer side.
+            map.remove(Constants.RELEASE_KEY);
+            if (StringUtils.isNotEmpty(remoteRelease)) {
+                map.put(Constants.RELEASE_KEY, remoteRelease);
+            }
         }
         if (remoteMap != null && remoteMap.size() > 0) {
             // Use version passed from provider side
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 c5e1248..18ef778 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
@@ -751,9 +751,9 @@ public class Constants {
 
     public static final String COMPATIBLE_CONFIG_KEY = "compatible_config";
     // package version in the manifest
-    public static final String SPECIFICATION_VERSION_KEY = "specVersion";
+    public static final String RELEASE_KEY = "release";
 
-    public static final String OVERRIDE_PROVIDERS_KEY = "providerAddreses";
+    public static final String OVERRIDE_PROVIDERS_KEY = "providerAddresses";
 
     public static final String PROTOCOLS_SUFFIX = "dubbo.protocols.";
 
@@ -762,9 +762,9 @@ public class Constants {
     public static final String REGISTRIES_SUFFIX = "dubbo.registries.";
 
     public static final String[] DEFAULT_REGISTER_PROVIDER_KEYS = 
{APPLICATION_KEY, CODEC_KEY, EXCHANGER_KEY, SERIALIZATION_KEY, CLUSTER_KEY, 
CONNECTIONS_KEY, DEPRECATED_KEY,
-            GROUP_KEY, LOADBALANCE_KEY, MOCK_KEY, PATH_KEY, TIMEOUT_KEY, 
TOKEN_KEY, VERSION_KEY, WARMUP_KEY, WEIGHT_KEY, TIMESTAMP_KEY, 
DUBBO_VERSION_KEY, SPECIFICATION_VERSION_KEY};
+            GROUP_KEY, LOADBALANCE_KEY, MOCK_KEY, PATH_KEY, TIMEOUT_KEY, 
TOKEN_KEY, VERSION_KEY, WARMUP_KEY, WEIGHT_KEY, TIMESTAMP_KEY, 
DUBBO_VERSION_KEY, RELEASE_KEY};
 
-    public static final String[] DEFAULT_REGISTER_CONSUMER_KEYS = 
{APPLICATION_KEY, VERSION_KEY, GROUP_KEY, DUBBO_VERSION_KEY, 
SPECIFICATION_VERSION_KEY};
+    public static final String[] DEFAULT_REGISTER_CONSUMER_KEYS = 
{APPLICATION_KEY, VERSION_KEY, GROUP_KEY, DUBBO_VERSION_KEY, RELEASE_KEY};
 
     public static final String TELNET = "telnet";
 
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/Version.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/Version.java
index 9e5893f..4c5ef9c 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/Version.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/Version.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.common;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.ClassHelper;
+import org.apache.dubbo.common.utils.StringUtils;
 
 import java.net.URL;
 import java.security.CodeSource;
@@ -41,9 +42,10 @@ public final class Version {
 
     /**
      * For protocol compatibility purpose.
-     * Because {@link #isSupportResponseAttachment} is checked for every call, 
int compare expect to has higher performance than string.
+     * Because {@link #isSupportResponseAttachment} is checked for every call, 
int compare expect to has higher
+     * performance than string.
      */
-    private static final int LOWEST_VERSION_FOR_RESPONSE_ATTACHMENT = 20002; 
// 2.0.2
+    private static final int LOWEST_VERSION_FOR_RESPONSE_ATTACHMENT = 2000200; 
// 2.0.2
     private static final Map<String, Integer> VERSION2INT = new 
HashMap<String, Integer>();
 
     static {
@@ -62,13 +64,38 @@ public final class Version {
         return VERSION;
     }
 
+    /**
+     * To check the framework release version number to decide if it's 2.7.0 
or higher
+     */
+    public static boolean isFramework270OrHigher (String version) {
+        if (StringUtils.isEmpty(version)) {
+            return false;
+        }
+        if (getIntVersion(version) >= 2070000) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * To check the framework release version number to decide if it's 2.6.3 
or higher
+     *
+     * Because response attachments feature is firstly introduced in 2.6.3
+     * and moreover we have no other approach to check the framework version 
number, so we use
+     * isSupportResponseAttachment to decide if it's v2.6.3
+     */
+    public static boolean isFramework263OrHigher (String version) {
+        return isSupportResponseAttachment(version);
+    }
+
     public static boolean isSupportResponseAttachment(String version) {
         if (version == null || version.length() == 0) {
             return false;
         }
-        // for previous dubbo version(2.0.10/020010~2.6.2/020602), this 
version is the jar's version, so they need to be ignore
+        // for previous dubbo version(2.0.10/020010~2.6.2/020602), this 
version is the jar's version, so they need to
+        // be ignore
         int iVersion = getIntVersion(version);
-        if (iVersion >= 20010 && iVersion <= 20602) {
+        if (iVersion >= 2001000 && iVersion <= 2060200) {
             return false;
         }
 
@@ -79,6 +106,10 @@ public final class Version {
         Integer v = VERSION2INT.get(version);
         if (v == null) {
             v = parseInt(version);
+            // e.g., version number 2.6.3 will convert to 2060300
+            if (version.split("\\.").length == 3) {
+                v = v * 100;
+            }
             VERSION2INT.put(version, v);
         }
         return v;
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/version/VersionTest.java 
b/dubbo-common/src/test/java/org/apache/dubbo/common/version/VersionTest.java
index a129f53..032c22d 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/version/VersionTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/version/VersionTest.java
@@ -35,4 +35,32 @@ public class VersionTest {
         Assert.assertTrue(Version.isSupportResponseAttachment("2.0.3"));
         Assert.assertFalse(Version.isSupportResponseAttachment("2.0.0"));
     }
+
+    @Test
+    public void testGetIntVersion() {
+        Assert.assertEquals(2060100, Version.getIntVersion("2.6.1"));
+        Assert.assertEquals(2060101, Version.getIntVersion("2.6.1.1"));
+        Assert.assertEquals(2070001, Version.getIntVersion("2.7.0.1"));
+        Assert.assertEquals(2070000, Version.getIntVersion("2.7.0"));
+    }
+
+    @Test
+    public void testIsFramework270OrHigher() {
+        Assert.assertTrue(Version.isFramework270OrHigher("2.7.0"));
+        Assert.assertTrue(Version.isFramework270OrHigher("2.7.0.1"));
+        Assert.assertTrue(Version.isFramework270OrHigher("2.7.0.2"));
+        Assert.assertTrue(Version.isFramework270OrHigher("2.8.0"));
+        Assert.assertFalse(Version.isFramework270OrHigher("2.6.3"));
+        Assert.assertFalse(Version.isFramework270OrHigher("2.6.3.1"));
+    }
+
+    @Test
+    public void testIsFramework263OrHigher() {
+        Assert.assertTrue(Version.isFramework263OrHigher("2.7.0"));
+        Assert.assertTrue(Version.isFramework263OrHigher("2.7.0.1"));
+        Assert.assertTrue(Version.isFramework263OrHigher("2.6.4"));
+        Assert.assertFalse(Version.isFramework263OrHigher("2.6.2"));
+        Assert.assertFalse(Version.isFramework263OrHigher("2.6.1.1"));
+        Assert.assertTrue(Version.isFramework263OrHigher("2.6.3"));
+    }
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
index d25dfd6..cc311a1 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
@@ -362,7 +362,7 @@ public abstract class AbstractInterfaceConfig extends 
AbstractMethodConfig {
 
     static void appendRuntimeParameters(Map<String, String> map) {
         map.put(Constants.DUBBO_VERSION_KEY, Version.getProtocolVersion());
-        map.put(Constants.SPECIFICATION_VERSION_KEY, Version.getVersion());
+        map.put(Constants.RELEASE_KEY, Version.getVersion());
         map.put(Constants.TIMESTAMP_KEY, 
String.valueOf(System.currentTimeMillis()));
         if (ConfigUtils.getPid() > 0) {
             map.put(Constants.PID_KEY, String.valueOf(ConfigUtils.getPid()));
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/version/VersionTest.java 
b/dubbo-rpc/dubbo-rpc-http/src/main/java/com/alibaba/dubbo/rpc/protocol/http/HttpRemoteInvocation.java
similarity index 57%
copy from 
dubbo-common/src/test/java/org/apache/dubbo/common/version/VersionTest.java
copy to 
dubbo-rpc/dubbo-rpc-http/src/main/java/com/alibaba/dubbo/rpc/protocol/http/HttpRemoteInvocation.java
index a129f53..3e923b6 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/version/VersionTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-http/src/main/java/com/alibaba/dubbo/rpc/protocol/http/HttpRemoteInvocation.java
@@ -14,25 +14,15 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.common.version;
+package com.alibaba.dubbo.rpc.protocol.http;
 
+import org.aopalliance.intercept.MethodInvocation;
 
-import org.apache.dubbo.common.Version;
+@Deprecated
+public class HttpRemoteInvocation extends 
org.apache.dubbo.rpc.protocol.http.HttpRemoteInvocation {
+    private static final long serialVersionUID = 1L;
 
-import org.junit.Assert;
-import org.junit.Test;
-
-public class VersionTest {
-
-    @Test
-    public void testGetProtocolVersion() {
-        Assert.assertEquals(Version.getProtocolVersion(), 
Version.DEFAULT_DUBBO_PROTOCOL_VERSION);
-    }
-
-    @Test
-    public void testSupportResponseAttachment() {
-        Assert.assertTrue(Version.isSupportResponseAttachment("2.0.2"));
-        Assert.assertTrue(Version.isSupportResponseAttachment("2.0.3"));
-        Assert.assertFalse(Version.isSupportResponseAttachment("2.0.0"));
+    public HttpRemoteInvocation(MethodInvocation methodInvocation) {
+        super(methodInvocation);
     }
 }
diff --git 
a/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpProtocol.java
 
b/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpProtocol.java
index ba4bb4f..8246f34 100644
--- 
a/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpProtocol.java
+++ 
b/dubbo-rpc/dubbo-rpc-http/src/main/java/org/apache/dubbo/rpc/protocol/http/HttpProtocol.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.protocol.http;
 
 import org.apache.dubbo.common.Constants;
 import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.Version;
 import org.apache.dubbo.remoting.http.HttpBinder;
 import org.apache.dubbo.remoting.http.HttpHandler;
 import org.apache.dubbo.remoting.http.HttpServer;
@@ -116,7 +117,27 @@ public class HttpProtocol extends AbstractProxyProtocol {
         httpProxyFactoryBean.setRemoteInvocationFactory(new 
RemoteInvocationFactory() {
             @Override
             public RemoteInvocation createRemoteInvocation(MethodInvocation 
methodInvocation) {
-                RemoteInvocation invocation = new 
HttpRemoteInvocation(methodInvocation);
+                RemoteInvocation invocation;
+                /*
+                  package was renamed to 'org.apache.dubbo' in v2.7.0, so only 
provider versions after v2.7.0 can
+                  recognize org.apache.xxx.HttpRemoteInvocation'.
+                 */
+                if 
(Version.isFramework270OrHigher(url.getParameter(Constants.RELEASE_KEY))) {
+                    invocation = new HttpRemoteInvocation(methodInvocation);
+                } else {
+                    /*
+                      The customized 
'com.alibaba.dubbo.rpc.protocol.http.HttpRemoteInvocation' was firstly 
introduced
+                      in v2.6.3. The main purpose is to support transformation 
of attachments in HttpProtocol:
+                      https://github.com/apache/incubator-dubbo/pull/1827. To 
guarantee interoperability with lower
+                      versions, we need to check if the provider is v2.6.3 or 
higher before sending customized
+                      HttpRemoteInvocation.
+                     */
+                    if 
(Version.isFramework263OrHigher(url.getParameter(Constants.DUBBO_VERSION_KEY))) 
{
+                        invocation = new 
com.alibaba.dubbo.rpc.protocol.http.HttpRemoteInvocation(methodInvocation);
+                    } else {
+                        invocation = new RemoteInvocation(methodInvocation);
+                    }
+                }
                 if (isGeneric) {
                     invocation.addAttribute(Constants.GENERIC_KEY, generic);
                 }
diff --git 
a/dubbo-rpc/dubbo-rpc-http/src/test/java/org/apache/dubbo/rpc/protocol/http/HttpProtocolTest.java
 
b/dubbo-rpc/dubbo-rpc-http/src/test/java/org/apache/dubbo/rpc/protocol/http/HttpProtocolTest.java
index 2c75e6d..1ff5438 100644
--- 
a/dubbo-rpc/dubbo-rpc-http/src/test/java/org/apache/dubbo/rpc/protocol/http/HttpProtocolTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-http/src/test/java/org/apache/dubbo/rpc/protocol/http/HttpProtocolTest.java
@@ -46,7 +46,7 @@ public class HttpProtocolTest {
         Assert.assertFalse(server.isCalled());
         ProxyFactory proxyFactory = 
ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
         Protocol protocol = 
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
-        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?version=1.0.0");
+        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?release=2.7.0");
         Exporter<HttpService> exporter = 
protocol.export(proxyFactory.getInvoker(server, HttpService.class, url));
         Invoker<HttpService> invoker = protocol.refer(HttpService.class, url);
         HttpService client = proxyFactory.getProxy(invoker);
@@ -63,7 +63,7 @@ public class HttpProtocolTest {
         Assert.assertFalse(server.isCalled());
         ProxyFactory proxyFactory = 
ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
         Protocol protocol = 
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
-        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?version=1.0.0");
+        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?release=2.7.0");
         Exporter<HttpService> exporter = 
protocol.export(proxyFactory.getInvoker(server, HttpService.class, url));
         Invoker<GenericService> invoker = protocol.refer(GenericService.class, 
url);
         GenericService client = proxyFactory.getProxy(invoker, true);
@@ -80,7 +80,7 @@ public class HttpProtocolTest {
         Assert.assertFalse(server.isCalled());
         ProxyFactory proxyFactory = 
ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
         Protocol protocol = 
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
-        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?version=1.0.0&generic=nativejava");
+        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?release=2.7.0&generic=nativejava");
         Exporter<HttpService> exporter = 
protocol.export(proxyFactory.getInvoker(server, HttpService.class, url));
         Invoker<GenericService> invoker = protocol.refer(GenericService.class, 
url);
         GenericService client = proxyFactory.getProxy(invoker);
@@ -107,7 +107,7 @@ public class HttpProtocolTest {
         Assert.assertFalse(server.isCalled());
         ProxyFactory proxyFactory = 
ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
         Protocol protocol = 
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
-        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?version=1.0.0&generic=bean");
+        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?release=2.7.0&generic=bean");
         Exporter<HttpService> exporter = 
protocol.export(proxyFactory.getInvoker(server, HttpService.class, url));
         Invoker<GenericService> invoker = protocol.refer(GenericService.class, 
url);
         GenericService client = proxyFactory.getProxy(invoker);
@@ -127,7 +127,7 @@ public class HttpProtocolTest {
         Assert.assertFalse(server.isCalled());
         ProxyFactory proxyFactory = 
ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
         Protocol protocol = 
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
-        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + 
"?version=1.0.0&hessian.overload.method=true&hessian2.request=false");
+        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + 
"?release=2.7.0&hessian.overload.method=true&hessian2.request=false");
         Exporter<HttpService> exporter = 
protocol.export(proxyFactory.getInvoker(server, HttpService.class, url));
         Invoker<HttpService> invoker = protocol.refer(HttpService.class, url);
         HttpService client = proxyFactory.getProxy(invoker);
@@ -145,7 +145,7 @@ public class HttpProtocolTest {
         Assert.assertFalse(server.isCalled());
         ProxyFactory proxyFactory = 
ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
         Protocol protocol = 
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
-        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?version=1.0.0&client=simple");
+        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?release=2.7.0&client=simple");
         Exporter<HttpService> exporter = 
protocol.export(proxyFactory.getInvoker(server, HttpService.class, url));
         Invoker<HttpService> invoker = protocol.refer(HttpService.class, url);
         HttpService client = proxyFactory.getProxy(invoker);
@@ -161,7 +161,7 @@ public class HttpProtocolTest {
         HttpServiceImpl server = new HttpServiceImpl();
         ProxyFactory proxyFactory = 
ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
         Protocol protocol = 
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
-        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?version=1.0.0&timeout=10");
+        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?release=2.7.0&timeout=10");
         Exporter<HttpService> exporter = 
protocol.export(proxyFactory.getInvoker(server, HttpService.class, url));
         Invoker<HttpService> invoker = protocol.refer(HttpService.class, url);
         HttpService client = proxyFactory.getProxy(invoker);
@@ -182,7 +182,7 @@ public class HttpProtocolTest {
         HttpServiceImpl server = new HttpServiceImpl();
         ProxyFactory proxyFactory = 
ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
         Protocol protocol = 
ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
-        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?version=1.0.0");
+        URL url = URL.valueOf("http://127.0.0.1:5342/"; + 
HttpService.class.getName() + "?release=2.7.0");
         Exporter<HttpService> exporter = 
protocol.export(proxyFactory.getInvoker(server, HttpService.class, url));
         Invoker<HttpService> invoker = protocol.refer(HttpService.class, url);
         HttpService client = proxyFactory.getProxy(invoker);
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/version/VersionTest.java 
b/dubbo-rpc/dubbo-rpc-rmi/src/main/java/com/alibaba/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java
similarity index 57%
copy from 
dubbo-common/src/test/java/org/apache/dubbo/common/version/VersionTest.java
copy to 
dubbo-rpc/dubbo-rpc-rmi/src/main/java/com/alibaba/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java
index a129f53..04efd9e 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/version/VersionTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-rmi/src/main/java/com/alibaba/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java
@@ -14,25 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.common.version;
+package com.alibaba.dubbo.rpc.protocol.rmi;
 
+import org.aopalliance.intercept.MethodInvocation;
 
-import org.apache.dubbo.common.Version;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-public class VersionTest {
-
-    @Test
-    public void testGetProtocolVersion() {
-        Assert.assertEquals(Version.getProtocolVersion(), 
Version.DEFAULT_DUBBO_PROTOCOL_VERSION);
-    }
-
-    @Test
-    public void testSupportResponseAttachment() {
-        Assert.assertTrue(Version.isSupportResponseAttachment("2.0.2"));
-        Assert.assertTrue(Version.isSupportResponseAttachment("2.0.3"));
-        Assert.assertFalse(Version.isSupportResponseAttachment("2.0.0"));
+/**
+ *
+ */
+@Deprecated
+public class RmiRemoteInvocation extends 
org.apache.dubbo.rpc.protocol.rmi.RmiRemoteInvocation {
+    private static final long serialVersionUID = 1L;
+    /**
+     * executed on consumer side
+     *
+     * @param methodInvocation
+     */
+    public RmiRemoteInvocation(MethodInvocation methodInvocation) {
+        super(methodInvocation);
     }
 }
diff --git 
a/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiProtocol.java
 
b/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiProtocol.java
index 8a28cc0..5f8b02af 100644
--- 
a/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiProtocol.java
+++ 
b/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiProtocol.java
@@ -18,7 +18,6 @@ package org.apache.dubbo.rpc.protocol.rmi;
 
 import org.apache.dubbo.common.Constants;
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.Version;
 import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.protocol.AbstractProxyProtocol;
 
@@ -30,6 +29,9 @@ import java.io.IOException;
 import java.net.SocketTimeoutException;
 import java.rmi.RemoteException;
 
+import static org.apache.dubbo.common.Version.isFramework263OrHigher;
+import static org.apache.dubbo.common.Version.isFramework270OrHigher;
+
 /**
  * RmiProtocol.
  */
@@ -74,10 +76,19 @@ public class RmiProtocol extends AbstractProxyProtocol {
     @SuppressWarnings("unchecked")
     protected <T> T doRefer(final Class<T> serviceType, final URL url) throws 
RpcException {
         final RmiProxyFactoryBean rmiProxyFactoryBean = new 
RmiProxyFactoryBean();
-        // RMI needs extra parameter since it uses customized remote 
invocation object
-        if (url.getParameter(Constants.DUBBO_VERSION_KEY, 
Version.getProtocolVersion()).equals(Version.getProtocolVersion())) {
-            // Check dubbo version on provider, this feature only support
+        /*
+          RMI needs extra parameter since it uses customized remote invocation 
object
+
+          The customized RemoteInvocation was firstly introduced in v2.6.3; 
The package was renamed to 'org.apache.*'
+          Considering the above two conditions, we need to check before 
sending customized RemoteInvocation:
+          1. if the provider version is v2.7.0 or higher, send 
'org.apache.dubbo.rpc.protocol.rmi.RmiRemoteInvocation'.
+          2. if the provider version is v2.6.3 or higher, send 
'com.alibaba.dubbo.rpc.protocol.rmi.RmiRemoteInvocation'.
+          3. if the provider version is lower than v2.6.3, does not use 
customized RemoteInvocation.
+         */
+        if (isFramework270OrHigher(url.getParameter(Constants.RELEASE_KEY))) {
             
rmiProxyFactoryBean.setRemoteInvocationFactory(RmiRemoteInvocation::new);
+        } else if 
(isFramework263OrHigher(url.getParameter(Constants.DUBBO_VERSION_KEY))) {
+            
rmiProxyFactoryBean.setRemoteInvocationFactory(com.alibaba.dubbo.rpc.protocol.rmi.RmiRemoteInvocation::new);
         }
         rmiProxyFactoryBean.setServiceUrl(url.toIdentityString());
         rmiProxyFactoryBean.setServiceInterface(serviceType);

Reply via email to