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

【Vesta发号器源码】AbstractIdServiceImp

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

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

相关文章

网友评论

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

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