From 23f5e5901acda38a496792361864e5cef1d3ca8c Mon Sep 17 00:00:00 2001
From: zhanghl <253316343@qq.com>
Date: 星期日, 27 四月 2025 16:33:54 +0800
Subject: [PATCH] job 增加Sequenc

---
 /dev/null                                                                                      |    2 
 aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderProcessServiceImpl.java |    2 
 aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderJobServiceImpl.java     |    2 
 aps-modules/aps-job/src/main/java/com/aps/job/util/Sequence.java                               |  299 +++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 301 insertions(+), 4 deletions(-)

diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderJobServiceImpl.java b/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderJobServiceImpl.java
index 23491e0..601895b 100644
--- a/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderJobServiceImpl.java
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderJobServiceImpl.java
@@ -3,7 +3,7 @@
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aps.common.core.utils.DateUtils;
-import com.aps.common.core.utils.uuid.Sequence;
+import com.aps.job.util.Sequence;
 import com.aps.job.domain.ApsWorkOrderJob;
 import com.aps.job.domain.ApsWorkOrderJobLog;
 import com.aps.job.mapper.ApsWorkOrderJobLogMapper;
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderProcessServiceImpl.java b/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderProcessServiceImpl.java
index 3f5ef60..09eb85a 100644
--- a/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderProcessServiceImpl.java
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/service/impl/ApsWorkOrderProcessServiceImpl.java
@@ -4,7 +4,7 @@
 import com.alibaba.fastjson.JSONObject;
 import com.aps.common.core.utils.DateUtils;
 import com.aps.common.core.utils.StringUtils;
-import com.aps.common.core.utils.uuid.Sequence;
+import com.aps.job.util.Sequence;
 import com.aps.job.domain.ApsWorkOrderJob;
 import com.aps.job.domain.ApsWorkOrderJobLog;
 import com.aps.job.domain.ApsWorkOrderProcess;
