From 5d34d8544df427c586bd892158755f12bee26e57 Mon Sep 17 00:00:00 2001 From: Jason Xu Date: Wed, 18 Mar 2026 00:46:53 +0800 Subject: [PATCH] Fix potential thread leak on init failures Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../discord_mc_chat/server/discord/DiscordManager.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordManager.java b/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordManager.java index 72f64858..2e00356f 100644 --- a/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordManager.java +++ b/core/src/main/java/com/xujiayao/discord_mc_chat/server/discord/DiscordManager.java @@ -72,6 +72,7 @@ public class DiscordManager { try { // Blocks until JDA is ready CompletableFuture readyFuture = CompletableFuture.runAsync(() -> { + ExecutorService eventExecutor = Executors.newSingleThreadExecutor(ExecutorServiceUtils.newThreadFactory("DMCC-DiscordEvent")); try { jda = JDABuilder.createDefault(token) .enableIntents( @@ -80,13 +81,17 @@ public class DiscordManager { GatewayIntent.GUILD_MESSAGE_REACTIONS ) .setMemberCachePolicy(MemberCachePolicy.ALL) - .setEventPool(Executors.newSingleThreadExecutor(ExecutorServiceUtils.newThreadFactory("DMCC-DiscordEvent")), true) + .setEventPool(eventExecutor, true) .addEventListeners(new DiscordEventHandler()) .build(); jda.awaitReady(); } catch (InterruptedException e) { LOGGER.error(I18nManager.getDmccTranslation("discord.manager.init_interrupted"), e); + } catch (RuntimeException e) { + // If build() fails before JDA takes ownership of the event executor, shut it down to avoid leaks + eventExecutor.shutdownNow(); + throw e; } }, executor);