From 9bf82012b88e26e7d55ebdae1b1ed0dad05f1967 Mon Sep 17 00:00:00 2001 From: Xujiayao Date: Mon, 19 Jan 2026 15:36:01 +0800 Subject: [PATCH] Refactor CommandManager to manage command executor lifecycle and add shutdown method --- .../com/xujiayao/discord_mc_chat/DMCC.java | 2 ++ .../commands/CommandManager.java | 22 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) 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 9d7a2cfb..d25b5f93 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 @@ -152,6 +152,8 @@ public class DMCC { serverInstance.shutdown(); } + CommandManager.shutdown(); + // Do NOT clear event handlers here. They are registered once during mod initialization // and should persist across DMCC reloads. // EventManager.clear(); diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/commands/CommandManager.java b/core/src/main/java/com/xujiayao/discord_mc_chat/commands/CommandManager.java index d1f04a3f..2141266f 100644 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/commands/CommandManager.java +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/commands/CommandManager.java @@ -22,12 +22,16 @@ import java.util.concurrent.Executors; public class CommandManager { private static final Map COMMANDS = new ConcurrentHashMap<>(); - private static final ExecutorService COMMAND_EXECUTOR = Executors.newSingleThreadExecutor(ExecutorServiceUtils.newThreadFactory("DMCC-Command")); + private static ExecutorService commandExecutor; /** * Initialize and register built-in commands based on the current operating mode. */ public static void initialize() { + if (commandExecutor == null || commandExecutor.isShutdown()) { + commandExecutor = Executors.newSingleThreadExecutor(ExecutorServiceUtils.newThreadFactory("DMCC-Command")); + } + COMMANDS.clear(); register(new HelpCommand()); @@ -38,6 +42,16 @@ public class CommandManager { } } + /** + * Shutdown the command executor. + */ + public static void shutdown() { + if (commandExecutor != null) { + commandExecutor.shutdown(); + commandExecutor = null; + } + } + /** * Register a command. * @@ -63,7 +77,11 @@ public class CommandManager { * @param rawInput The raw command line */ public static void execute(CommandSender sender, String rawInput) { - COMMAND_EXECUTOR.submit(() -> { + if (commandExecutor == null || commandExecutor.isShutdown()) { + return; + } + + commandExecutor.submit(() -> { String line = rawInput == null ? "" : rawInput.trim(); if (line.isEmpty()) { sender.reply(I18nManager.getDmccTranslation("terminal.unknown_command", rawInput));