From abd9d9ab82faa43c95cb99bf1655a3ee6cab8b29 Mon Sep 17 00:00:00 2001 From: "william.liangf" Date: Fri, 2 Dec 2011 07:41:07 +0000 Subject: [PATCH] =?UTF-8?q?DUBBO-112=20=E5=9C=A8decodeResponse=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=EF=BC=8C=E6=8A=8A=E7=9B=B8=E5=85=B3=E8=81=94?= =?UTF-8?q?=E7=9A=84request=E4=BB=8Efuture=E4=B8=AD=E5=8F=96=E5=87=BA?= =?UTF-8?q?=E4=BC=A0=E8=BF=9B=E6=9D=A5=EF=BC=8C=E9=80=9A=E8=BF=87request?= =?UTF-8?q?=E6=8B=BF=E5=88=B0returnType=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/dubbo/trunk@504 1a56cb94-b969-4eaa-88fa-be21384802f2 --- .../exchange/codec/ExchangeCodec.java | 63 ++++++++++------- .../exchange/support/DefaultFuture.java | 4 ++ .../dubbo/rpc/protocol/dubbo/DubboCodec.java | 70 +++++++++++++------ 3 files changed, 90 insertions(+), 47 deletions(-) diff --git a/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/exchange/codec/ExchangeCodec.java b/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/exchange/codec/ExchangeCodec.java index d2cfe7dc8..7bd644e5c 100644 --- a/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/exchange/codec/ExchangeCodec.java +++ b/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/exchange/codec/ExchangeCodec.java @@ -15,29 +15,30 @@ */ package com.alibaba.dubbo.remoting.exchange.codec; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import com.alibaba.dubbo.common.Extension; -import com.alibaba.dubbo.common.ExtensionLoader; -import com.alibaba.dubbo.common.io.Bytes; -import com.alibaba.dubbo.common.io.StreamUtils; -import com.alibaba.dubbo.common.io.UnsafeByteArrayInputStream; -import com.alibaba.dubbo.common.io.UnsafeByteArrayOutputStream; -import com.alibaba.dubbo.common.logger.Logger; -import com.alibaba.dubbo.common.logger.LoggerFactory; -import com.alibaba.dubbo.common.serialize.ObjectInput; -import com.alibaba.dubbo.common.serialize.ObjectOutput; -import com.alibaba.dubbo.common.serialize.Serialization; -import com.alibaba.dubbo.common.utils.StringUtils; -import com.alibaba.dubbo.remoting.Channel; -import com.alibaba.dubbo.remoting.exchange.Request; -import com.alibaba.dubbo.remoting.exchange.Response; -import com.alibaba.dubbo.remoting.telnet.codec.TelnetCodec; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import com.alibaba.dubbo.common.Extension; +import com.alibaba.dubbo.common.ExtensionLoader; +import com.alibaba.dubbo.common.io.Bytes; +import com.alibaba.dubbo.common.io.StreamUtils; +import com.alibaba.dubbo.common.io.UnsafeByteArrayInputStream; +import com.alibaba.dubbo.common.io.UnsafeByteArrayOutputStream; +import com.alibaba.dubbo.common.logger.Logger; +import com.alibaba.dubbo.common.logger.LoggerFactory; +import com.alibaba.dubbo.common.serialize.ObjectInput; +import com.alibaba.dubbo.common.serialize.ObjectOutput; +import com.alibaba.dubbo.common.serialize.Serialization; +import com.alibaba.dubbo.common.utils.StringUtils; +import com.alibaba.dubbo.remoting.Channel; +import com.alibaba.dubbo.remoting.exchange.Request; +import com.alibaba.dubbo.remoting.exchange.Response; +import com.alibaba.dubbo.remoting.exchange.support.DefaultFuture; +import com.alibaba.dubbo.remoting.telnet.codec.TelnetCodec; /** * ExchangeCodec. @@ -169,7 +170,7 @@ public class ExchangeCodec extends TelnetCodec { } else if (res.isEvent()) { data = decodeEventData(channel, in); } else { - data = decodeResponseData(channel, in); + data = decodeResponseData(channel, in, getRequestData(id)); } res.setResult(data); } catch (Throwable t) { @@ -206,6 +207,16 @@ public class ExchangeCodec extends TelnetCodec { return req; } } + + private Object getRequestData(long id) { + DefaultFuture future = DefaultFuture.getFuture(id); + if (future == null) + return null; + Request req = future.getRequest(); + if (req == null) + return null; + return req.getData(); + } protected void encodeRequest(Channel channel, OutputStream os, Request req) throws IOException { Serialization serialization = getSerialization(channel); @@ -364,6 +375,10 @@ public class ExchangeCodec extends TelnetCodec { protected Object decodeResponseData(Channel channel, ObjectInput in) throws IOException { return decodeResponseData(in); } + + protected Object decodeResponseData(Channel channel, ObjectInput in, Object requestData) throws IOException { + return decodeResponseData(channel, in); + } @Override protected void encodeData(Channel channel, ObjectOutput out, Object data) throws IOException { diff --git a/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/exchange/support/DefaultFuture.java b/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/exchange/support/DefaultFuture.java index 1b979d92f..dd40aa1ce 100644 --- a/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/exchange/support/DefaultFuture.java +++ b/dubbo-remoting/src/main/java/com/alibaba/dubbo/remoting/exchange/support/DefaultFuture.java @@ -213,6 +213,10 @@ public class DefaultFuture implements ResponseFuture { private long getStartTimestamp() { return start; } + + public static DefaultFuture getFuture(long id) { + return FUTURES.get(id); + } public static boolean hasFuture(Channel channel) { return CHANNELS.containsValue(channel); diff --git a/dubbo-rpc-default/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboCodec.java b/dubbo-rpc-default/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboCodec.java index d9aecfc7d..4a5599546 100644 --- a/dubbo-rpc-default/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboCodec.java +++ b/dubbo-rpc-default/src/main/java/com/alibaba/dubbo/rpc/protocol/dubbo/DubboCodec.java @@ -15,26 +15,29 @@ */ package com.alibaba.dubbo.rpc.protocol.dubbo; -import static com.alibaba.dubbo.rpc.protocol.dubbo.CallbackServiceCodec.decodeInvocationArgument; -import static com.alibaba.dubbo.rpc.protocol.dubbo.CallbackServiceCodec.encodeInvocationArgument; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -import com.alibaba.dubbo.common.Constants; -import com.alibaba.dubbo.common.Extension; -import com.alibaba.dubbo.common.Version; -import com.alibaba.dubbo.common.serialize.ObjectInput; -import com.alibaba.dubbo.common.serialize.ObjectOutput; -import com.alibaba.dubbo.common.utils.ReflectUtils; -import com.alibaba.dubbo.common.utils.StringUtils; -import com.alibaba.dubbo.remoting.Channel; -import com.alibaba.dubbo.remoting.Codec; -import com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec; -import com.alibaba.dubbo.rpc.Result; -import com.alibaba.dubbo.rpc.RpcInvocation; -import com.alibaba.dubbo.rpc.RpcResult; +import static com.alibaba.dubbo.rpc.protocol.dubbo.CallbackServiceCodec.decodeInvocationArgument; +import static com.alibaba.dubbo.rpc.protocol.dubbo.CallbackServiceCodec.encodeInvocationArgument; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import com.alibaba.dubbo.common.Constants; +import com.alibaba.dubbo.common.Extension; +import com.alibaba.dubbo.common.Version; +import com.alibaba.dubbo.common.logger.Logger; +import com.alibaba.dubbo.common.logger.LoggerFactory; +import com.alibaba.dubbo.common.serialize.ObjectInput; +import com.alibaba.dubbo.common.serialize.ObjectOutput; +import com.alibaba.dubbo.common.utils.ReflectUtils; +import com.alibaba.dubbo.common.utils.StringUtils; +import com.alibaba.dubbo.remoting.Channel; +import com.alibaba.dubbo.remoting.Codec; +import com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec; +import com.alibaba.dubbo.rpc.Result; +import com.alibaba.dubbo.rpc.RpcInvocation; +import com.alibaba.dubbo.rpc.RpcResult; /** * Dubbo codec. @@ -43,7 +46,10 @@ import com.alibaba.dubbo.rpc.RpcResult; * @author chao.liuc */ @Extension(value=DubboCodec.NAME) -public class DubboCodec extends ExchangeCodec implements Codec { +public class DubboCodec extends ExchangeCodec implements Codec { + + private static final Logger logger = LoggerFactory.getLogger(DubboCodec.class); + public static final String NAME = "dubbo"; private static final String DUBBO_VERSION = Version.getVersion(DubboCodec.class, Version.getVersion()); @@ -147,9 +153,26 @@ public class DubboCodec extends ExchangeCodec implements Codec { out.writeObject(th); } } + + private Class getReturnType(Channel channel, RpcInvocation invocation) { + try { + if (channel != null && invocation != null) { + String service = channel.getUrl().getServiceName(); + if (service != null && service.length() > 0) { + Class cls = ReflectUtils.forName(service); + Method method = cls.getMethod(invocation.getMethodName(), invocation.getParameterTypes()); + return method.getReturnType(); + } + } + } catch (Throwable t) { + logger.warn(t.getMessage(), t); + } + return null; + } @Override - protected Object decodeResponseData(Channel channel, ObjectInput in) throws IOException { + protected Object decodeResponseData(Channel channel, ObjectInput in, Object request) throws IOException { + RpcInvocation invocation = (RpcInvocation) request; RpcResult result = new RpcResult(); byte flag = in.readByte(); @@ -158,7 +181,8 @@ public class DubboCodec extends ExchangeCodec implements Codec { break; case RESPONSE_VALUE: try { - result.setResult(in.readObject()); + Class returnType = getReturnType(channel, invocation); + result.setResult(returnType == null ? in.readObject() : in.readObject(returnType)); } catch (ClassNotFoundException e) { throw new IOException(StringUtils.toString("Read response data failed.", e)); } -- GitLab