美文网首页
【Vesta发号器源码】BasePopulator

【Vesta发号器源码】BasePopulator

作者: DeanChangDM | 来源:发表于2019-05-13 14:09 被阅读0次

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;
    }

相关文章

网友评论

      本文标题:【Vesta发号器源码】BasePopulator

      本文链接:https://www.haomeiwen.com/subject/vqblaqtx.html