]>
nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/Shutdown.java
1 package org
.asamk
.signal
;
3 import org
.slf4j
.Logger
;
4 import org
.slf4j
.LoggerFactory
;
6 import java
.util
.concurrent
.CompletableFuture
;
7 import java
.util
.concurrent
.ExecutionException
;
9 import sun
.misc
.Signal
;
11 public class Shutdown
{
13 private static final Logger logger
= LoggerFactory
.getLogger(Shutdown
.class);
14 private static final CompletableFuture
<Void
> shutdown
= new CompletableFuture
<>();
15 private static final CompletableFuture
<Void
> shutdownComplete
= new CompletableFuture
<>();
16 private static boolean initialized
= false;
18 public static void installHandler() {
23 Signal
.handle(new Signal("INT"), Shutdown
::handleSignal
);
24 Signal
.handle(new Signal("TERM"), Shutdown
::handleSignal
);
25 Runtime
.getRuntime().addShutdownHook(Thread
.ofPlatform().unstarted(() -> {
26 logger
.debug("JVM is shutting down");
27 if (!shutdown
.isDone()) {
32 logger
.debug("Waiting for app to shut down");
33 shutdownComplete
.get();
34 logger
.debug("Exiting");
35 } catch (InterruptedException
| ExecutionException e
) {
36 throw new RuntimeException(e
);
41 public static void triggerShutdown() {
42 logger
.debug("Triggering shutdown.");
43 shutdown
.complete(null);
46 public static void waitForShutdown() throws InterruptedException
{
49 } catch (ExecutionException e
) {
50 throw new RuntimeException(e
);
54 public static void registerShutdownListener(Runnable action
) {
55 shutdown
.thenRun(action
);
58 static void shutdownComplete() {
59 shutdownComplete
.complete(null);
62 private static void handleSignal(Signal signal
) {
63 logger
.info("Received {} signal, shutting down ...", signal
);