From 8a9c8e8f55fec35d4b791fe4412d5e3ec3bc6bdf Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Mon, 28 Oct 2019 12:56:03 +0200 Subject: [PATCH] Ensure that vert.x is closed after Arc Fixes: #4834 --- .../builditem/ShutdownContextBuildItem.java | 5 +++++ .../java/io/quarkus/runtime/ShutdownContext.java | 3 +++ .../java/io/quarkus/runtime/StartupContext.java | 16 ++++++++++++++-- .../vertx/core/runtime/VertxCoreRecorder.java | 4 +++- 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/deployment/src/main/java/io/quarkus/deployment/builditem/ShutdownContextBuildItem.java b/core/deployment/src/main/java/io/quarkus/deployment/builditem/ShutdownContextBuildItem.java index 72c0fd17bb746..fbc73832f4431 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/builditem/ShutdownContextBuildItem.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/builditem/ShutdownContextBuildItem.java @@ -23,4 +23,9 @@ public final class ShutdownContextBuildItem extends SimpleBuildItem public void addShutdownTask(Runnable runnable) { throw new IllegalStateException(); } + + @Override + public void addLastShutdownTask(Runnable runnable) { + throw new IllegalStateException(); + } } diff --git a/core/runtime/src/main/java/io/quarkus/runtime/ShutdownContext.java b/core/runtime/src/main/java/io/quarkus/runtime/ShutdownContext.java index 1435b54078363..54995c59efba7 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/ShutdownContext.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/ShutdownContext.java @@ -8,4 +8,7 @@ public interface ShutdownContext { void addShutdownTask(Runnable runnable); + + // these are executed after all the ones add via addShutdownTask in the reverse order from which they were added + void addLastShutdownTask(Runnable runnable); } diff --git a/core/runtime/src/main/java/io/quarkus/runtime/StartupContext.java b/core/runtime/src/main/java/io/quarkus/runtime/StartupContext.java index 104d9d56a5261..efbc097dfa7b2 100644 --- a/core/runtime/src/main/java/io/quarkus/runtime/StartupContext.java +++ b/core/runtime/src/main/java/io/quarkus/runtime/StartupContext.java @@ -15,11 +15,17 @@ public class StartupContext implements Closeable { private final Map values = new HashMap<>(); private final List shutdownTasks = new ArrayList<>(); + private final List lastShutdownTasks = new ArrayList<>(); private final ShutdownContext shutdownContext = new ShutdownContext() { @Override public void addShutdownTask(Runnable runnable) { shutdownTasks.add(runnable); } + + @Override + public void addLastShutdownTask(Runnable runnable) { + lastShutdownTasks.add(runnable); + } }; public StartupContext() { @@ -36,7 +42,14 @@ public Object getValue(String name) { @Override public void close() { - List toClose = new ArrayList<>(shutdownTasks); + runAllInReverseOrder(shutdownTasks); + shutdownTasks.clear(); + runAllInReverseOrder(lastShutdownTasks); + lastShutdownTasks.clear(); + } + + private void runAllInReverseOrder(List tasks) { + List toClose = new ArrayList<>(tasks); Collections.reverse(toClose); for (Runnable r : toClose) { try { @@ -45,6 +58,5 @@ public void close() { LOG.error("Running a shutdown task failed", e); } } - shutdownTasks.clear(); } } diff --git a/extensions/vertx-core/runtime/src/main/java/io/quarkus/vertx/core/runtime/VertxCoreRecorder.java b/extensions/vertx-core/runtime/src/main/java/io/quarkus/vertx/core/runtime/VertxCoreRecorder.java index 28066ce79099c..d86ffbe45445c 100644 --- a/extensions/vertx-core/runtime/src/main/java/io/quarkus/vertx/core/runtime/VertxCoreRecorder.java +++ b/extensions/vertx-core/runtime/src/main/java/io/quarkus/vertx/core/runtime/VertxCoreRecorder.java @@ -51,7 +51,9 @@ public Supplier configureVertx(BeanContainer container, VertxConfiguratio VertxCoreProducer producer = container.instance(VertxCoreProducer.class); producer.initialize(vertx); if (launchMode != LaunchMode.DEVELOPMENT) { - shutdown.addShutdownTask(new Runnable() { + // we need this to be part of the last shutdown tasks because closing it early (basically before Arc) + // could cause problem to beans that rely on Vert.x and contain shutdown tasks + shutdown.addLastShutdownTask(new Runnable() { @Override public void run() { destroy();