From 59f0cd2529f42adad5b2210ba4dd5907f85d4e51 Mon Sep 17 00:00:00 2001 From: Xujiayao Date: Sun, 21 Dec 2025 17:43:01 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80shutdown=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xujiayao/discord_mc_chat/DMCC.java | 13 ++----- .../discord_mc_chat/client/ClientDMCC.java | 14 ++------ .../commands/CommandEventHandler.java | 26 +++++--------- .../discord_mc_chat/server/ServerDMCC.java | 14 ++------ .../utils/ExecutorServiceUtils.java | 34 +++++++++++++++++++ 5 files changed, 49 insertions(+), 52 deletions(-) create mode 100644 core/src/main/java/com/xujiayao/discord_mc_chat/utils/ExecutorServiceUtils.java diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/DMCC.java b/core/src/main/java/com/xujiayao/discord_mc_chat/DMCC.java index 0bb0fb95..05afef97 100644 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/DMCC.java +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/DMCC.java @@ -4,6 +4,7 @@ import com.xujiayao.discord_mc_chat.client.ClientDMCC; import com.xujiayao.discord_mc_chat.commands.CommandEventHandler; import com.xujiayao.discord_mc_chat.server.ServerDMCC; import com.xujiayao.discord_mc_chat.standalone.TerminalManager; +import com.xujiayao.discord_mc_chat.utils.ExecutorServiceUtils; import com.xujiayao.discord_mc_chat.utils.config.ConfigManager; import com.xujiayao.discord_mc_chat.utils.config.ModeManager; import com.xujiayao.discord_mc_chat.utils.events.EventManager; @@ -160,16 +161,8 @@ public class DMCC { // Shutdown OkHttpClient try (ExecutorService executor = OK_HTTP_CLIENT.dispatcher().executorService(); - Cache ignored1 = OK_HTTP_CLIENT.cache()) { - executor.shutdown(); - if (ConfigManager.getBoolean("shutdown.graceful_shutdown")) { - // Allow up to 10 minutes for ongoing requests to complete - boolean ignored2 = executor.awaitTermination(10, TimeUnit.MINUTES); - } else { - // Allow up to 5 seconds for ongoing requests to complete - boolean ignored2 = executor.awaitTermination(5, TimeUnit.SECONDS); - } - executor.shutdownNow(); + Cache ignored = OK_HTTP_CLIENT.cache()) { + ExecutorServiceUtils.shutdownAnExecutor(executor); OK_HTTP_CLIENT.connectionPool().evictAll(); } catch (Exception e) { diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/client/ClientDMCC.java b/core/src/main/java/com/xujiayao/discord_mc_chat/client/ClientDMCC.java index e030599f..0fe34da3 100644 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/client/ClientDMCC.java +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/client/ClientDMCC.java @@ -1,5 +1,6 @@ package com.xujiayao.discord_mc_chat.client; +import com.xujiayao.discord_mc_chat.utils.ExecutorServiceUtils; import com.xujiayao.discord_mc_chat.utils.config.ConfigManager; import java.util.concurrent.ExecutorService; @@ -43,18 +44,7 @@ public class ClientDMCC { nettyClient.stop(); } - executor.shutdown(); - try { - if (ConfigManager.getBoolean("shutdown.graceful_shutdown")) { - // Allow up to 10 minutes for ongoing requests to complete - boolean ignored = executor.awaitTermination(10, TimeUnit.MINUTES); - } else { - // Allow up to 5 seconds for ongoing requests to complete - boolean ignored = executor.awaitTermination(5, TimeUnit.SECONDS); - } - } catch (Exception ignored) { - } - executor.shutdownNow(); + ExecutorServiceUtils.shutdownAnExecutor(executor); LOGGER.info("DMCC Client component shut down."); } diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/commands/CommandEventHandler.java b/core/src/main/java/com/xujiayao/discord_mc_chat/commands/CommandEventHandler.java index 1607561e..63ff8290 100644 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/commands/CommandEventHandler.java +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/commands/CommandEventHandler.java @@ -1,7 +1,9 @@ package com.xujiayao.discord_mc_chat.commands; import com.xujiayao.discord_mc_chat.DMCC; +import com.xujiayao.discord_mc_chat.utils.ExecutorServiceUtils; import com.xujiayao.discord_mc_chat.utils.StringUtils; +import com.xujiayao.discord_mc_chat.utils.config.ConfigManager; import com.xujiayao.discord_mc_chat.utils.events.EventManager; import com.xujiayao.discord_mc_chat.utils.i18n.I18nManager; @@ -18,21 +20,19 @@ import static com.xujiayao.discord_mc_chat.Constants.LOGGER; */ public class CommandEventHandler { - private static ExecutorService commandExecutor; + private static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor(r -> new Thread(r, "DMCC-Command"));; /** * Initializes the Command event handlers. */ public static void init() { - commandExecutor = Executors.newSingleThreadExecutor(r -> new Thread(r, "DMCC-Command")); + EventManager.register(CommandEvents.DisableEvent.class, event -> EXECUTOR.submit(DMCC::shutdown)); - EventManager.register(CommandEvents.DisableEvent.class, event -> commandExecutor.submit(DMCC::shutdown)); + EventManager.register(CommandEvents.EnableEvent.class, event -> EXECUTOR.submit(DMCC::init)); - EventManager.register(CommandEvents.EnableEvent.class, event -> commandExecutor.submit(DMCC::init)); + EventManager.register(CommandEvents.ReloadEvent.class, event -> EXECUTOR.submit(DMCC::reload)); - EventManager.register(CommandEvents.ReloadEvent.class, event -> commandExecutor.submit(DMCC::reload)); - - EventManager.register(CommandEvents.ShutdownEvent.class, event -> commandExecutor.submit(() -> { + EventManager.register(CommandEvents.ShutdownEvent.class, event -> EXECUTOR.submit(() -> { System.exit(0); })); @@ -65,16 +65,6 @@ public class CommandEventHandler { * Shuts down the command executor service. */ public static void shutdown() { - if (commandExecutor != null && !commandExecutor.isShutdown()) { - commandExecutor.shutdown(); - try { - if (!commandExecutor.awaitTermination(5, TimeUnit.SECONDS)) { - commandExecutor.shutdownNow(); - } - } catch (InterruptedException e) { - commandExecutor.shutdownNow(); - Thread.currentThread().interrupt(); - } - } + ExecutorServiceUtils.shutdownAnExecutor(EXECUTOR); } } diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/server/ServerDMCC.java b/core/src/main/java/com/xujiayao/discord_mc_chat/server/ServerDMCC.java index 7a55f0e5..a0c64a5c 100644 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/server/ServerDMCC.java +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/server/ServerDMCC.java @@ -1,6 +1,7 @@ package com.xujiayao.discord_mc_chat.server; import com.xujiayao.discord_mc_chat.server.discord.DiscordManager; +import com.xujiayao.discord_mc_chat.utils.ExecutorServiceUtils; import com.xujiayao.discord_mc_chat.utils.config.ConfigManager; import java.util.concurrent.ExecutorService; @@ -72,18 +73,7 @@ public class ServerDMCC { DiscordManager.shutdown(); - executor.shutdown(); - try { - if (ConfigManager.getBoolean("shutdown.graceful_shutdown")) { - // Allow up to 10 minutes for ongoing requests to complete - boolean ignored = executor.awaitTermination(10, TimeUnit.MINUTES); - } else { - // Allow up to 5 seconds for ongoing requests to complete - boolean ignored = executor.awaitTermination(5, TimeUnit.SECONDS); - } - } catch (Exception ignored) { - } - executor.shutdownNow(); + ExecutorServiceUtils.shutdownAnExecutor(executor); LOGGER.info("DMCC Server component shut down."); } diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/utils/ExecutorServiceUtils.java b/core/src/main/java/com/xujiayao/discord_mc_chat/utils/ExecutorServiceUtils.java new file mode 100644 index 00000000..dad169ec --- /dev/null +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/utils/ExecutorServiceUtils.java @@ -0,0 +1,34 @@ +package com.xujiayao.discord_mc_chat.utils; + +import com.xujiayao.discord_mc_chat.utils.config.ConfigManager; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; + +/** + * Utility class for ExecutorService related operations. + * + * @author Xujiayao + */ +public class ExecutorServiceUtils { + + /** + * Shuts down the given ExecutorService gracefully based on configuration. + * + * @param executor the ExecutorService to shut down + */ + public static void shutdownAnExecutor(ExecutorService executor) { + executor.shutdown(); + try { + if (ConfigManager.getBoolean("shutdown.graceful_shutdown")) { + // Allow up to 10 minutes for ongoing requests to complete + boolean ignored = executor.awaitTermination(10, TimeUnit.MINUTES); + } else { + // Allow up to 5 seconds for ongoing requests to complete + boolean ignored = executor.awaitTermination(5, TimeUnit.SECONDS); + } + } catch (Exception ignored) { + } + executor.shutdownNow(); + } +}