package com.hqyg.disjob.rpc.codec;
import com.hqyg.disjob.common.util.DateUtil;
import com.hqyg.disjob.common.util.LoggerUtil;
import com.hqyg.disjob.common.util.SerializeUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
public class RpcEncoder extends MessageToByteEncoder<RpcRequest> {
private Class<RpcRequest> genericClass;
public RpcEncoder(Class<RpcRequest> genericClass) {
this.genericClass = genericClass;
}
@Override
protected void encode(ChannelHandlerContext ctx, RpcRequest request, ByteBuf out) throws Exception {
if (genericClass.isInstance(request)) {
Header header = request.getHeader();
RpcRequestData data = request.getData();
//消息类型
out.writeByte(header.getType());
//协议版本
out.writeInt(header.getVersion());
//封装数据
if(data != null){
LoggerUtil.debug("encode data:"+data.getRequestId()+","+request.toString());
byte[] dataByte = SerializeUtil.serialize(data);
out.writeInt(dataByte.length);
out.writeBytes(dataByte);
LoggerUtil.debug("[ ENCODER ] request id:"+request.getData().getRequestId()+"; send rpc at time:"+DateUtil.getFormatNow());
}else{
out.writeInt(0);
}
}
}
}