主键生成策略调整,日志部分调整
parent
b8a1196a45
commit
989ad48653
@ -0,0 +1,123 @@
|
||||
package cn.estsh.i3plus.pojo.base.codemaker;
|
||||
|
||||
/**
|
||||
* @Description :
|
||||
* @Reference :
|
||||
* @Author : alwaysfrin
|
||||
* @CreateDate : 2019-01-10 13:27
|
||||
* @Modify:
|
||||
**/
|
||||
@Deprecated
|
||||
public class SnowflakeId {
|
||||
private long workerId;
|
||||
private long datacenterId;
|
||||
private long sequence = 0L;
|
||||
|
||||
public SnowflakeId(){
|
||||
this.workerId = 1;
|
||||
this.datacenterId = 1;
|
||||
this.sequence = 0L;
|
||||
}
|
||||
|
||||
public SnowflakeId(long workerId, long datacenterId){
|
||||
if (workerId > maxWorkerId || workerId < 0) {
|
||||
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0",maxWorkerId));
|
||||
}
|
||||
if (datacenterId > maxDatacenterId || datacenterId < 0) {
|
||||
throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0",maxDatacenterId));
|
||||
}
|
||||
|
||||
this.workerId = workerId;
|
||||
this.datacenterId = datacenterId;
|
||||
}
|
||||
|
||||
private long twepoch = 1288834974657L;
|
||||
|
||||
private long workerIdBits = 5L;
|
||||
private long datacenterIdBits = 5L;
|
||||
private long maxWorkerId = -1L ^ (-1L << workerIdBits);
|
||||
private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
|
||||
private long sequenceBits = 12L;
|
||||
|
||||
private long workerIdShift = sequenceBits;
|
||||
private long datacenterIdShift = sequenceBits + workerIdBits;
|
||||
private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
|
||||
private long sequenceMask = -1L ^ (-1L << sequenceBits);
|
||||
|
||||
private long lastTimestamp = -1L;
|
||||
|
||||
private long getWorkerId(){
|
||||
return workerId;
|
||||
}
|
||||
|
||||
private long getDatacenterId(){
|
||||
return datacenterId;
|
||||
}
|
||||
|
||||
public synchronized long nextId() {
|
||||
long timestamp = timeGen();
|
||||
|
||||
if (timestamp < lastTimestamp) {
|
||||
System.err.printf("clock is moving backwards. Rejecting requests until %d.", 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 = 0;
|
||||
}
|
||||
|
||||
lastTimestamp = timestamp;
|
||||
return ((timestamp - twepoch) << timestampLeftShift) |
|
||||
(datacenterId << datacenterIdShift) |
|
||||
(workerId << workerIdShift) |
|
||||
sequence;
|
||||
}
|
||||
|
||||
private long tilNextMillis(long lastTimestamp) {
|
||||
long timestamp = timeGen();
|
||||
while (timestamp <= lastTimestamp) {
|
||||
timestamp = timeGen();
|
||||
}
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
private long timeGen(){
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
|
||||
//---------------测试---------------
|
||||
public static void main(String[] args) {
|
||||
SnowflakeId worker = new SnowflakeId();
|
||||
Runnable testRun = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
System.out.println(i + "=" + worker.nextId());
|
||||
}
|
||||
}
|
||||
};
|
||||
Thread thread1 = new Thread(testRun);
|
||||
thread1.start();
|
||||
Thread thread2 = new Thread(testRun);
|
||||
thread2.start();
|
||||
Thread thread3 = new Thread(testRun);
|
||||
thread3.start();
|
||||
Thread thread4 = new Thread(testRun);
|
||||
thread4.start();
|
||||
Thread thread5 = new Thread(testRun);
|
||||
thread5.start();
|
||||
|
||||
System.out.println(new SnowflakeId().nextId());
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
//System.out.println(worker.nextId());
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue