diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fc54589b..271661c8d 100644 --- a/CHANGELOG.md +++ b/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) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java b/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java index 44908d7d0..ba031fec5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java +++ b/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);