diff --git a/ebean-api/src/main/java/io/ebean/DatabaseBuilder.java b/ebean-api/src/main/java/io/ebean/DatabaseBuilder.java index afd074cd2f..e595f61707 100644 --- a/ebean-api/src/main/java/io/ebean/DatabaseBuilder.java +++ b/ebean-api/src/main/java/io/ebean/DatabaseBuilder.java @@ -1062,6 +1062,11 @@ default DatabaseBuilder skipDataSourceCheck(boolean skipDataSourceCheck) { */ DatabaseBuilder readOnlyDatabase(boolean readOnlyDatabase); + /** + * Set to false such that the instance does not register a JVM shutdown hook. + */ + DatabaseBuilder shutdownHook(boolean shutdownHook); + /** * Set a DataSource. */ @@ -2643,6 +2648,11 @@ interface Settings extends DatabaseBuilder { */ boolean readOnlyDatabase(); + /** + * Return if a JVM shutdown hook should be registered. + */ + boolean shutdownHook(); + /** * Return the DataSource. */ diff --git a/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java b/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java index 04e35ee039..2a7b926a85 100644 --- a/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java +++ b/ebean-api/src/main/java/io/ebean/config/DatabaseConfig.java @@ -311,6 +311,7 @@ public class DatabaseConfig implements DatabaseBuilder.Settings { private boolean skipDataSourceCheck; private boolean readOnlyDatabase; + private boolean shutdownHook = true; /** * The data source (if programmatically provided). @@ -1365,6 +1366,17 @@ public boolean readOnlyDatabase() { return readOnlyDatabase; } + @Override + public DatabaseBuilder shutdownHook(boolean shutdownHook) { + this.shutdownHook = shutdownHook; + return this; + } + + @Override + public boolean shutdownHook() { + return shutdownHook; + } + @Override public DataSource getDataSource() { return dataSource; @@ -2137,6 +2149,7 @@ protected void loadSettings(PropertiesWrapper p) { loadDocStoreSettings(p); defaultServer = p.getBoolean("defaultServer", defaultServer); + shutdownHook = p.getBoolean("shutdownHook", shutdownHook); readOnlyDatabase = p.getBoolean("readOnlyDatabase", readOnlyDatabase); autoPersistUpdates = p.getBoolean("autoPersistUpdates", autoPersistUpdates); loadModuleInfo = p.getBoolean("loadModuleInfo", loadModuleInfo); diff --git a/ebean-api/src/main/java/io/ebean/event/ShutdownManager.java b/ebean-api/src/main/java/io/ebean/event/ShutdownManager.java index be85d0e379..58c2eb9035 100644 --- a/ebean-api/src/main/java/io/ebean/event/ShutdownManager.java +++ b/ebean-api/src/main/java/io/ebean/event/ShutdownManager.java @@ -97,8 +97,7 @@ public static void deregisterShutdownHook() { private static void registerShutdownHook() { lock.lock(); try { - String value = System.getProperty("ebean.registerShutdownHook"); - if (value == null || !value.trim().equalsIgnoreCase("false")) { + if ("true".equalsIgnoreCase(System.getProperty("ebean.registerShutdownHook", "true"))) { Runtime.getRuntime().addShutdownHook(shutdownHook); } } catch (IllegalStateException ex) { diff --git a/ebean-api/src/test/java/io/ebean/config/DatabaseConfigTest.java b/ebean-api/src/test/java/io/ebean/config/DatabaseConfigTest.java index 945e654b83..3d790461df 100644 --- a/ebean-api/src/test/java/io/ebean/config/DatabaseConfigTest.java +++ b/ebean-api/src/test/java/io/ebean/config/DatabaseConfigTest.java @@ -79,6 +79,7 @@ void testLoadWithProperties() { props.setProperty("includeLabelInSql", "false"); props.setProperty("lazyLoadBatchSize", "50"); props.setProperty("queryBatchSize", "60"); + props.setProperty("shutdownHook", "false"); props.setProperty("queryPlan.enable", "true"); props.setProperty("queryPlan.thresholdMicros", "10000"); @@ -100,6 +101,7 @@ void testLoadWithProperties() { assertTrue(settings.isLoadModuleInfo()); assertTrue(settings.skipDataSourceCheck()); assertTrue(settings.readOnlyDatabase()); + assertFalse(settings.shutdownHook()); assertFalse(settings.isIncludeLabelInSql()); assertThat(settings.getLengthCheck()).isEqualTo(LengthCheck.ON); assertThat(settings.getLazyLoadBatchSize()).isEqualTo(50); @@ -172,6 +174,7 @@ void test_defaults() { DatabaseBuilder.Settings config = new DatabaseConfig().settings(); assertTrue(config.isIdGeneratorAutomatic()); assertTrue(config.isDefaultServer()); + assertTrue(config.shutdownHook()); assertFalse(config.isAutoPersistUpdates()); assertFalse(config.skipDataSourceCheck()); @@ -196,6 +199,8 @@ void test_defaults() { assertThat(config.getLengthCheck()).isEqualTo(LengthCheck.OFF); assertTrue(config.isIncludeLabelInSql()); + config.shutdownHook(false); + assertFalse(config.shutdownHook()); config.setLoadModuleInfo(false); assertFalse(config.isAutoLoadModuleInfo()); assertFalse(config.isLoadModuleInfo()); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index 5b1c6b7600..d6b28c09d0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -162,8 +162,10 @@ public DefaultServer(InternalConfiguration config, ServerCacheManager cache) { this.scriptRunner = new DScriptRunner(this); configureServerPlugins(); - // Register with the JVM Shutdown hook - ShutdownManager.registerDatabase(this); + if (this.config.shutdownHook() && "true".equalsIgnoreCase(System.getProperty("ebean.registerShutdownHook", "true"))) { + // register with the JVM Shutdown hook + ShutdownManager.registerDatabase(this); + } } /**