package com.hqyg.disjob.rpc.codec;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import java.nio.ByteOrder;
import com.hqyg.disjob.common.util.DateUtil;
import com.hqyg.disjob.common.util.LoggerUtil;
import com.hqyg.disjob.common.util.SerializeUtil;
/**
*
* @author Disjob
*
*/
public class RpcDecoder extends LengthFieldBasedFrameDecoder{
public RpcDecoder(int maxFrameLength, int lengthFieldOffset, int lengthFieldLength) {
super(maxFrameLength, lengthFieldOffset, lengthFieldLength);
}
public RpcDecoder(ByteOrder byteOrder, int maxFrameLength, int lengthFieldOffset, int lengthFieldLength,
int lengthAdjustment, int initialBytesToStrip, boolean failFast) {
super(byteOrder, maxFrameLength, lengthFieldOffset, lengthFieldLength, lengthAdjustment, initialBytesToStrip, failFast);
}
@Override
protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception {
try {
in = (ByteBuf)super.decode(ctx, in);
if (in == null) {
return null;
}
if (in.readableBytes() < 9) {
System.err.println("when server response, readableBytes less than header length!");
LoggerUtil.warn("when server response, readableBytes less than header length!");
return null ;
}
byte type = in.readByte();
if(type == 0){
LoggerUtil.info("heratbeat response from RPC server!");
return null;
}
int version = in.readInt();
int length = in.readInt();
if (in.readableBytes() < length) {
LoggerUtil.warn("when server response, the length of header is " + length + " but the readableBytes is less!");
}
ByteBuf buf = in.readBytes(length);
byte[] req = new byte[buf.readableBytes()];
buf.readBytes(req);
RpcResponse response = (RpcResponse) SerializeUtil.deserialize(req, RpcResponse.class);
response.setVersion(version);
response.setLength(length);
LoggerUtil.debug("[ DECODER ] request id:"+response.getRequestId()+"; receive rpc at time:"+DateUtil.getFormatNow());
return response;
} catch (Exception e) {
e.printStackTrace();
LoggerUtil.error(e.getMessage());
}
return null;
}
}