From ab9eacf5db51598de48a6af7f144e061fbc671e0 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Tue, 27 Aug 2024 13:57:10 +0200 Subject: [PATCH] Merge pull request #372 * [New] allowing configuring shutdown hook * [Minor] shutdown hook is disabled by default --- .../java/com/pi4j/context/ContextBuilder.java | 28 +++++++++++++++++++ .../java/com/pi4j/context/ContextConfig.java | 6 ++++ .../context/impl/DefaultContextBuilder.java | 21 ++++++++++++++ .../com/pi4j/runtime/impl/DefaultRuntime.java | 20 +++++++------ 4 files changed, 66 insertions(+), 9 deletions(-) diff --git a/pi4j-core/src/main/java/com/pi4j/context/ContextBuilder.java b/pi4j-core/src/main/java/com/pi4j/context/ContextBuilder.java index 02084f58..3fc675df 100644 --- a/pi4j-core/src/main/java/com/pi4j/context/ContextBuilder.java +++ b/pi4j-core/src/main/java/com/pi4j/context/ContextBuilder.java @@ -147,6 +147,34 @@ default ContextBuilder setAutoInject(boolean autoInject){ return noAutoInject(); } + /** + *

enableShutdownHook.

+ * + * @return a {@link com.pi4j.context.ContextBuilder} object. + */ + ContextBuilder enableShutdownHook(); + + /** + *

disableShutdownHook.

+ * + * @return a {@link com.pi4j.context.ContextBuilder} object. + */ + ContextBuilder disableShutdownHook(); + + /** + *

setShutdownHook.

+ * + * @param enableShutdownHook a boolean. + * + * @return a {@link com.pi4j.context.ContextBuilder} object. + */ + default ContextBuilder setShutdownHook(boolean enableShutdownHook) { + if (enableShutdownHook) + return enableShutdownHook(); + else + return disableShutdownHook(); + } + /** *

toConfig.

* diff --git a/pi4j-core/src/main/java/com/pi4j/context/ContextConfig.java b/pi4j-core/src/main/java/com/pi4j/context/ContextConfig.java index 7f4f4b17..d4875e72 100644 --- a/pi4j-core/src/main/java/com/pi4j/context/ContextConfig.java +++ b/pi4j-core/src/main/java/com/pi4j/context/ContextConfig.java @@ -86,6 +86,12 @@ default Collection getPlatforms(){ * @return a boolean. */ boolean autoInject(); + /** + *

enableShutdownHook.

+ * + * @return a boolean. + */ + boolean enableShutdownHook(); /** *

getAutoInject.

* diff --git a/pi4j-core/src/main/java/com/pi4j/context/impl/DefaultContextBuilder.java b/pi4j-core/src/main/java/com/pi4j/context/impl/DefaultContextBuilder.java index 1316376a..cd88e7f7 100644 --- a/pi4j-core/src/main/java/com/pi4j/context/impl/DefaultContextBuilder.java +++ b/pi4j-core/src/main/java/com/pi4j/context/impl/DefaultContextBuilder.java @@ -54,6 +54,7 @@ public class DefaultContextBuilder implements ContextBuilder { protected boolean autoDetectPlatforms = false; protected boolean autoDetectProviders = false; protected boolean autoInject = false; + protected boolean enableShutdownHook = false; // default platform identifier protected String defaultPlatformId = null; @@ -157,6 +158,20 @@ public ContextBuilder noAutoInject() { return this; } + /** {@inheritDoc} */ + @Override + public ContextBuilder enableShutdownHook() { + this.enableShutdownHook = true; + return this; + } + + /** {@inheritDoc} */ + @Override + public ContextBuilder disableShutdownHook() { + this.enableShutdownHook = false; + return this; + } + /** {@inheritDoc} */ @Override public ContextBuilder property(String key, String value){ @@ -258,11 +273,17 @@ public String defaultPlatform() { public boolean autoDetectMockPlugins() { return builder.autoDetectMockPlugins; } + @Override public boolean autoDetectPlatforms() { return builder.autoDetectPlatforms; } + @Override + public boolean enableShutdownHook() { + return builder.enableShutdownHook; + } + @Override public boolean autoInject() { return builder.autoInject; } diff --git a/pi4j-core/src/main/java/com/pi4j/runtime/impl/DefaultRuntime.java b/pi4j-core/src/main/java/com/pi4j/runtime/impl/DefaultRuntime.java index f88186dd..4d678d40 100644 --- a/pi4j-core/src/main/java/com/pi4j/runtime/impl/DefaultRuntime.java +++ b/pi4j-core/src/main/java/com/pi4j/runtime/impl/DefaultRuntime.java @@ -110,15 +110,17 @@ private DefaultRuntime(Context context) { // listen for shutdown to properly clean up // TODO :: ADD PI4J INTERNAL SHUTDOWN CALLBACKS/EVENTS - java.lang.Runtime.getRuntime().addShutdownHook(new Thread(() -> { - try { - // shutdown Pi4J - if (!isShutdown) - shutdown(); - } catch (Exception e) { - logger.error("Failed to shutdown Pi4J runtime", e); - } - }, "pi4j-shutdown")); + if (this.context.config().enableShutdownHook()) { + java.lang.Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + // shutdown Pi4J + if (!isShutdown) + shutdown(); + } catch (Exception e) { + logger.error("Failed to shutdown Pi4J runtime", e); + } + }, "pi4j-shutdown")); + } } /**