package tc.oc.commons.core.restart; import java.util.HashSet; import java.util.Set; import java.util.logging.Logger; /** * Fired by {@link RestartManager} when a server restart is requested. The server * will normally restart immediately after the event returns. To defer the restart, * call {@link #defer} to get a {@link Deferral} object, then call * {@link Deferral#resume} on that at some future time to resume the restart. */ public class RequestRestartEvent { private final Logger logger; private final String reason; private final int priority; private final Runnable callback; private final Set<Deferral> deferrals = new HashSet<>(); public RequestRestartEvent(Logger logger, String reason, int priority, Runnable callback) { this.logger = logger; this.reason = reason; this.priority = priority; this.callback = callback; } public String reason() { return reason; } public int priority() { return priority; } Set<Deferral> deferrals() { return deferrals; } public Deferral defer(String deferrerName) { logger.info("Restart deferred by " + deferrerName); Deferral deferral = new Deferral(deferrerName); deferrals.add(deferral); return deferral; } public class Deferral { private final String deferrerName; public Deferral(String deferrerName) { this.deferrerName = deferrerName; } public RequestRestartEvent request() { return RequestRestartEvent.this; } public String deferrerName() { return deferrerName; } /** * Allow the deferred restart to proceed. After this method is called, * this object becomes useless and can be discarded. */ public void resume() { if(deferrals.remove(this)) { logger.info("Restart resumed by " + deferrerName); callback.run(); } } } }