提交 abd9d9ab 编写于 作者: W william.liangf

DUBBO-112 在decodeResponse的时候,把相关联的request从future中取出传进来,通过request拿到returnType。

git-svn-id: http://code.alibabatech.com/svn/dubbo/trunk@504 1a56cb94-b969-4eaa-88fa-be21384802f2
上级 d47cfda3
......@@ -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 {
......
......@@ -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);
......
......@@ -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));
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册