1. 雪花Id生成器
/** * 雪花算法生成id * @author * */public class Snowflake { private final static long TWEPOCH = 1288834974657L; // 机器标识位数 private final static long WORKER_ID_BITS = 5L; // 数据中心标识位数 private final static long DATA_CENTER_ID_BITS = 5L; // 机器ID最大值 31 private final static long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS); // 数据中心ID最大值 31 private final static long MAX_DATA_CENTER_ID = -1L ^ (-1L << DATA_CENTER_ID_BITS); // 毫秒内自增位 private final static long SEQUENCE_BITS = 12L; // 机器ID偏左移12位 private final static long WORKER_ID_SHIFT = SEQUENCE_BITS; private final static long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS; // 工夫毫秒左移22位 private final static long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS; private final static long SEQUENCE_MASK = -1L ^ (-1L << SEQUENCE_BITS); private long lastTimestamp = -1L; private long sequence = 0L; private final long workerId; private final long dataCenterId; private static volatile Snowflake snowflake = null; private static Object lock = new Object(); //单例禁止new实例化 private Snowflake(long workerId, long dataCenterId) { if (workerId > MAX_WORKER_ID || workerId < 0) { workerId = getRandom(); } if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) { throw new IllegalArgumentException(String.format("%s 数据中心ID最大值 必须是 %d 到 %d 之间", dataCenterId, 0, MAX_DATA_CENTER_ID)); } this.workerId = workerId; this.dataCenterId = dataCenterId; } /** * 获取单列 * * @return */ public static Snowflake getInstanceSnowflake() { if (snowflake == null) { synchronized (lock) { long workerId ; long dataCenterId = getRandom(); try { //第一次应用获取mac地址的 workerId = getWorkerId(); } catch (Exception e) { workerId = getRandom(); } snowflake = new Snowflake(workerId, dataCenterId); } } return snowflake; } /** * 生成1-31之间的随机数 * * @return */ private static long getRandom() { int max = (int) (MAX_WORKER_ID); int min = 1; Random random = new Random(); long result = random.nextInt(max - min) + min; return result; } public static String getSnowflakeId() throws Exception{ return Snowflake.getInstanceSnowflake().nextId()+""; } private synchronized long nextId() throws Exception { long timestamp = time(); if (timestamp < lastTimestamp) { throw new Exception("时钟向后挪动,回绝生成id " + (lastTimestamp - timestamp) + " milliseconds"); } if (lastTimestamp == timestamp) { // 以后毫秒内,则+1 sequence = (sequence + 1) & SEQUENCE_MASK; if (sequence == 0) { // 以后毫秒内计数满了,则期待下一秒 timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0; } lastTimestamp = timestamp; // ID偏移组合生成最终的ID,并返回ID long nextId = ((timestamp - TWEPOCH) << TIMESTAMP_LEFT_SHIFT) | (dataCenterId << DATA_CENTER_ID_SHIFT) | (workerId << WORKER_ID_SHIFT) | sequence; return nextId; } private long tilNextMillis(final long lastTimestamp) { long timestamp = this.time(); while (timestamp <= lastTimestamp) { timestamp = this.time(); } return timestamp; } private long time() { return System.currentTimeMillis(); } @SuppressWarnings("Duplicates") private static long getWorkerId() throws SocketException, UnknownHostException, NullPointerException { @SuppressWarnings("unused") InetAddress ip = InetAddress.getLocalHost(); NetworkInterface network = null; Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); while (en.hasMoreElements()) { NetworkInterface nint = en.nextElement(); if (!nint.isLoopback() && nint.getHardwareAddress() != null) { network = nint; break; } } @SuppressWarnings("ConstantConditions") byte[] mac = network.getHardwareAddress(); Random rnd = new Random(); byte rndByte = (byte) (rnd.nextInt() & 0x000000FF); // 取mac地址最初一位和随机数 return ((0x000000FF & (long) mac[mac.length - 1]) | (0x0000FF00 & (((long) rndByte) << 8))) >> 6; } public static void main(String[] args) { long start = System.currentTimeMillis(); try { for (int i = 0, len = 1000000; i < len; i++) { //getSnowflakeId(); System.out.println(getSnowflakeId()); } } catch (Exception e) { } System.out.println("100万耗时: " + (System.currentTimeMillis()-start) + "ms"); }}
2. 实现接口重写办法
@Configurationpublic class FlowableConfiguration implements EngineConfigurationConfigurer<SpringProcessEngineConfiguration>{ @Override public void configure(SpringProcessEngineConfiguration springProcessEngineConfiguration) { springProcessEngineConfiguration.setIdGenerator(new IdGenerator() { @Override public String getNextId() { try { return Snowflake.getSnowflakeId(); //id生成办法 }catch (Exception e) { } return null; } }); }}
3. 实现