✨ Run shutdown hook only when shutdown command is sent
authorDavid Roden <github-a8in@qsheltier.de>
Fri, 24 Jan 2025 19:24:54 +0000 (20:24 +0100)
committerDavid Roden <github-a8in@qsheltier.de>
Sat, 25 Jan 2025 09:27:49 +0000 (10:27 +0100)
server/src/main/java/de/qsheltier/msta/Server.java
server/src/test/java/de/qsheltier/msta/ServerTest.java

index 8176618..dce8b8b 100644 (file)
@@ -78,12 +78,11 @@ public class Server implements Closeable {
                new Thread(() -> {
                        try {
                                startLatch.countDown();
-                               var socket = serverSocket.accept();
-                               handleSocket(socket.getInputStream(), socket.getOutputStream());
+                               try (var socket = serverSocket.accept()) {
+                                       handleSocket(socket.getInputStream(), socket.getOutputStream());
+                               }
                        } catch (IOException e) {
                                /* swallow exceptions. */
-                       } finally {
-                               shutdownHook.run();
                        }
                }).start();
                startLatch.await();
@@ -158,6 +157,10 @@ public class Server implements Closeable {
                        }).start();
                        String line;
                        while ((line = inputReader.readLine()) != null) {
+                               if (line.equalsIgnoreCase("shutdown")) {
+                                       shutdownHook.run();
+                                       break;
+                               }
                        }
                } finally {
                        finished.set(true);
index 3077005..480b90c 100644 (file)
@@ -3,7 +3,9 @@ package de.qsheltier.msta;
 import java.awt.Frame;
 import java.awt.Window;
 import java.io.BufferedReader;
+import java.io.BufferedWriter;
 import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.concurrent.TimeUnit;
@@ -12,6 +14,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Timeout;
 import org.junit.jupiter.api.function.ThrowingConsumer;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.not;
@@ -41,11 +44,15 @@ public class ServerTest {
 
        @Test
        @Timeout(value = 5, unit = TimeUnit.SECONDS, threadMode = SEPARATE_THREAD)
-       public void serverRunsShutdownHookWhenConnectionIsClosed() throws Exception {
+       public void serverRunsShutdownHookWhenShutdownCommandIsSent() throws Exception {
                var shutdown = new AtomicBoolean();
                try (var server = new Server(() -> shutdown.set(true))) {
                        server.start();
-                       try (var ignored = new Socket("localhost", server.getPort())) {
+                       try (var socket = new Socket("localhost", server.getPort());
+                            var writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), UTF_8))) {
+                               writer.write("shutdown\n");
+                               writer.flush();
+                               Thread.yield();
                        }
                        while (!shutdown.get()) {
                                Thread.yield();