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