说明
AppendMessageStatus 用于描述追加消息到日志时的状态
AppendMessageResult 用于描述追加消息到日志的结果,包含有上述状态
部分源码可能要参考commitLog类更方便理解,后面再讲
AppendMessageStatus
这是一个枚举类
描述追加消息到日志时的状态,主要涉及消息大小与文件剩余大小的比较
/**
* When write a message to the commit log, returns code
* 写消息到commitLog时,返回的状态码
*/
public enum AppendMessageStatus {
PUT_OK,//正常情况
END_OF_FILE, //当消息(含批量)所需的长度超过文件剩余长度时返回
MESSAGE_SIZE_EXCEEDED, //当消息(含批量)所需的长度超过了MessageStoreConfig.maxMessageSize(默认4M)时触发,代表单个消息过大
PROPERTIES_SIZE_EXCEEDED,//当单个消息所需的prop文件长度超过了Short.MAX_VALUE时触发
UNKNOWN_ERROR,//其他未知错误
}
AppendMessageResult
When write a message to the commit log, returns results
描述写消息至commitLog时返回的结果
属性
// Return code
private AppendMessageStatus status;//状态
// Where to start writing
/**
* 开始写的位置
* 是真正的物理位置,参考CommitLog的调用,是fileFromOffset + byteBuffer.position();
*/
private long wroteOffset;
// Write Bytes
private int wroteBytes;//写多少个字节
// Message ID
private String msgId;//消息id
// Message storage timestamp
private long storeTimestamp;//消息存储的时间
// Consume queue's offset(step by one)
/**
* 消息的逻辑地址,代表是topic-queueId这个队列中的第几个位置,即下标
*/
private long logicsOffset;
private long pagecacheRT = 0;//这个不知道有什么用,get,set方法也没调用
/**
* 写入的消息数量,默认是1
* 只有在处理批量消息MessageExtBatch时,会设置为其他值
*/
private int msgNum = 1;
这里注意:
wroteOffset是物理地址,可以参考refer中的图如下图
logicsOffset:逻辑地址,代表是这个队列中的第几个位置,即下标
msgNum:默认1,当处理批量消息MessageExtBatch时,会设置为其他值
![](https://img.haomeiwen.com/i4871751/68f3f5fd7552f58f.png)
方法
基本都是get,set构造方法
就多了一个isOk方法很简单
//添加状态是否ok
public boolean isOk() {
return this.status == AppendMessageStatus.PUT_OK;
}
问题
批量消息时共用一个msgId吗?
看到批量消息再来回答
网友评论