From 825c0875d635a7d468f5190d0ccfcf3a24f1ed5f Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Fri, 2 Jan 2026 14:10:05 +0800 Subject: [PATCH] Ensure graceful shutdown for file IO executor service --- .../inventories/profile/AsyncFileIO.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/mvplugins/multiverse/inventories/profile/AsyncFileIO.java b/src/main/java/org/mvplugins/multiverse/inventories/profile/AsyncFileIO.java index fe3d1e0a..1b497114 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/profile/AsyncFileIO.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/profile/AsyncFileIO.java @@ -2,7 +2,7 @@ import com.dumptruckman.minecraft.util.Logging; import org.jvnet.hk2.annotations.Service; -import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jakarta.annotation.PreDestroy; import org.mvplugins.multiverse.external.vavr.control.Try; import java.io.File; @@ -10,11 +10,9 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import java.util.function.Supplier; @Service @@ -105,4 +103,20 @@ private void waitForLock(File file, CountDownLatch toWaitLatch) { ExecutorService getExecutor() { return fileIOExecutorService; } + + @PreDestroy + private void completeRemainingTaskAndShutdown() { + fileIOExecutorService.shutdown(); + try { + if (!fileIOExecutorService.awaitTermination(60, TimeUnit.SECONDS)) { + fileIOExecutorService.shutdownNow(); + if (!fileIOExecutorService.awaitTermination(60, TimeUnit.SECONDS)) { + Logging.severe("File IO executor did not terminate"); + } + } + } catch (InterruptedException ie) { + fileIOExecutorService.shutdownNow(); + Thread.currentThread().interrupt(); + } + } }