众多周知,在进行网络通信的时候都需要编解码,而RocketMQ依托Netty框架进行网络交互,只需要在上行和下行通道处理类中进行扩展处理即可完成编解码的工作。
// 编码,下行通道往网络通道中写数据
class NettyEncoder extends MessageToByteEncoder<RemotingCommand>
class MessageToByteEncoder<I> extends ChannelOutboundHandlerAdapter
// 解码,上行通道从网络通道中读数据
class NettyDecoder extends LengthFieldBasedFrameDecoder
class LengthFieldBasedFrameDecoder extends ByteToMessageDecoder
class ByteToMessageDecoder extends ChannelInboundHandlerAdapter
创建请求
这里以broker启动后往注册中心注册自身信息为例
RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.REGISTER_BROKER, requestHeader);
request.setBody(body);
创建request请求,设置请求编码以及版本号
public static RemotingCommand createRequestCommand(int code, CommandCustomHeader customHeader) {
RemotingCommand cmd = new RemotingCommand();
cmd.setCode(code);
cmd.customHeader = customHeader;
setCmdVersion(cmd);
return cmd;
}
编码NettyEncoder
编码完成后往ByteBuf中写入请求头以及body信息。
public void encode(ChannelHandlerContext ctx, RemotingCommand remotingCommand, ByteBuf out)
throws Exception {
try {
ByteBuffer header = remotingCommand.encodeHeader();
out.writeBytes(header);
byte[] body = remotingCommand.getBody();
if (body