diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/core/util/WorkerIdUtil.java b/accompany-base/accompany-core/src/main/java/com/accompany/core/util/WorkerIdUtil.java index 51a3237e7..da17c191a 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/core/util/WorkerIdUtil.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/core/util/WorkerIdUtil.java @@ -7,6 +7,7 @@ import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Arrays; +import java.util.Enumeration; @Slf4j public class WorkerIdUtil { @@ -30,17 +31,45 @@ public class WorkerIdUtil { String ip = host.getHostAddress(); byte[] mac = null; + try { - mac = NetworkInterface.getByInetAddress(host).getHardwareAddress(); + NetworkInterface networkInterface = NetworkInterface.getByInetAddress(host); + if (networkInterface != null) { + mac = networkInterface.getHardwareAddress(); + } } catch (SocketException e) { log.error("[workerId] 获取不到ip {} 的 mac地址", ip); - throw new RuntimeException(e); + } + + // 如果通过InetAddress找不到MAC地址,则尝试遍历网络接口 + if (mac == null) { + try { + Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); + while (networkInterfaces.hasMoreElements()) { + NetworkInterface networkInterface = networkInterfaces.nextElement(); + if (!networkInterface.isLoopback() && networkInterface.getHardwareAddress() != null) { + mac = networkInterface.getHardwareAddress(); + log.info("[workerId] 通过遍历网络接口获取到MAC地址"); + break; + } + } + } catch (SocketException e) { + log.error("[workerId] 遍历网络接口获取MAC地址失败", e); + } + } + + // 如果仍然找不到MAC地址,则使用IP地址的哈希值 + if (mac == null) { + log.warn("[workerId] 无法获取MAC地址,使用IP地址哈希生成workerId"); + long workerId = Math.abs(ip.hashCode()) % 32; + log.info("Generated workerId: {} from IP: {}", workerId, ip); + return workerId; } // 根据 MAC 或 IP 哈希生成 workerId long workerId = Math.abs(Arrays.hashCode(mac)) % 32; - log.info("Generated workerId: {} from IP: {} MAC: {}", workerId, ip, mac); + log.info("Generated workerId: {} from IP: {} MAC: {}", workerId, ip, Arrays.toString(mac)); return workerId; } } \ No newline at end of file