package org.ovirt.engine.core.notifier.utils; import java.util.LinkedList; import java.util.List; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Class designed to handle a proper shutdown in case of an external signal which was registered was caught by the * program. */ public class ShutdownHook extends Thread { private static final Logger log = LoggerFactory.getLogger(ShutdownHook.class); private List<ScheduledExecutorService> schedulers = new LinkedList<>(); private List<ScheduledFuture<?>> serviceHandlers = new LinkedList<>(); private static volatile ShutdownHook instance; public static ShutdownHook getInstance() { if (instance == null) { synchronized(ShutdownHook.class) { if (instance == null) { instance = new ShutdownHook(); } } } return instance; } private ShutdownHook() { Runtime.getRuntime().addShutdownHook(this); } @Override public void run() { log.info("Preparing for shutdown after receiving signal " ); for (ScheduledFuture<?> scheduled : serviceHandlers) { scheduled.cancel(true); } for (ScheduledExecutorService executer : schedulers) { executer.shutdown(); } log.info("Event Notification service was shutdown"); } public void addScheduledExecutorService(ScheduledExecutorService scheduler) { schedulers.add(scheduler); } public void addServiceHandler(ScheduledFuture<?> serviceHandler) { serviceHandlers.add(serviceHandler); } }