Browse Source

support back

Looly 5 years ago
parent
commit
8bcb1daf99
2 changed files with 10 additions and 3 deletions
  1. 1 0
      CHANGELOG.md
  2. 9 3
      hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java

+ 1 - 0
CHANGELOG.md

@@ -24,6 +24,7 @@
 * 【crypto 】     AsymmetricAlgorithm去除EC(issue#887@Github)
 * 【cache  】     超时缓存使用的线程池大小默认为1(issue#890@Github)
 * 【poi    】     ExcelSaxReader支持handleCell方法
+* 【core   】     Snowflake容忍2秒内的时间回拨(issue#I1IGDX@Gitee)
 
 ### Bug修复
 * 【core   】     修复SimpleCache死锁问题(issue#I1HOKB@Gitee)

+ 9 - 3
hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java

@@ -141,10 +141,16 @@ public class Snowflake implements Serializable {
 	public synchronized long nextId() {
 		long timestamp = genTime();
 		if (timestamp < lastTimestamp) {
-			// 如果服务器时间有问题(时钟后退) 报错。
-			throw new IllegalStateException(StrUtil.format("Clock moved backwards. Refusing to generate id for {}ms", lastTimestamp - timestamp));
+			if(lastTimestamp - timestamp < 2000){
+				// 容忍2秒内的回拨,避免NTP校时造成的异常
+				timestamp = lastTimestamp;
+			} else{
+				// 如果服务器时间有问题(时钟后退) 报错。
+				throw new IllegalStateException(StrUtil.format("Clock moved backwards. Refusing to generate id for {}ms", lastTimestamp - timestamp));
+			}
 		}
-		if (lastTimestamp == timestamp) {
+
+		if (timestamp == lastTimestamp) {
 			sequence = (sequence + 1) & sequenceMask;
 			if (sequence == 0) {
 				timestamp = tilNextMillis(lastTimestamp);