You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2019/03/04 08:03:16 UTC
[incubator-dubbo] branch master updated: Merge pull request #3577,
rmi support generic.
This is an automated email from the ASF dual-hosted git repository.
liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git
The following commit(s) were added to refs/heads/master by this push:
new bb85d07 Merge pull request #3577, rmi support generic.
bb85d07 is described below
commit bb85d071beafc9f4f8c2e8c60493d33c95362a24
Author: huazhongming <cr...@gmail.com>
AuthorDate: Mon Mar 4 16:03:06 2019 +0800
Merge pull request #3577, rmi support generic.
Fixes #2779
---
.../apache/dubbo/rpc/protocol/rmi/RmiProtocol.java | 59 +++++++++++++++++-----
.../rpc/protocol/rmi/RmiRemoteInvocation.java | 8 ++-
.../apache/dubbo/rpc/protocol/rmi/DemoService.java | 2 +
.../dubbo/rpc/protocol/rmi/DemoServiceImpl.java | 4 ++
.../dubbo/rpc/protocol/rmi/RmiProtocolTest.java | 16 ++++++
5 files changed, 74 insertions(+), 15 deletions(-)
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 d3ba2e8..63e9fcd 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
@@ -20,10 +20,12 @@ import org.apache.dubbo.common.Constants;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.protocol.AbstractProxyProtocol;
-
+import org.apache.dubbo.rpc.service.GenericService;
+import org.apache.dubbo.rpc.support.ProtocolUtils;
import org.springframework.remoting.RemoteAccessException;
import org.springframework.remoting.rmi.RmiProxyFactoryBean;
import org.springframework.remoting.rmi.RmiServiceExporter;
+import org.springframework.remoting.support.RemoteInvocation;
import java.io.IOException;
import java.net.SocketTimeoutException;
@@ -50,21 +52,14 @@ public class RmiProtocol extends AbstractProxyProtocol {
@Override
protected <T> Runnable doExport(final T impl, Class<T> type, URL url) throws RpcException {
- final RmiServiceExporter rmiServiceExporter = new RmiServiceExporter();
- rmiServiceExporter.setRegistryPort(url.getPort());
- rmiServiceExporter.setServiceName(url.getPath());
- rmiServiceExporter.setServiceInterface(type);
- rmiServiceExporter.setService(impl);
- try {
- rmiServiceExporter.afterPropertiesSet();
- } catch (RemoteException e) {
- throw new RpcException(e.getMessage(), e);
- }
+ RmiServiceExporter rmiServiceExporter = createExporter(impl, type, url, false);
+ RmiServiceExporter genericServiceExporter = createExporter(impl, GenericService.class, url, true);
return new Runnable() {
@Override
public void run() {
try {
rmiServiceExporter.destroy();
+ genericServiceExporter.destroy();
} catch (Throwable e) {
logger.warn(e.getMessage(), e);
}
@@ -76,6 +71,8 @@ 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();
+ final String generic = url.getParameter(Constants.GENERIC_KEY);
+ final boolean isGeneric = ProtocolUtils.isGeneric(generic) || serviceType.equals(GenericService.class);
/*
RMI needs extra parameter since it uses customized remote invocation object
@@ -86,11 +83,27 @@ public class RmiProtocol extends AbstractProxyProtocol {
3. if the provider version is lower than v2.6.3, does not use customized RemoteInvocation.
*/
if (isRelease270OrHigher(url.getParameter(Constants.RELEASE_KEY))) {
- rmiProxyFactoryBean.setRemoteInvocationFactory(RmiRemoteInvocation::new);
+ rmiProxyFactoryBean.setRemoteInvocationFactory((methodInvocation) -> {
+ RemoteInvocation invocation = new RmiRemoteInvocation(methodInvocation);
+ if (invocation != null && isGeneric) {
+ invocation.addAttribute(Constants.GENERIC_KEY, generic);
+ }
+ return invocation;
+ });
} else if (isRelease263OrHigher(url.getParameter(Constants.DUBBO_VERSION_KEY))) {
- rmiProxyFactoryBean.setRemoteInvocationFactory(com.alibaba.dubbo.rpc.protocol.rmi.RmiRemoteInvocation::new);
+ rmiProxyFactoryBean.setRemoteInvocationFactory((methodInvocation) -> {
+ RemoteInvocation invocation = new com.alibaba.dubbo.rpc.protocol.rmi.RmiRemoteInvocation(methodInvocation);
+ if (invocation != null && isGeneric) {
+ invocation.addAttribute(Constants.GENERIC_KEY, generic);
+ }
+ return invocation;
+ });
+ }
+ String serviceUrl = url.toIdentityString();
+ if (isGeneric) {
+ serviceUrl = serviceUrl + "/" + Constants.GENERIC_KEY;
}
- rmiProxyFactoryBean.setServiceUrl(url.toIdentityString());
+ rmiProxyFactoryBean.setServiceUrl(serviceUrl);
rmiProxyFactoryBean.setServiceInterface(serviceType);
rmiProxyFactoryBean.setCacheStub(true);
rmiProxyFactoryBean.setLookupStubOnStartup(true);
@@ -117,4 +130,22 @@ public class RmiProtocol extends AbstractProxyProtocol {
return super.getErrorCode(e);
}
+ private <T> RmiServiceExporter createExporter(T impl, Class<?> type, URL url, boolean isGeneric) {
+ final RmiServiceExporter rmiServiceExporter = new RmiServiceExporter();
+ rmiServiceExporter.setRegistryPort(url.getPort());
+ if (isGeneric) {
+ rmiServiceExporter.setServiceName(url.getPath() + "/" + Constants.GENERIC_KEY);
+ } else {
+ rmiServiceExporter.setServiceName(url.getPath());
+ }
+ rmiServiceExporter.setServiceInterface(type);
+ rmiServiceExporter.setService(impl);
+ try {
+ rmiServiceExporter.afterPropertiesSet();
+ } catch (RemoteException e) {
+ throw new RpcException(e.getMessage(), e);
+ }
+ return rmiServiceExporter;
+ }
+
}
diff --git a/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java b/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java
index dbbe9d6..96b49e7 100644
--- a/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java
+++ b/dubbo-rpc/dubbo-rpc-rmi/src/main/java/org/apache/dubbo/rpc/protocol/rmi/RmiRemoteInvocation.java
@@ -16,6 +16,8 @@
*/
package org.apache.dubbo.rpc.protocol.rmi;
+import org.apache.dubbo.common.Constants;
+import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.rpc.RpcContext;
import org.aopalliance.intercept.MethodInvocation;
@@ -34,7 +36,7 @@ public class RmiRemoteInvocation extends RemoteInvocation {
*/
public RmiRemoteInvocation(MethodInvocation methodInvocation) {
super(methodInvocation);
- addAttribute(dubboAttachmentsAttrName, new HashMap<String, String>(RpcContext.getContext().getAttachments()));
+ addAttribute(dubboAttachmentsAttrName, new HashMap<>(RpcContext.getContext().getAttachments()));
}
/**
@@ -48,6 +50,10 @@ public class RmiRemoteInvocation extends RemoteInvocation {
InvocationTargetException {
RpcContext context = RpcContext.getContext();
context.setAttachments((Map<String, String>) getAttribute(dubboAttachmentsAttrName));
+ String generic = (String) getAttribute(Constants.GENERIC_KEY);
+ if (StringUtils.isNotEmpty(generic)) {
+ context.setAttachment(Constants.GENERIC_KEY, generic);
+ }
try {
return super.invoke(targetObject);
} finally {
diff --git a/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/DemoService.java b/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/DemoService.java
index 9e1d334..c139b1a 100644
--- a/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/DemoService.java
+++ b/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/DemoService.java
@@ -23,6 +23,8 @@ package org.apache.dubbo.rpc.protocol.rmi;
public interface DemoService {
void sayHello(String name);
+ String sayHi(String name);
+
String echo(String text);
long timestamp();
diff --git a/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/DemoServiceImpl.java b/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/DemoServiceImpl.java
index 833969b..ec461eb 100644
--- a/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/DemoServiceImpl.java
+++ b/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/DemoServiceImpl.java
@@ -31,6 +31,10 @@ public class DemoServiceImpl implements DemoService {
System.out.println("hello " + name);
}
+ public String sayHi(String name) {
+ return "Hi, " + name;
+ }
+
public String echo(String text) {
return text;
}
diff --git a/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/RmiProtocolTest.java b/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/RmiProtocolTest.java
index a185361..4dcd21d 100644
--- a/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/RmiProtocolTest.java
+++ b/dubbo-rpc/dubbo-rpc-rmi/src/test/java/org/apache/dubbo/rpc/protocol/rmi/RmiProtocolTest.java
@@ -23,8 +23,11 @@ import org.apache.dubbo.rpc.Exporter;
import org.apache.dubbo.rpc.Protocol;
import org.apache.dubbo.rpc.ProxyFactory;
import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.service.EchoService;
+import org.apache.dubbo.rpc.service.GenericService;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@@ -115,6 +118,19 @@ public class RmiProtocolTest {
rpcExporter.unexport();
}
+ @Test
+ public void testGenericInvoke() {
+ DemoService service = new DemoServiceImpl();
+ URL url = URL.valueOf("rmi://127.0.0.1:9003/" + DemoService.class.getName() + "?release=2.7.0");
+ Exporter<DemoService> exporter = protocol.export(proxy.getInvoker(service, DemoService.class, url));
+ Invoker<GenericService> invoker = protocol.refer(GenericService.class, url);
+ GenericService client = proxy.getProxy(invoker, true);
+ String result = (String) client.$invoke("sayHi", new String[]{"java.lang.String"}, new Object[]{"haha"});
+ Assertions.assertEquals("Hi, haha", result);
+ invoker.destroy();
+ exporter.unexport();
+ }
+
public static interface NonStdRmiInterface {
void bark();
}