Vesta發(fā)號(hào)器源碼解析——BasePopulator
這個(gè)類是一個(gè)抽象類,作為一個(gè)base的實(shí)現(xiàn)霞赫,同樣實(shí)現(xiàn)了IdPopulator和ResetPopulator
相關(guān)字段
相關(guān)字段
//序列值
protected long sequence = 0;
//上一次的時(shí)間戳肥矢,也就是當(dāng)前的時(shí)間戳
protected long lastTimestamp = -1;
//構(gòu)造方法
public BasePopulator() {
super();
}
Id生成方法
核心方法,生成Id中的主要?jiǎng)討B(tài)部分甘改,時(shí)間和序列號(hào)
public void populateId(Timer timer, Id id, IdMeta idMeta) {
//首先是當(dāng)前周期的時(shí)間戳,區(qū)分毫秒級(jí)和秒級(jí)抵代,在timer中實(shí)現(xiàn)
long timestamp = timer.genTime();
//校驗(yàn)時(shí)間戳忘嫉,具體實(shí)現(xiàn)在timer中,用于確保使用時(shí)間沒有超限制
timer.validateTimestamp(lastTimestamp, timestamp);
//判斷是否位于同一個(gè)周期內(nèi)康吵,是的話累加sequ否則重置sequence
if (timestamp == lastTimestamp) {
//sequence累加
sequence++;
//確保sequence沒有超過(guò)限制访递,超限會(huì)導(dǎo)致sequence變成0
sequence &= idMeta.getSeqBitsMask();
if (sequence == 0) {
//超過(guò)限制了,等待下一個(gè)周期來(lái)臨拷姿,直到來(lái)臨后返回新的時(shí)間戳
timestamp = timer.tillNextTimeUnit(lastTimestamp);
}
} else {
//重置時(shí)間戳和序列值
lastTimestamp = timestamp;
sequence = 0;
}
//組成Id
id.setSeq(sequence);
id.setTime(timestamp);
}
reset方法
重置sequence和時(shí)間戳
public void reset() {
this.sequence = 0;
this.lastTimestamp = -1;
}