概述
RocketMQ的批量消息MessageBatch的消息编码格式如下:
【4 byte totalSize】【4 byte magicCod】【4 byte bodyCrc】【4 byte flag】【4 byte bodyLen】【bodyLen byte body】【2 byte propertiesLength】【propertiesLength byte propertiesBytes】
消息编码核心方法是: String#getBytes(String charsetName)方法
消息解码核心方法是:new String(byte bytes[], Charset charset)方法
对Message的属性集合的编码方式是:
- 将map集合转为String字符串。String字符串的形式为: key1value2key1value2key1value... 。使用"2"作为属性之间的分隔字符,使用"1"作为属性的key/value之间的分隔字符。
- String字符串转为字节数组。使用String#getBytes(String charsetName)方法实现。
批量消息编码
MessageBatch#encode()方法
private final List<Message> messages;
public byte[] encode() {
return MessageDecoder.encodeMessages(messages);
}
MessageDecoder#encodeMessages()方法
对消息集合的编码
public static byte[] encodeMessages(List<Message> messages) {
//TO DO refactor, accumulate in one buffer, avoid copies
List<byte[]> encodedMessages = new ArrayList<byte[]>(messages.size());
int allSize = 0;
for (Message message : messages) {
byte[] tmp = encodeMessage(message);