Browse Source

optimize code generator

sunyj 7 years ago
parent
commit
712b97eec8

+ 2 - 2
kanban-auth/src/main/java/com/uas/kanban/model/RememberKey.java

@@ -3,8 +3,8 @@ package com.uas.kanban.model;
 import com.uas.kanban.annotation.CollectionProperty;
 import com.uas.kanban.annotation.FieldProperty;
 import com.uas.kanban.base.BaseEntity;
+import com.uas.kanban.util.CodeGenerator;
 import com.uas.kanban.util.MD5Utils;
-import com.uas.kanban.util.NumberGenerator;
 import org.mongodb.morphia.annotations.Entity;
 import org.mongodb.morphia.annotations.IndexOptions;
 import org.mongodb.morphia.annotations.Indexed;
@@ -55,7 +55,7 @@ public class RememberKey extends BaseEntity {
     @Override
     public void init() {
         this.maxInactiveInterval = MAX_INACTIVE_INTERVAL;
-        this.key = MD5Utils.encode(NumberGenerator.generateId());
+        this.key = MD5Utils.encode(CodeGenerator.getGenerator().generate());
         super.init();
     }
 

+ 2 - 2
kanban-common/src/main/java/com/uas/kanban/base/Coded.java

@@ -1,7 +1,7 @@
 package com.uas.kanban.base;
 
 import com.uas.kanban.annotation.FieldProperty;
-import com.uas.kanban.util.NumberGenerator;
+import com.uas.kanban.util.CodeGenerator;
 import com.uas.kanban.util.StringUtils;
 import org.mongodb.morphia.annotations.IndexOptions;
 import org.mongodb.morphia.annotations.Indexed;
@@ -34,7 +34,7 @@ public abstract class Coded implements Serializable {
         if (!StringUtils.isEmpty(code)) {
             throw new IllegalArgumentException("不能指定code:" + this.toString());
         }
-        code = NumberGenerator.generateId();
+        code = CodeGenerator.getGenerator().generate();
     }
 
     public String getCode() {

+ 52 - 0
kanban-common/src/main/java/com/uas/kanban/util/CodeGenerator.java

@@ -0,0 +1,52 @@
+package com.uas.kanban.util;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 生成唯一 code
+ *
+ * @author sunyj
+ * @since 2017年8月22日 上午11:34:44
+ */
+public class CodeGenerator {
+
+    private final static int MAX_OFFSET = 16 * 16 - 16;
+    /**
+     * 生成 code 时的偏移量
+     */
+    private static int offset = 0;
+    private static CodeGenerator generator;
+
+    private CodeGenerator() {
+    }
+
+    public static CodeGenerator getGenerator() {
+        if (generator == null) {
+            synchronized (CodeGenerator.class) {
+                if (generator == null) {
+                    generator = new CodeGenerator();
+                }
+            }
+        }
+        return generator;
+    }
+
+    /**
+     * 生成唯一 code (一秒内不超过 {@link CodeGenerator#MAX_OFFSET} 个,超过则不唯一)
+     */
+    public synchronized String generate() {
+        // 偏移量,不超过 MAX_OFFSET 个
+        offset = (offset + 1) % MAX_OFFSET + 16;
+        // 当前毫秒数
+        long now = new Date().getTime();
+        // 起始时间 2017-01-01 00:00:00:000
+        Calendar startCalendar = Calendar.getInstance();
+        startCalendar.set(2017, 0, 1, 0, 0, 0);
+        startCalendar.set(Calendar.MILLISECOND, 0);
+        // 偏移量加16,保证得到的是两位16进制字符
+        String hex = Long.toHexString(now - startCalendar.getTimeInMillis()) + Integer.toHexString(offset);
+        // 最后反转并转为大写
+        return hex.toUpperCase();
+    }
+}

+ 0 - 36
kanban-common/src/main/java/com/uas/kanban/util/NumberGenerator.java

@@ -1,36 +0,0 @@
-package com.uas.kanban.util;
-
-import java.util.Calendar;
-import java.util.Date;
-
-/**
- * 数字生成工具类
- *
- * @author sunyj
- * @since 2017年8月22日 上午11:34:44
- */
-public class NumberGenerator {
-
-    /**
-     * 生成id时的偏移量
-     */
-    private static int offset = 0;
-
-    /**
-     * @return 产生唯一的id(一毫秒内不超过100个则不重复)
-     */
-    public static String generateId() {
-        // 偏移量,不超过100个
-        offset = (offset + 1) % 100;
-        // 当前毫秒数
-        long now = new Date().getTime();
-        // 起始时间 2017-01-01 00:00:00:000
-        Calendar startCalendar = Calendar.getInstance();
-        startCalendar.set(2017, 0, 1, 0, 0, 0);
-        startCalendar.set(Calendar.MILLISECOND, 0);
-        // 偏移量加16,保证得到的是两位16进制字符
-        String hex = Long.toHexString(now - startCalendar.getTimeInMillis()) + Integer.toHexString(offset + 16);
-        // 最后反转并转为大写
-        return hex.toUpperCase();
-    }
-}