From 140ff5db2b55d35f9413e99751f0aa2032892549 Mon Sep 17 00:00:00 2001 From: Gamebuster19901 Date: Mon, 27 Jan 2025 05:34:32 -0500 Subject: [PATCH] Make sure all threads are shutdown when the game is closed. --- .../autosplitter/net/SplitterServer.java | 23 +++++++++++++++++-- .../autosplitter/net/SplitterWebSocket.java | 6 ++++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/wildermods/autosplitter/net/SplitterServer.java b/src/main/java/com/wildermods/autosplitter/net/SplitterServer.java index d83752a..9bdffcf 100644 --- a/src/main/java/com/wildermods/autosplitter/net/SplitterServer.java +++ b/src/main/java/com/wildermods/autosplitter/net/SplitterServer.java @@ -1,12 +1,14 @@ package com.wildermods.autosplitter.net; -import java.net.InetSocketAddress; import java.util.concurrent.CopyOnWriteArrayList; import org.eclipse.jetty.ee10.servlet.ServletContextHandler; import org.eclipse.jetty.ee10.servlet.ServletHolder; import org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer; import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.thread.QueuedThreadPool; +import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler; import com.wildermods.autosplitter.AutosplitCommandSender; import com.wildermods.autosplitter.Main; @@ -20,6 +22,11 @@ public class SplitterServer extends Server implements AutosplitCommandSender { public static final String DEFAULT_HOST = "localhost"; public static final int DEFAULT_PORT = 55555; private static SplitterServer INSTANCE = null; + private final QueuedThreadPool threadPool = new QueuedThreadPool(4); + { + threadPool.setDaemon(true); + } + final CopyOnWriteArrayList clients = new CopyOnWriteArrayList<>(); @@ -45,8 +52,15 @@ public void establishServer(String host, int port) { LOGGER.catching(e); } } + Server server = null; + ScheduledExecutorScheduler scheduler = new ScheduledExecutorScheduler("Splitter Server Scheduler", true); try { - Server server = new Server(new InetSocketAddress(host, port)); + server = new Server(threadPool, scheduler, null); + + ServerConnector connector = new ServerConnector(this); + connector.setHost(host); + connector.setPort(port); + super.addConnector(connector); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); @@ -62,6 +76,11 @@ public void establishServer(String host, int port) { catch(Exception e) { Main.LOGGER.catching(e); } + finally { + if(server != null) { + server.setStopAtShutdown(true); + } + } } public Server getImpl() { diff --git a/src/main/java/com/wildermods/autosplitter/net/SplitterWebSocket.java b/src/main/java/com/wildermods/autosplitter/net/SplitterWebSocket.java index 2bd344a..138df77 100644 --- a/src/main/java/com/wildermods/autosplitter/net/SplitterWebSocket.java +++ b/src/main/java/com/wildermods/autosplitter/net/SplitterWebSocket.java @@ -23,7 +23,11 @@ public class SplitterWebSocket implements AutosplitCommandSender { private static final Logger LOGGER = new Logger(SplitterWebSocket.class); - private final ScheduledExecutorService heartbeatScheduler = Executors.newScheduledThreadPool(1); + private final ScheduledExecutorService heartbeatScheduler = Executors.newScheduledThreadPool(1, runnable -> { + Thread thread = new Thread("Splitter Heartbeat"); + thread.setDaemon(true); + return thread; + }); private Session session; private String sessionID;