diff --git a/src/main/java/com/avaje/ebean/plugin/SpiServerPlugin.java b/src/main/java/com/avaje/ebean/plugin/SpiServerPlugin.java index a622f89d9..8c874f1c6 100644 --- a/src/main/java/com/avaje/ebean/plugin/SpiServerPlugin.java +++ b/src/main/java/com/avaje/ebean/plugin/SpiServerPlugin.java @@ -14,4 +14,12 @@ public interface SpiServerPlugin { * Called just before the server starts indicating if it is coming up in online mode. */ void online(boolean online); + + /** + * Called when the server is shutting down. + *
+ * Plugins should shutdown any resources they are using cleanly. + *
+ */ + void shutdown(); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index d081ec385..e38a555de 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -438,6 +438,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { // Already shutdown return; } + shutdownPlugins(); try { if (mbeanServer != null) { mbeanServer.unregisterMBean(new ObjectName(mbeanName + ",key=AutoFetch")); @@ -454,7 +455,18 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { transactionManager.shutdown(shutdownDataSource, deregisterDriver); shutdown = true; } - + + private void shutdownPlugins() { + + for (SpiServerPlugin plugin : serverPlugins) { + try { + plugin.shutdown(); + } catch (Throwable e) { + logger.error("Error when shutting down plugin", e); + } + } + } + /** * Return the server name. */