
com.alibaba.dubbo.rpc.protocol.thrift.ThriftNativeCodec Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of dubbo2 Show documentation
Show all versions of dubbo2 Show documentation
The all in one project of dubbo2
The newest version!
package com.alibaba.dubbo.rpc.protocol.thrift;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TMessage;
import org.apache.thrift.protocol.TMessageType;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.protocol.TStruct;
import org.apache.thrift.transport.TIOStreamTransport;
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.remoting.Channel;
import com.alibaba.dubbo.remoting.Codec2;
import com.alibaba.dubbo.remoting.buffer.ChannelBuffer;
import com.alibaba.dubbo.remoting.buffer.ChannelBufferOutputStream;
import com.alibaba.dubbo.remoting.exchange.Request;
import com.alibaba.dubbo.remoting.exchange.Response;
import com.alibaba.dubbo.rpc.Invocation;
/**
* @author kimi
*/
public class ThriftNativeCodec implements Codec2 {
private final AtomicInteger thriftSeq = new AtomicInteger(0);
public void encode(Channel channel, ChannelBuffer buffer, Object message)
throws IOException {
if (message instanceof Request) {
encodeRequest(channel, buffer, (Request)message);
} else if (message instanceof Response) {
encodeResponse(channel, buffer, (Response)message);
} else {
throw new IOException("Unsupported message type "
+ message.getClass().getName());
}
}
protected void encodeRequest(Channel channel, ChannelBuffer buffer, Request request)
throws IOException {
Invocation invocation = (Invocation) request.getData();
TProtocol protocol = newProtocol(channel.getUrl(), buffer);
try {
protocol.writeMessageBegin(new TMessage(
invocation.getMethodName(), TMessageType.CALL,
thriftSeq.getAndIncrement()));
protocol.writeStructBegin(new TStruct(invocation.getMethodName() + "_args"));
for(int i = 0; i < invocation.getParameterTypes().length; i++) {
Class type = invocation.getParameterTypes()[i];
}
} catch (TException e) {
throw new IOException(e.getMessage(), e);
}
}
protected void encodeResponse(Channel channel, ChannelBuffer buffer, Response response)
throws IOException {
}
public Object decode(Channel channel, ChannelBuffer buffer) throws IOException {
return null;
}
protected static TProtocol newProtocol(URL url, ChannelBuffer buffer) throws IOException {
String protocol = url.getParameter(ThriftConstants.THRIFT_PROTOCOL_KEY,
ThriftConstants.DEFAULT_PROTOCOL);
if (ThriftConstants.BINARY_THRIFT_PROTOCOL.equals(protocol)) {
return new TBinaryProtocol(new TIOStreamTransport(new ChannelBufferOutputStream(buffer)));
}
throw new IOException("Unsupported protocol type " + protocol);
}
}