All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.netease.nim.camellia.id.gen.springboot.segment.CamelliaIdGenSegmentServerStatus Maven / Gradle / Ivy

The newest version!
package com.netease.nim.camellia.id.gen.springboot.segment;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * Created by caojiajun on 2023/1/9
 */
public class CamelliaIdGenSegmentServerStatus {

    private static final Logger logger = LoggerFactory.getLogger(CamelliaIdGenSegmentServerStatus.class);
    private static final Set onlineCallbackSet = new HashSet<>();
    private static final Set offlineCallbackSet = new HashSet<>();

    private static class TimeCachedThread extends Thread {
        private static volatile long currentTimeMillis = System.currentTimeMillis();

        TimeCachedThread() {
            setName("HealthStatus-TimeCachedThread-" + getId());
            setDaemon(true);
        }

        static {
            new TimeCachedThread().start();
        }
        public void run() {
            while (true) {
                currentTimeMillis = System.currentTimeMillis();
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException ignore) {
                }
            }
        }
    }

    private static Status status = Status.ONLINE;
    private static long lastUseTime = System.currentTimeMillis();

    public enum Status {
        ONLINE,
        OFFLINE,
        ;
    }

    public static Status getStatus() {
        return status;
    }

    public static void setStatus(Status status) {
        CamelliaIdGenSegmentServerStatus.status = status;
        if (status == Status.ONLINE) {
            invokeOnlineCallback();
        } else if (status == Status.OFFLINE) {
            invokeOfflineCallback();
        }
    }

    public static void updateLastUseTime() {
        lastUseTime = TimeCachedThread.currentTimeMillis;
    }

    public static boolean isIdle() {
        return isIdle(20);
    }

    public static boolean isIdle(int idleSeconds) {
        return TimeCachedThread.currentTimeMillis - lastUseTime > idleSeconds*1000L;
    }

    public static void invokeOnlineCallback() {
        for (Runnable runnable : onlineCallbackSet) {
            try {
                runnable.run();
            } catch (Exception e) {
                logger.error("online callback error", e);
            }
        }
    }

    public static void invokeOfflineCallback() {
        for (Runnable runnable : offlineCallbackSet) {
            try {
                runnable.run();
            } catch (Exception e) {
                logger.error("offline callback error", e);
            }
        }
    }

    public static synchronized void registerOnlineCallback(Runnable task) {
        onlineCallbackSet.add(task);
    }

    public static synchronized void registerOfflineCallback(Runnable task) {
        offlineCallbackSet.add(task);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy