package com.vip.saturn.job.basic; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.LoggerContext; import sun.misc.Signal; import sun.misc.SignalHandler; /** * Saturn优雅退出: 退出时清理信息 * @author dylan.xue */ @SuppressWarnings("restriction") public class ShutdownHandler implements SignalHandler { static Logger log = LoggerFactory.getLogger(ShutdownHandler.class); private static List<Runnable> listeners = new ArrayList<Runnable>(); private static ShutdownHandler handler; static{ handler = new ShutdownHandler(true); Signal.handle(new Signal("TERM"), handler); // 相当于kill -15 Signal.handle(new Signal("INT"), handler); // 相当于Ctrl+C } public ShutdownHandler(boolean _exit) { exit = _exit; } private boolean exit = true; public static void addShutdownCallback(Runnable c){ listeners.add(c); } @Override public void handle(Signal sn) { if (listeners != null) { for (Runnable callable : listeners) { try { if (callable != null) { callable.run(); } } catch (Exception e) { log.error("msg=" + e.getMessage(), e); } } } // stop loggerContext LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); loggerContext.stop(); try { Thread.sleep(3000); } catch (InterruptedException e) { log.error("msg=" + e.getMessage(),e); } // 退出 log.info("msg=Saturn is shutdown..."); if(exit){ System.exit(-1); } } }