diff --git a/aps-modules/aps-job/src/main/java/com/aps/job/util/Sequence.java b/aps-modules/aps-job/src/main/java/com/aps/job/util/Sequence.java
new file mode 100644
index 0000000..60135d6
--- /dev/null
+++ b/aps-modules/aps-job/src/main/java/com/aps/job/util/Sequence.java
@@ -0,0 +1,299 @@
+package com.aps.job.util;
+
+
+import com.aps.common.core.enums.SystemClock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.lang.management.ManagementFactory;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.util.Enumeration;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.regex.Pattern;
+
+/**
+ * 鍩轰簬Twitter鐨凷nowflake绠楁硶瀹炵幇鍒嗗竷寮忛珮鏁堟湁搴廔D鐢熶骇榛戠鎶�(sequence)鈥斺�斿崌绾х増Snowflake
+ *
+ * <br>
+ * SnowFlake鐨勭粨鏋勫涓�(姣忛儴鍒嗙敤-鍒嗗紑):<br>
+ * <br>
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>
+ * <br>
+ * 1浣嶆爣璇嗭紝鐢变簬long鍩烘湰绫诲瀷鍦↗ava涓槸甯︾鍙风殑锛屾渶楂樹綅鏄鍙蜂綅锛屾鏁版槸0锛岃礋鏁版槸1锛屾墍浠d涓�鑸槸姝f暟锛屾渶楂樹綅鏄�0<br>
+ * <br>
+ * 41浣嶆椂闂存埅(姣绾�)锛屾敞鎰忥紝41浣嶆椂闂存埅涓嶆槸瀛樺偍褰撳墠鏃堕棿鐨勬椂闂存埅锛岃�屾槸瀛樺偍鏃堕棿鎴殑宸�硷紙褰撳墠鏃堕棿鎴� - 寮�濮嬫椂闂存埅)
+ * 寰楀埌鐨勫�硷級锛岃繖閲岀殑鐨勫紑濮嬫椂闂存埅锛屼竴鑸槸鎴戜滑鐨刬d鐢熸垚鍣ㄥ紑濮嬩娇鐢ㄧ殑鏃堕棿锛岀敱鎴戜滑绋嬪簭鏉ユ寚瀹氱殑锛堝涓婼TART_TIME灞炴�э級銆�41浣嶇殑鏃堕棿鎴紝鍙互浣跨敤69骞达紝骞碩 = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
+ * <br>
+ * 10浣嶇殑鏁版嵁鏈哄櫒浣嶏紝鍙互閮ㄧ讲鍦�1024涓妭鐐癸紝鍖呮嫭5浣峝ataCenterId鍜�5浣峸orkerId<br>
+ * <br>
+ * 12浣嶅簭鍒楋紝姣鍐呯殑璁℃暟锛�12浣嶇殑璁℃暟椤哄簭鍙锋敮鎸佹瘡涓妭鐐规瘡姣(鍚屼竴鏈哄櫒锛屽悓涓�鏃堕棿鎴�)浜х敓4096涓狪D搴忓彿<br>
+ * <br>
+ * <br>
+ * 鍔犺捣鏉ュ垰濂�64浣嶏紝涓轰竴涓狶ong鍨嬨��<br>
+ * SnowFlake鐨勪紭鐐规槸锛屾暣浣撲笂鎸夌収鏃堕棿鑷鎺掑簭锛屽苟涓旀暣涓垎甯冨紡绯荤粺鍐呬笉浼氫骇鐢烮D纰版挒(鐢辨暟鎹腑蹇僆D鍜屾満鍣↖D浣滃尯鍒�)锛屽苟涓旀晥鐜囪緝楂橈紝缁忔祴璇曪紝SnowFlake姣忕鑳藉浜х敓26涓嘔D宸﹀彸銆�
+ * <p>
+ * <p>
+ * 鐗规�э細
+ * 1.鏀寔鑷畾涔夊厑璁告椂闂村洖鎷ㄧ殑鑼冨洿<p>
+ * 2.瑙e喅璺ㄦ绉掕捣濮嬪�兼瘡娆′负0寮�濮嬬殑鎯呭喌锛堥伩鍏嶆湯灏惧繀瀹氫负鍋舵暟锛岃�屼笉渚夸簬鍙栦綑浣跨敤闂锛�<p>
+ * 3.瑙e喅楂樺苟鍙戝満鏅腑鑾峰彇鏃堕棿鎴虫�ц兘闂<p>
+ * 4.鏀拺鏍规嵁IP鏈熬鏁版嵁浣滀负workerId
+ * 5.鏃堕棿鍥炴嫧鏂规鎬濊�冿細1024涓妭鐐逛腑鍒嗛厤10涓偣浣滀负鏃堕棿鍥炴嫧搴忓彿锛堣繛缁�10娆℃椂闂村洖鎷ㄧ殑姒傜巼杈冨皬锛�
+ * <p>
+ * 甯歌闂:
+ * 1.鏃堕棿鍥炴嫧闂
+ * 2.鏈哄櫒id鐨勫垎閰嶅拰鍥炴敹闂
+ * 3.鏈哄櫒id鐨勪笂闄愰棶棰�
+ *
+ * @author lry
+ * @version 3.0
+ */
+@Component
+public class Sequence {
+
+    private static final Logger log = LoggerFactory.getLogger(Sequence.class);
+
+    /**
+     * 鏃堕棿璧峰鏍囪鐐癸紝浣滀负鍩哄噯锛屼竴鑸彇绯荤粺鐨勬渶杩戞椂闂达紙涓�鏃︾‘瀹氫笉鑳藉彉鍔級
+     */
+    private final long twepoch = 1519740777809L;
+
+    /**
+     * 5浣嶇殑鏈烘埧id
+     */
+    private final long datacenterIdBits = 5L;
+    /**
+     * 5浣嶇殑鏈哄櫒id
+     */
+    private final long workerIdBits = 5L;
+    /**
+     * 姣忔绉掑唴浜х敓鐨刬d鏁�: 2鐨�12娆℃柟涓�
+     */
+    private final long sequenceBits = 12L;
+
+    protected final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+    protected final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+    private final long workerIdShift = sequenceBits;
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+
+    /**
+     * 鏃堕棿鎴冲乏绉诲姩浣�
+     */
+    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+    /**
+     * 鎵�灞炴満鎴縤d
+     */
+    private final long datacenterId;
+    /**
+     * 鎵�灞炴満鍣╥d
+     */
+    private final long workerId;
+    /**
+     * 骞跺彂鎺у埗搴忓垪
+     */
+    private long sequence = 0L;
+
+    /**
+     * 涓婃鐢熶骇 ID 鏃堕棿鎴�
+     */
+    private long lastTimestamp = -1L;
+
+    private static volatile InetAddress LOCAL_ADDRESS = null;
+    private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");
+
+    public Sequence() {
+        this.datacenterId = getDatacenterId();
+        this.workerId = getMaxWorkerId(datacenterId);
+    }
+
+    /**
+     * 鏈夊弬鏋勯�犲櫒
+     *
+     * @param workerId     宸ヤ綔鏈哄櫒 ID
+     * @param datacenterId 搴忓垪鍙�
+     */
+    public Sequence(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;
+    }
+
+    /**
+     * 鍩轰簬缃戝崱MAC鍦板潃璁$畻浣欐暟浣滀负鏁版嵁涓績
+     * <p>
+     * 鍙嚜瀹氭墿灞�
+     */
+    protected long getDatacenterId() {
+        long id = 0L;
+        try {
+            NetworkInterface network = NetworkInterface.getByInetAddress(getLocalAddress());
+            if (null == network) {
+                id = 1L;
+            } else {
+                byte[] mac = network.getHardwareAddress();
+                if (null != mac) {
+                    id = ((0x000000FF & (long) mac[mac.length - 2]) | (0x0000FF00 & (((long) mac[mac.length - 1]) << 8))) >> 6;
+                    id = id % (maxDatacenterId + 1);
+                }
+            }
+        } catch (Exception e) {
+            log.warn(" getDatacenterId: " + e.getMessage());
+        }
+
+        return id;
+    }
+
+    /**
+     * 鍩轰簬 MAC + PID 鐨� hashcode 鑾峰彇16涓綆浣�
+     * <p>
+     * 鍙嚜瀹氭墿灞�
+     */
+    protected long getMaxWorkerId(long datacenterId) {
+        StringBuilder mpId = new StringBuilder();
+        mpId.append(datacenterId);
+        String name = ManagementFactory.getRuntimeMXBean().getName();
+        if (name != null && name.length() > 0) {
+            // GET jvmPid
+            mpId.append(name.split("@")[0]);
+        }
+
+        // MAC + PID 鐨� hashcode 鑾峰彇16涓綆浣�
+        return (mpId.toString().hashCode() & 0xffff) % (maxWorkerId + 1);
+    }
+
+    /**
+     * 鑾峰彇涓嬩竴涓� ID
+     *
+     * @return next id
+     */
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+        // 闂扮
+        if (timestamp < lastTimestamp) {
+            long offset = lastTimestamp - timestamp;
+            if (offset <= 5) {
+                try {
+                    // 浼戠湢鍙屽�嶅樊鍊煎悗閲嶆柊鑾峰彇锛屽啀娆℃牎楠�
+                    wait(offset << 1);
+                    timestamp = timeGen();
+                    if (timestamp < lastTimestamp) {
+                        throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", offset));
+                    }
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            } else {
+                throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", offset));
+            }
+        }
+
+        if (lastTimestamp == timestamp) {
+            // 鐩稿悓姣鍐咃紝搴忓垪鍙疯嚜澧�
+            sequence = (sequence + 1) & sequenceMask;
+            if (sequence == 0) {
+                // 鍚屼竴姣鐨勫簭鍒楁暟宸茬粡杈惧埌鏈�澶�
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        } else {
+            // 涓嶅悓姣鍐咃紝搴忓垪鍙风疆涓� 1 - 3 闅忔満鏁�
+            sequence = ThreadLocalRandom.current().nextLong(1, 3);
+        }
+
+        lastTimestamp = timestamp;
+
+        // 鏃堕棿鎴抽儴鍒� | 鏁版嵁涓績閮ㄥ垎 | 鏈哄櫒鏍囪瘑閮ㄥ垎 | 搴忓垪鍙烽儴鍒�
+        return ((timestamp - twepoch) << timestampLeftShift)
+                | (datacenterId << datacenterIdShift)
+                | (workerId << workerIdShift)
+                | sequence;
+    }
+
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+
+        return timestamp;
+    }
+
+    protected long timeGen() {
+        return SystemClock.INSTANCE.currentTimeMillis();
+    }
+
+    /**
+     * Find first valid IP from local network card
+     *
+     * @return first valid local IP
+     */
+    public static InetAddress getLocalAddress() {
+        if (LOCAL_ADDRESS != null) {
+            return LOCAL_ADDRESS;
+        }
+
+        LOCAL_ADDRESS = getLocalAddress0();
+        return LOCAL_ADDRESS;
+    }
+
+    private static InetAddress getLocalAddress0() {
+        InetAddress localAddress = null;
+        try {
+            localAddress = InetAddress.getLocalHost();
+            if (isValidAddress(localAddress)) {
+                return localAddress;
+            }
+        } catch (Throwable e) {
+            log.warn("Failed to retrieving ip address, " + e.getMessage(), e);
+        }
+
+        try {
+            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
+            if (interfaces != null) {
+                while (interfaces.hasMoreElements()) {
+                    try {
+                        NetworkInterface network = interfaces.nextElement();
+                        Enumeration<InetAddress> addresses = network.getInetAddresses();
+                        while (addresses.hasMoreElements()) {
+                            try {
+                                InetAddress address = addresses.nextElement();
+                                if (isValidAddress(address)) {
+                                    return address;
+                                }
+                            } catch (Throwable e) {
+                                log.warn("Failed to retrieving ip address, " + e.getMessage(), e);
+                            }
+                        }
+                    } catch (Throwable e) {
+                        log.warn("Failed to retrieving ip address, " + e.getMessage(), e);
+                    }
+                }
+            }
+        } catch (Throwable e) {
+            log.warn("Failed to retrieving ip address, " + e.getMessage(), e);
+        }
+
+        log.error("Could not get local host ip address, will use 127.0.0.1 instead.");
+        return localAddress;
+    }
+
+    private static boolean isValidAddress(InetAddress address) {
+        if (address == null || address.isLoopbackAddress()) {
+            return false;
+        }
+
+        String name = address.getHostAddress();
+        return (name != null && !"0.0.0.0".equals(name) && !"127.0.0.1".equals(name) && IP_PATTERN.matcher(name).matches());
+    }
+
+}
\ No newline at end of file
diff --git a/aps-modules/aps-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/aps-modules/aps-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
deleted file mode 100644
index 6d0f076..0000000
--- a/aps-modules/aps-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ /dev/null
@@ -1,2 +0,0 @@
-com.aps.common.core.utils.SpringUtils
-com.aps.common.core.utils.UUID.Sequence
\ No newline at end of file

--
Gitblit v1.9.3