【Vesta发号器源码】AbstractIdServiceImpl

Vesta发号器源码解析——AbstractIdServiceImpl

这个类是Id生成的实现类的抽象类,主要的入口就在AbstractIdServiceImpl的系列类里面

字段

    //日志记录
    protected final Logger log = LoggerFactory.getLogger(this.getClass());

    protected long machineId = -1;
    protected long genMethod = 0;
    protected long version = 0;
    
    //Id类型
    protected IdType idType;
    //Id元数据
    protected IdMeta idMeta;
    //Id转换器
    protected IdConverter idConverter;
    //MachineId存储
    protected MachineIdProvider machineIdProvider;
    //timer字段
    protected Timer timer;

构造方法

    //默认构造方法
   public AbstractIdServiceImpl() {
        idType = IdType.SECONDS;
    }
    //按照给定的名称初始化
    public AbstractIdServiceImpl(String type) {
        idType = IdType.parse(type);
    }
    //按照给定的类型值初始化
    public AbstractIdServiceImpl(long type) {
        idType = IdType.parse(type);
    }
    //按照给定的枚举类初始化
    public AbstractIdServiceImpl(IdType type) {
        idType = type;
    }

初始化方法

    public void init() {
        //如果id元数据没有初始化,利用工厂初始化id元数据
        if (this.idMeta == null) {
            setIdMeta(IdMetaFactory.getIdMeta(idType));
        }
        //Id转换器如果没有初始化按照默认的初始化
        if (this.idConverter == null) {
            setIdConverter(new IdConverterImpl());
        }
        //timer如果没有初始化,按默认的实例化
        if (this.timer == null) {
            setTimer(new SimpleTimer());
        }
        //初始化,元数据和类型
        this.timer.init(idMeta, idType);
        //初始化machineID
        this.machineId = machineIdProvider.getMachineId();
        //校验machineid
        validateMachineId(this.machineId);
    }

校验MachineId

方法主要用于校验MachineId

    public void validateMachineId(long machineId){
        //MachineId小于0,说明没有配置,停止启动抛出异常记录日志
        if (machineId < 0) {
            log.error("The machine ID is not configured properly (" + machineId + " < 0) so that Vesta Service refuses to start.");

            throw new IllegalStateException(
                    "The machine ID is not configured properly (" + machineId + " < 0) so that Vesta Service refuses to start.");
        //machineId超过了最大的MachineId的标示范围,停止启动,抛出异常
        } else if (machineId >= (1 << this.idMeta.getMachineBits())) {
            log.error("The machine ID is not configured properly ("
                    + machineId + " >= " + (1 << this.idMeta.getMachineBits()) + ") so that Vesta Service refuses to start.");

            throw new IllegalStateException("The machine ID is not configured properly ("
                    + machineId + " >= " + (1 << this.idMeta.getMachineBits()) + ") so that Vesta Service refuses to start.");

        }
    }

核心方法 生成id

    public long genId() {
        Id id = new Id();
        //对ID进行基本信息配置
        id.setMachine(machineId);
        id.setGenMethod(genMethod);
        id.setType(idType.value());
        id.setVersion(version);
        //生成变化字段,一个是时间一个是序列
        populateId(id);
        //将Id对象转换成long型的
        long ret = idConverter.convert(id, this.idMeta);

        // 记录日志
        if (log.isTraceEnabled())
            log.trace(String.format("Id: %s => %d", id, ret));

        return ret;
    }

其他方法

具体作用详见各方法注释

    //Id主要变化生成方法,实现类中实现
    protected abstract void populateId(Id id);
    //转换时间,将long时间转换为date
    public Date transTime(final long time) {
        return timer.transTime(time);
    }

    //解析Id,本质上是调用转换方法
    //将long转换为Id对象
    public Id expId(long id) {
        return idConverter.convert(id, this.idMeta);
    }
    
    //构建一个指定的ID,主要参数是时间和序列号
    public long makeId(long time, long seq) {
        return makeId(time, seq, machineId);
    }

    //构建一个指定的ID,主要参数是时间和序列号以及machineid
    public long makeId(long time, long seq, long machine) {
        return makeId(genMethod, time, seq, machine);
    }
    
    //构建一个指定的ID,主要参数是生成方法、时间和序列号以及machineid
    public long makeId(long genMethod, long time, long seq, long machine) {
        return makeId(idType.value(), genMethod, time, seq, machine);
    }
    
    //构建一个指定的ID,主要参数是类型、生成方法、时间和序列号以及machineid
    public long makeId(long type, long genMethod, long time,
                       long seq, long machine) {
        return makeId(version, type, genMethod, time, seq, machine);
    }

    //构建一个指定的ID,主要参数是版本、类型、生成方法、时间和序列号以及machineid
    public long makeId(long version, long type, long genMethod,
                       long time, long seq, long machine) {
        Id id = new Id(machine, seq, time, genMethod, type, version);
        return idConverter.convert(id, this.idMeta);
    }
    
    //下面是相关字段的get和set方法
    public void setMachineId(long machineId) {
        this.machineId = machineId;
    }

    public void setGenMethod(long genMethod) {
        this.genMethod = genMethod;
    }

    public void setVersion(long version) {
        this.version = version;
    }

    public void setIdConverter(IdConverter idConverter) {
        this.idConverter = idConverter;
    }

    public void setIdMeta(IdMeta idMeta) {
        this.idMeta = idMeta;
    }

    public void setMachineIdProvider(MachineIdProvider machineIdProvider) {
        this.machineIdProvider = machineIdProvider;
    }

    public void setTimer(Timer timer) {
        this.timer = timer;
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 一、编程规约 (一)命名规约 【强制】 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。反...
    喝咖啡的蚂蚁阅读 1,471评论 0 2
  • 阿里巴巴 JAVA 开发手册 1 / 32 Java 开发手册 版本号 制定团队 更新日期 备 注 1.0.0 阿...
    糖宝_阅读 7,452评论 0 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,067评论 1 32
  • 感恩钟声响起,让我在睡梦中醒来,开始一天的修行。为了晚上能睡个好觉,我不设定闹钟,我的生物钟发挥作用,这样的正念让...
    读书不负我魏霞阅读 244评论 0 4
  • 有人说爱情如裸陈于空气中的香水,随时间的推移,味道逐渐寡淡,直至消失;有人说爱情如陈酿,随岁月的增长,味道越来越醇...
    大_可阅读 535评论 0 6