【Vesta发号器源码】AbstractIdServiceImp
2019-05-14 本文已影响0人
DeanChangDM
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;
}