/* * 版权属于:yitter(yitter@126.com) * 开源地址:https://gitee.com/yitter/idgenerator */ module yitter.idgen.DefaultIdGenerator; import yitter.contract.IIdGenerator; import yitter.contract.ISnowWorker; import yitter.contract.IdGeneratorException; import yitter.contract.IdGeneratorOptions; import yitter.core.SnowWorkerM1; import yitter.core.SnowWorkerM2; import core.thread; import core.time; import std.conv; import std.datetime; import std.stdio; /** * */ class DefaultIdGenerator : IIdGenerator { private __gshared ISnowWorker _SnowWorker = null; this(IdGeneratorOptions options) { if (options is null) { throw new IdGeneratorException("options error."); } // 1.BaseTime SysTime MinBaseTime = SysTime(DateTime(2020, 2, 20, 2, 20, 2)).add!"years"(-50); if (options.BaseTime < MinBaseTime || options.BaseTime > Clock.currTime) { throw new IdGeneratorException("BaseTime error."); } // 2.WorkerIdBitLength if (options.WorkerIdBitLength <= 0) { throw new IdGeneratorException("WorkerIdBitLength error.(range:[1, 21])"); } if (options.WorkerIdBitLength + options.SeqBitLength > 22) { throw new IdGeneratorException("error:WorkerIdBitLength + SeqBitLength <= 22"); } // 3.WorkerId int maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1; if (maxWorkerIdNumber == 0) { maxWorkerIdNumber = 63; } if (options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber) { string msg = "WorkerId error. (range:[0, " ~ to!string((maxWorkerIdNumber > 0 ? maxWorkerIdNumber : 63)) ~ "]"; throw new IdGeneratorException(msg); } // 4.SeqBitLength if (options.SeqBitLength < 2 || options.SeqBitLength > 21) { throw new IdGeneratorException("SeqBitLength error. (range:[2, 21])"); } // 5.MaxSeqNumber int maxSeqNumber = (1 << options.SeqBitLength) - 1; if (maxSeqNumber == 0) { maxSeqNumber = 63; } if (options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber) { throw new IdGeneratorException("MaxSeqNumber error. (range:[1, " ~ maxSeqNumber.to!string() ~ "]"); } // 6.MinSeqNumber if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber) { throw new IdGeneratorException("MinSeqNumber error. (range:[5, " ~ maxSeqNumber.to!string() ~ "]"); } switch (options.Method) { case 2: _SnowWorker = new SnowWorkerM2(options); break; case 1: default: _SnowWorker = new SnowWorkerM1(options); break; } if (options.Method == 1) { try { Thread.sleep(500.msecs); } catch (Exception e) { writeln(e.toString()); } } } long newLong() { return _SnowWorker.nextId(); } }