Vesta发号器源码解析——BasePopulator
这个类是一个抽象类,作为一个base的实现,同样实现了IdPopulator和ResetPopulator
相关字段
相关字段
//序列值
protected long sequence = 0;
//上一次的时间戳,也就是当前的时间戳
protected long lastTimestamp = -1;
//构造方法
public BasePopulator() {
super();
}
Id生成方法
核心方法,生成Id中的主要动态部分,时间和序列号
public void populateId(Timer timer, Id id, IdMeta idMeta) {
//首先是当前周期的时间戳,区分毫秒级和秒级,在timer中实现
long timestamp = timer.genTime();
//校验时间戳,具体实现在timer中,用于确保使用时间没有超限制
timer.validateTimestamp(lastTimestamp, timestamp);
//判断是否位于同一个周期内,是的话累加sequ否则重置sequence
if (timestamp == lastTimestamp) {
//sequence累加
sequence++;
//确保sequence没有超过限制,超限会导致sequence变成0
sequence &= idMeta.getSeqBitsMask();
if (sequence == 0) {
//超过限制了,等待下一个周期来临,直到来临后返回新的时间戳
timestamp = timer.tillNextTimeUnit(lastTimestamp);
}
} else {
//重置时间戳和序列值
lastTimestamp = timestamp;
sequence = 0;
}
//组成Id
id.setSeq(sequence);
id.setTime(timestamp);
}
reset方法
重置sequence和时间戳
public void reset() {
this.sequence = 0;
this.lastTimestamp = -1;
}
网友评论