From b74f7c446370c4026f202375a400930ee1a9ca80 Mon Sep 17 00:00:00 2001 From: John Niang Date: Mon, 22 Apr 2024 16:57:53 +0800 Subject: [PATCH] Cleanup resources when plugin startup fails (#5765) Signed-off-by: JohnNiang --- .../run/halo/app/plugin/SpringPlugin.java | 57 +++++++++++-------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/application/src/main/java/run/halo/app/plugin/SpringPlugin.java b/application/src/main/java/run/halo/app/plugin/SpringPlugin.java index 2f6624f8d..71faf8718 100644 --- a/application/src/main/java/run/halo/app/plugin/SpringPlugin.java +++ b/application/src/main/java/run/halo/app/plugin/SpringPlugin.java @@ -25,37 +25,47 @@ public class SpringPlugin extends Plugin { @Override public void start() { - // initialize context - var pluginId = pluginContext.getName(); - this.context = contextFactory.create(pluginId); + try { + // initialize context + var pluginId = pluginContext.getName(); + this.context = contextFactory.create(pluginId); - var pluginOpt = context.getBeanProvider(Plugin.class) - .stream() - .findFirst(); - context.publishEvent(new SpringPluginStartingEvent(this, this)); - if (pluginOpt.isPresent()) { - this.delegate = pluginOpt.get(); - if (this.delegate instanceof BasePlugin basePlugin) { - basePlugin.setContext(pluginContext); + var pluginOpt = context.getBeanProvider(Plugin.class) + .stream() + .findFirst(); + context.publishEvent(new SpringPluginStartingEvent(this, this)); + if (pluginOpt.isPresent()) { + this.delegate = pluginOpt.get(); + if (this.delegate instanceof BasePlugin basePlugin) { + basePlugin.setContext(pluginContext); + } + this.delegate.start(); } - this.delegate.start(); + context.publishEvent(new SpringPluginStartedEvent(this, this)); + } catch (Throwable t) { + // try to stop plugin for cleaning resources if something went wrong + this.stop(); + // propagate exception to invoker. + throw t; } - context.publishEvent(new SpringPluginStartedEvent(this, this)); } @Override public void stop() { - if (context != null) { - context.publishEvent(new SpringPluginStoppingEvent(this, this)); + try { + if (context != null) { + context.publishEvent(new SpringPluginStoppingEvent(this, this)); + } + if (this.delegate != null) { + this.delegate.stop(); + } + } finally { + if (context instanceof ConfigurableApplicationContext configurableContext) { + configurableContext.close(); + } + // reset application context + context = null; } - if (this.delegate != null) { - this.delegate.stop(); - } - if (context instanceof ConfigurableApplicationContext configurableContext) { - configurableContext.close(); - } - // reset application context - context = null; } @Override @@ -63,6 +73,7 @@ public class SpringPlugin extends Plugin { if (delegate != null) { delegate.delete(); } + this.delegate = null; } public ApplicationContext getApplicationContext() {