RocketMQ通信协议

我们先从client端看一个消息是如何发送到服务端,服务端又是如何解析消息的。

client端:

构造请求体:

构造请求体:

发送消息体:

 

下面看服务端:

rocketmq的协议服务端解析救灾这里了RemotingCommand.decode(byteBuffer),我们来看下这个方法,具体是如何解析协议的:

    public static RemotingCommand decode(final ByteBuffer byteBuffer) {
        int length = byteBuffer.limit();    //获取字节缓冲区的整个长度,这个长度等于通信协议格式的2、3、4段的总长度
        int oriHeaderLen = byteBuffer.getInt(); //从缓冲区中读取4个字节的int类型的数据值 ,这个值就是报文头部的长度
        int headerLength = getHeaderLength(oriHeaderLen);

        byte[] headerData = new byte[headerLength];
        byteBuffer.get(headerData); //接下来从缓冲区中读取headerLength个字节的数据,这个数据就是报文头部的数据

        RemotingCommand cmd = headerDecode(headerData, getProtocolType(oriHeaderLen));

        int bodyLength = length - 4 - headerLength;
        byte[] bodyData = null;
        if (bodyLength > 0) {
            bodyData = new byte[bodyLength];
            byteBuffer.get(bodyData);    //接下来读取length-4-headerLength  个字节的数据,这个数据就是报文体的数据
        }
        cmd.body = bodyData;

        return cmd;
    }

 

 

 

 

 

posted @ 2017-05-21 00:13  烁2012  阅读(4471)  评论(0编辑  收藏  举报