Add File
This commit is contained in:
52
src/main/java/org/dromara/easyai/tools/IdCreator.java
Normal file
52
src/main/java/org/dromara/easyai/tools/IdCreator.java
Normal file
@@ -0,0 +1,52 @@
|
||||
package org.dromara.easyai.tools;
|
||||
|
||||
public class IdCreator {
|
||||
// 生成分布式全局唯一ID
|
||||
public static final long sequenceBits = 12L;// 序列掩码位数
|
||||
public static final long workBits = 4L;// 分布式机器号共四位
|
||||
public static long workId = 1L;
|
||||
public static final long workAndBusBites = workBits + sequenceBits;
|
||||
private static final long sequenceMask = -1L ^ (-1L << sequenceBits);// 序列掩码极值
|
||||
private static IdCreator AcceptorId = new IdCreator();
|
||||
private static long sequence = 0L;
|
||||
private static long lastTimestamp = -1L;
|
||||
|
||||
private IdCreator() {
|
||||
|
||||
}
|
||||
|
||||
public synchronized long nextId() {
|
||||
long timestamp = timeGen();
|
||||
if (timestamp < lastTimestamp) {
|
||||
throw new RuntimeException(String.format(
|
||||
"Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
|
||||
}
|
||||
if (lastTimestamp == timestamp) {
|
||||
sequence = (sequence + 1) & sequenceMask;
|
||||
if (sequence == 0) {
|
||||
timestamp = tilNextMillis(lastTimestamp);
|
||||
}
|
||||
} else {
|
||||
sequence = 0L;
|
||||
}
|
||||
lastTimestamp = timestamp;
|
||||
return (timestamp << workAndBusBites) | (sequence << workBits) | workId;
|
||||
|
||||
}
|
||||
|
||||
protected long tilNextMillis(long lastTimestamp) {
|
||||
long timestamp = timeGen();
|
||||
while (timestamp <= lastTimestamp) {
|
||||
timestamp = timeGen();
|
||||
}
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
protected long timeGen() {
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public static IdCreator get() {
|
||||
return AcceptorId;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user