This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 76ca23090d8 CAMEL-21353: camel-core - Add possibility to set some 
condition for Camel to wait during startup before continuing
76ca23090d8 is described below

commit 76ca23090d8ee23c0a548d967c51b7d4ec25eef1
Author: Claus Ibsen <[email protected]>
AuthorDate: Fri Oct 18 14:04:42 2024 +0200

    CAMEL-21353: camel-core - Add possibility to set some condition for Camel 
to wait during startup before continuing
---
 .../main/camel-main-configuration-metadata.json    |  6 +--
 .../apache/camel/spi/StartupConditionStrategy.java | 16 ++++---
 .../camel/impl/engine/AbstractCamelContext.java    |  4 +-
 .../engine/DefaultStartupConditionStrategy.java    | 39 +++++++++++-----
 ...ava => StartupConditionRegistryIgnoreTest.java} | 18 +++-----
 ....java => StartupConditionRegistryStopTest.java} | 18 +++-----
 .../camel/impl/StartupConditionRegistryTest.java   |  1 +
 .../apache/camel/impl/StartupConditionTest.java    |  1 +
 ...ConditionConfigurationPropertiesConfigurer.java | 14 +++---
 .../camel-main-configuration-metadata.json         |  6 +--
 core/camel-main/src/main/docs/main.adoc            |  6 +--
 .../org/apache/camel/main/BaseMainSupport.java     | 52 +++++++++-------------
 .../camel/main/DefaultMainShutdownStrategy.java    | 29 ++++++++++--
 .../apache/camel/main/MainShutdownStrategy.java    |  5 +++
 .../java/org/apache/camel/main/MainSupport.java    |  1 +
 .../camel/main/SimpleMainShutdownStrategy.java     |  5 +++
 .../StartupConditionConfigurationProperties.java   | 36 ++++++++-------
 .../main/MainStartupConditionTimeoutTest.java      |  1 +
 18 files changed, 150 insertions(+), 108 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index 77580418ad4..908b4a774bd 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -307,10 +307,10 @@
     { "name": "camel.startupcondition.customClassNames", "description": "A 
list of custom class names (FQN). Multiple classes can be separated by comma.", 
"sourceType": "org.apache.camel.main.StartupConditionConfigurationProperties", 
"type": "string", "javaType": "java.lang.String" },
     { "name": "camel.startupcondition.enabled", "description": "To enable 
using startup conditions", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"boolean", "javaType": "boolean", "defaultValue": false },
     { "name": "camel.startupcondition.environmentVariableExists", 
"description": "Wait for an environment variable with the given name to exists 
before continuing", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"string", "javaType": "java.lang.String" },
-    { "name": "camel.startupcondition.failOnTimeout", "description": "Whether 
to fail if the check timed out. The default is to fail and throw an exception 
causing Camel to not be able to startup.", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"boolean", "javaType": "boolean", "defaultValue": true },
     { "name": "camel.startupcondition.fileExists", "description": "Wait for a 
file with the given name to exists before continuing", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"string", "javaType": "java.lang.String" },
-    { "name": "camel.startupcondition.interval", "description": "Interval in 
millis between checking conditions.", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"integer", "javaType": "int", "defaultValue": 100 },
-    { "name": "camel.startupcondition.timeout", "description": "Total timeout 
(in millis) for all startup conditions.", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"integer", "javaType": "int", "defaultValue": 10000 },
+    { "name": "camel.startupcondition.interval", "description": "Interval in 
millis between checking conditions.", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"integer", "javaType": "int", "defaultValue": 500 },
+    { "name": "camel.startupcondition.onTimeout", "description": "What action, 
to do on timeout. fail = do not startup, and throw an exception causing camel 
to fail stop = do not startup, and stop camel ignore = log a WARN and continue 
to startup", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"string", "javaType": "java.lang.String", "defaultValue": "stop", "enum": [ 
"fail", "stop", "ignore" ] },
+    { "name": "camel.startupcondition.timeout", "description": "Total timeout 
(in millis) for all startup conditions.", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"integer", "javaType": "int", "defaultValue": 20000 },
     { "name": "camel.threadpool.allowCoreThreadTimeOut", "description": "Sets 
default whether to allow core threads to timeout", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "defaultValue": "false" },
     { "name": "camel.threadpool.config", "description": "Adds a configuration 
for a specific thread pool profile (inherits default values)", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "object", 
"javaType": "java.util.Map" },
     { "name": "camel.threadpool.keepAliveTime", "description": "Sets the 
default keep alive time for inactive threads", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Long" },
diff --git 
a/core/camel-api/src/main/java/org/apache/camel/spi/StartupConditionStrategy.java
 
b/core/camel-api/src/main/java/org/apache/camel/spi/StartupConditionStrategy.java
index 0201522e1a6..a17996387bd 100644
--- 
a/core/camel-api/src/main/java/org/apache/camel/spi/StartupConditionStrategy.java
+++ 
b/core/camel-api/src/main/java/org/apache/camel/spi/StartupConditionStrategy.java
@@ -59,16 +59,20 @@ public interface StartupConditionStrategy extends 
StaticService {
     int getTimeout();
 
     /**
-     * Whether to fail if the check timed out. The default is to fail and 
throw an exception causing Camel to not be
-     * able to startup.
+     * What action, to do on timeout.
+     *
+     * fail = do not startup, and throw an exception causing camel to fail 
stop = do not startup, and stop camel ignore
+     * = log a WARN and continue to startup
      */
-    boolean isFailOnTimeout();
+    String getOnTimeout();
 
     /**
-     * Whether to fail if the check timed out. The default is to fail and 
throw an exception causing Camel to not be
-     * able to startup.
+     * What action, to do on timeout.
+     *
+     * fail = do not startup, and throw an exception causing camel to fail 
stop = do not startup, and stop camel ignore
+     * = log a WARN and continue to startup
      */
-    void setFailOnTimeout(boolean failOnTimeout);
+    void setOnTimeout(String onTimeout);
 
     /**
      * Adds a custom {@link StartupCondition} check to be performed.
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 4a2a086f79a..241242644a8 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -2095,7 +2095,7 @@ public abstract class AbstractCamelContext extends 
BaseService
 
         // was the initialization vetoed?
         if (vetoed != null) {
-            LOG.info("CamelContext ({}) vetoed to not initialize due to: {}", 
camelContextExtension.getName(),
+            LOG.warn("CamelContext ({}) vetoed to not initialize due to: {}", 
camelContextExtension.getName(),
                     vetoed.getMessage());
             failOnStartup(vetoed);
         }
@@ -2112,7 +2112,7 @@ public abstract class AbstractCamelContext extends 
BaseService
 
         // did the start veto?
         if (vetoed != null) {
-            LOG.info("CamelContext ({}) vetoed to not start due to: {}", 
camelContextExtension.getName(), vetoed.getMessage());
+            LOG.warn("CamelContext ({}) vetoed to not start due to: {}", 
camelContextExtension.getName(), vetoed.getMessage());
             failOnStartup(vetoed);
             stop();
             return;
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultStartupConditionStrategy.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultStartupConditionStrategy.java
index b3bd5a2bacf..f6bbf5a4508 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultStartupConditionStrategy.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultStartupConditionStrategy.java
@@ -42,8 +42,8 @@ public class DefaultStartupConditionStrategy extends 
ServiceSupport implements S
     private final List<StartupCondition> conditions = new ArrayList<>();
     private boolean enabled;
     private int interval = 500;
-    private int timeout = 10000;
-    private boolean failOnTimeout = true;
+    private int timeout = 20000;
+    private String onTimeout = "stop";
     private volatile boolean checkDone;
 
     @Override
@@ -85,14 +85,12 @@ public class DefaultStartupConditionStrategy extends 
ServiceSupport implements S
         this.timeout = timeout;
     }
 
-    @Override
-    public boolean isFailOnTimeout() {
-        return failOnTimeout;
+    public String getOnTimeout() {
+        return onTimeout;
     }
 
-    @Override
-    public void setFailOnTimeout(boolean failOnTimeout) {
-        this.failOnTimeout = failOnTimeout;
+    public void setOnTimeout(String onTimeout) {
+        this.onTimeout = onTimeout;
     }
 
     @Override
@@ -124,9 +122,16 @@ public class DefaultStartupConditionStrategy extends 
ServiceSupport implements S
         boolean first = true;
         int tick = 1;
         int counter = 1;
+
         while (watch.taken() < timeout) {
             boolean ok = true;
             for (StartupCondition startup : conditions) {
+
+                // break out if Camel are shutting down
+                if (isCamelStopping()) {
+                    return;
+                }
+
                 if (first) {
                     String msg = startup.getWaitMessage();
                     if (msg != null) {
@@ -145,17 +150,20 @@ public class DefaultStartupConditionStrategy extends 
ServiceSupport implements S
                     }
                 }
             }
+            first = false;
             if (ok) {
                 return;
             }
 
-            first = false;
             // wait a bit before next loop
             try {
                 Thread.sleep(interval);
             } catch (InterruptedException e) {
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("Sleep interrupted, are we stopping? {}", 
isCamelStopping());
+                }
                 Thread.currentThread().interrupt();
-                return;
+                throw new VetoCamelContextStartException("Sleep interrupted", 
e, camelContext, false);
             }
             // log waiting but only once per second
             long seconds = watch.taken() / 1000;
@@ -177,11 +185,18 @@ public class DefaultStartupConditionStrategy extends 
ServiceSupport implements S
                 error = "Startup condition: " + startup.getName() + " cannot 
continue due to: " + msg;
             }
         }
-        if (isFailOnTimeout()) {
-            throw new VetoCamelContextStartException(error, camelContext);
+        if ("fail".equalsIgnoreCase(onTimeout)) {
+            throw new VetoCamelContextStartException(error, camelContext, 
true);
+        } else if ("stop".equalsIgnoreCase(onTimeout)) {
+            throw new VetoCamelContextStartException(error, camelContext, 
false);
         } else {
             LOG.warn(error);
+            LOG.warn("Camel will continue to startup");
         }
     }
 
+    private boolean isCamelStopping() {
+        return camelContext.isStopping();
+    }
+
 }
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryIgnoreTest.java
similarity index 80%
copy from 
core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryTest.java
copy to 
core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryIgnoreTest.java
index e91c914d924..1d90c5120ab 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryIgnoreTest.java
@@ -20,12 +20,10 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.spi.StartupCondition;
 import org.apache.camel.spi.StartupConditionStrategy;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.fail;
-
-public class StartupConditionRegistryTest extends ContextTestSupport {
+public class StartupConditionRegistryIgnoreTest extends ContextTestSupport {
 
     @Override
     public boolean isUseRouteBuilder() {
@@ -34,13 +32,10 @@ public class StartupConditionRegistryTest extends 
ContextTestSupport {
 
     @Test
     public void testVetoCamelContextStart() {
-        try {
-            context.start();
-            fail("Should throw exception");
-        } catch (Exception e) {
-            assertEquals("Startup condition: MyOtherCondition cannot continue 
due to: forced error from unit test",
-                    e.getCause().getMessage());
-        }
+        context.start();
+        // should ignore and startup
+        Assertions.assertTrue(context.getStatus().isStarted());
+        context.stop();
     }
 
     @Override
@@ -50,6 +45,7 @@ public class StartupConditionRegistryTest extends 
ContextTestSupport {
         StartupConditionStrategy scs = 
context.getCamelContextExtension().getContextPlugin(StartupConditionStrategy.class);
         scs.setEnabled(true);
         scs.setTimeout(250);
+        scs.setOnTimeout("ignore");
 
         context.getRegistry().bind("myCondition", new MyOtherCondition());
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryStopTest.java
similarity index 80%
copy from 
core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryTest.java
copy to 
core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryStopTest.java
index e91c914d924..67cbb0ae037 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryStopTest.java
@@ -20,12 +20,10 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.spi.StartupCondition;
 import org.apache.camel.spi.StartupConditionStrategy;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.fail;
-
-public class StartupConditionRegistryTest extends ContextTestSupport {
+public class StartupConditionRegistryStopTest extends ContextTestSupport {
 
     @Override
     public boolean isUseRouteBuilder() {
@@ -34,13 +32,10 @@ public class StartupConditionRegistryTest extends 
ContextTestSupport {
 
     @Test
     public void testVetoCamelContextStart() {
-        try {
-            context.start();
-            fail("Should throw exception");
-        } catch (Exception e) {
-            assertEquals("Startup condition: MyOtherCondition cannot continue 
due to: forced error from unit test",
-                    e.getCause().getMessage());
-        }
+        context.start();
+        // vetod - should not be able to start and stop camel
+        Assertions.assertTrue(context.getStatus().isStopped());
+        Assertions.assertTrue(context.isVetoStarted());
     }
 
     @Override
@@ -50,6 +45,7 @@ public class StartupConditionRegistryTest extends 
ContextTestSupport {
         StartupConditionStrategy scs = 
context.getCamelContextExtension().getContextPlugin(StartupConditionStrategy.class);
         scs.setEnabled(true);
         scs.setTimeout(250);
+        scs.setOnTimeout("stop");
 
         context.getRegistry().bind("myCondition", new MyOtherCondition());
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryTest.java
index e91c914d924..eb875bc5ebc 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionRegistryTest.java
@@ -50,6 +50,7 @@ public class StartupConditionRegistryTest extends 
ContextTestSupport {
         StartupConditionStrategy scs = 
context.getCamelContextExtension().getContextPlugin(StartupConditionStrategy.class);
         scs.setEnabled(true);
         scs.setTimeout(250);
+        scs.setOnTimeout("fail");
 
         context.getRegistry().bind("myCondition", new MyOtherCondition());
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionTest.java 
b/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionTest.java
index 4a713774a96..2884e2254d9 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/impl/StartupConditionTest.java
@@ -49,6 +49,7 @@ public class StartupConditionTest extends ContextTestSupport {
         StartupConditionStrategy scs = 
context.getCamelContextExtension().getContextPlugin(StartupConditionStrategy.class);
         scs.setEnabled(true);
         scs.setTimeout(250);
+        scs.setOnTimeout("fail");
         scs.addStartupCondition(new MyCondition());
         return context;
     }
diff --git 
a/core/camel-main/src/generated/java/org/apache/camel/main/StartupConditionConfigurationPropertiesConfigurer.java
 
b/core/camel-main/src/generated/java/org/apache/camel/main/StartupConditionConfigurationPropertiesConfigurer.java
index ef23844bbf6..f9d0a93abd8 100644
--- 
a/core/camel-main/src/generated/java/org/apache/camel/main/StartupConditionConfigurationPropertiesConfigurer.java
+++ 
b/core/camel-main/src/generated/java/org/apache/camel/main/StartupConditionConfigurationPropertiesConfigurer.java
@@ -25,9 +25,9 @@ public class 
StartupConditionConfigurationPropertiesConfigurer extends org.apach
         map.put("CustomClassNames", java.lang.String.class);
         map.put("Enabled", boolean.class);
         map.put("EnvironmentVariableExists", java.lang.String.class);
-        map.put("FailOnTimeout", boolean.class);
         map.put("FileExists", java.lang.String.class);
         map.put("Interval", int.class);
+        map.put("OnTimeout", java.lang.String.class);
         map.put("Timeout", int.class);
         ALL_OPTIONS = map;
         
ConfigurerStrategy.addBootstrapConfigurerClearer(StartupConditionConfigurationPropertiesConfigurer::clearBootstrapConfigurers);
@@ -42,11 +42,11 @@ public class 
StartupConditionConfigurationPropertiesConfigurer extends org.apach
         case "enabled": target.setEnabled(property(camelContext, 
boolean.class, value)); return true;
         case "environmentvariableexists":
         case "environmentVariableExists": 
target.setEnvironmentVariableExists(property(camelContext, 
java.lang.String.class, value)); return true;
-        case "failontimeout":
-        case "failOnTimeout": target.setFailOnTimeout(property(camelContext, 
boolean.class, value)); return true;
         case "fileexists":
         case "fileExists": target.setFileExists(property(camelContext, 
java.lang.String.class, value)); return true;
         case "interval": target.setInterval(property(camelContext, int.class, 
value)); return true;
+        case "ontimeout":
+        case "onTimeout": target.setOnTimeout(property(camelContext, 
java.lang.String.class, value)); return true;
         case "timeout": target.setTimeout(property(camelContext, int.class, 
value)); return true;
         default: return false;
         }
@@ -69,11 +69,11 @@ public class 
StartupConditionConfigurationPropertiesConfigurer extends org.apach
         case "enabled": return boolean.class;
         case "environmentvariableexists":
         case "environmentVariableExists": return java.lang.String.class;
-        case "failontimeout":
-        case "failOnTimeout": return boolean.class;
         case "fileexists":
         case "fileExists": return java.lang.String.class;
         case "interval": return int.class;
+        case "ontimeout":
+        case "onTimeout": return java.lang.String.class;
         case "timeout": return int.class;
         default: return null;
         }
@@ -88,11 +88,11 @@ public class 
StartupConditionConfigurationPropertiesConfigurer extends org.apach
         case "enabled": return target.isEnabled();
         case "environmentvariableexists":
         case "environmentVariableExists": return 
target.getEnvironmentVariableExists();
-        case "failontimeout":
-        case "failOnTimeout": return target.isFailOnTimeout();
         case "fileexists":
         case "fileExists": return target.getFileExists();
         case "interval": return target.getInterval();
+        case "ontimeout":
+        case "onTimeout": return target.getOnTimeout();
         case "timeout": return target.getTimeout();
         default: return null;
         }
diff --git 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index 77580418ad4..908b4a774bd 100644
--- 
a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ 
b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -307,10 +307,10 @@
     { "name": "camel.startupcondition.customClassNames", "description": "A 
list of custom class names (FQN). Multiple classes can be separated by comma.", 
"sourceType": "org.apache.camel.main.StartupConditionConfigurationProperties", 
"type": "string", "javaType": "java.lang.String" },
     { "name": "camel.startupcondition.enabled", "description": "To enable 
using startup conditions", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"boolean", "javaType": "boolean", "defaultValue": false },
     { "name": "camel.startupcondition.environmentVariableExists", 
"description": "Wait for an environment variable with the given name to exists 
before continuing", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"string", "javaType": "java.lang.String" },
-    { "name": "camel.startupcondition.failOnTimeout", "description": "Whether 
to fail if the check timed out. The default is to fail and throw an exception 
causing Camel to not be able to startup.", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"boolean", "javaType": "boolean", "defaultValue": true },
     { "name": "camel.startupcondition.fileExists", "description": "Wait for a 
file with the given name to exists before continuing", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"string", "javaType": "java.lang.String" },
-    { "name": "camel.startupcondition.interval", "description": "Interval in 
millis between checking conditions.", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"integer", "javaType": "int", "defaultValue": 100 },
-    { "name": "camel.startupcondition.timeout", "description": "Total timeout 
(in millis) for all startup conditions.", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"integer", "javaType": "int", "defaultValue": 10000 },
+    { "name": "camel.startupcondition.interval", "description": "Interval in 
millis between checking conditions.", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"integer", "javaType": "int", "defaultValue": 500 },
+    { "name": "camel.startupcondition.onTimeout", "description": "What action, 
to do on timeout. fail = do not startup, and throw an exception causing camel 
to fail stop = do not startup, and stop camel ignore = log a WARN and continue 
to startup", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"string", "javaType": "java.lang.String", "defaultValue": "stop", "enum": [ 
"fail", "stop", "ignore" ] },
+    { "name": "camel.startupcondition.timeout", "description": "Total timeout 
(in millis) for all startup conditions.", "sourceType": 
"org.apache.camel.main.StartupConditionConfigurationProperties", "type": 
"integer", "javaType": "int", "defaultValue": 20000 },
     { "name": "camel.threadpool.allowCoreThreadTimeOut", "description": "Sets 
default whether to allow core threads to timeout", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "boolean", 
"javaType": "java.lang.Boolean", "defaultValue": "false" },
     { "name": "camel.threadpool.config", "description": "Adds a configuration 
for a specific thread pool profile (inherits default values)", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "object", 
"javaType": "java.util.Map" },
     { "name": "camel.threadpool.keepAliveTime", "description": "Sets the 
default keep alive time for inactive threads", "sourceType": 
"org.apache.camel.main.ThreadPoolConfigurationProperties", "type": "integer", 
"javaType": "java.lang.Long" },
diff --git a/core/camel-main/src/main/docs/main.adoc 
b/core/camel-main/src/main/docs/main.adoc
index 3d37b5bb89e..82f9d33882f 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -158,10 +158,10 @@ The camel.startupcondition supports 7 options, which are 
listed below.
 | *camel.startupcondition.custom{zwsp}ClassNames* | A list of custom class 
names (FQN). Multiple classes can be separated by comma. |  | String
 | *camel.startupcondition.enabled* | To enable using startup conditions | 
false | boolean
 | *camel.startupcondition.environment{zwsp}VariableExists* | Wait for an 
environment variable with the given name to exists before continuing |  | String
-| *camel.startupcondition.failOn{zwsp}Timeout* | Whether to fail if the check 
timed out. The default is to fail and throw an exception causing Camel to not 
be able to startup. | true | boolean
 | *camel.startupcondition.file{zwsp}Exists* | Wait for a file with the given 
name to exists before continuing |  | String
-| *camel.startupcondition.interval* | Interval in millis between checking 
conditions. | 100 | int
-| *camel.startupcondition.timeout* | Total timeout (in millis) for all startup 
conditions. | 10000 | int
+| *camel.startupcondition.interval* | Interval in millis between checking 
conditions. | 500 | int
+| *camel.startupcondition.on{zwsp}Timeout* | What action, to do on timeout. 
fail = do not startup, and throw an exception causing camel to fail stop = do 
not startup, and stop camel ignore = log a WARN and continue to startup | stop 
| String
+| *camel.startupcondition.timeout* | Total timeout (in millis) for all startup 
conditions. | 20000 | int
 |===
 
 
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java 
b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index 93a93d17502..5ae380e9d21 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -727,9 +727,6 @@ public abstract class BaseMainSupport extends BaseService {
             }
         }
 
-        boolean forceDisabled = 
"false".equals(properties.getProperty("camel.startupcondition.enabled"));
-        boolean configurations = !properties.isEmpty();
-
         if (!properties.isEmpty()) {
             LOG.debug("Auto-configuring startup condition from loaded 
properties: {}", properties.size());
             setPropertiesOnTarget(camelContext, 
mainConfigurationProperties.startupCondition(), properties,
@@ -745,34 +742,27 @@ public abstract class BaseMainSupport extends BaseService 
{
             });
         }
 
-        if (configurations || 
mainConfigurationProperties.startupCondition().isEnabled()) {
-            StartupConditionStrategy scs
-                    = 
camelContext.getCamelContextExtension().getContextPlugin(StartupConditionStrategy.class);
-            // auto-enable if something is configured
-            if (forceDisabled) {
-                scs.setEnabled(false);
-            } else {
-                scs.setEnabled(true);
-            }
-            
scs.setInterval(mainConfigurationProperties.startupCondition().getInterval());
-            
scs.setTimeout(mainConfigurationProperties.startupCondition().getTimeout());
-            
scs.setFailOnTimeout(mainConfigurationProperties.startupCondition().isFailOnTimeout());
-            String env = 
mainConfigurationProperties.startupCondition().getEnvironmentVariableExists();
-            if (env != null) {
-                scs.addStartupCondition(new EnvStartupCondition(env));
-            }
-            String file = 
mainConfigurationProperties.startupCondition().getFileExists();
-            if (file != null) {
-                scs.addStartupCondition(new FileStartupCondition(env));
-            }
-            String classes = 
mainConfigurationProperties.startupCondition().getCustomClassNames();
-            if (classes != null) {
-                for (String fqn : classes.split(",")) {
-                    fqn = fqn.trim();
-                    Class<? extends StartupCondition> clazz
-                            = 
camelContext.getClassResolver().resolveMandatoryClass(fqn, 
StartupCondition.class);
-                    
scs.addStartupCondition(camelContext.getInjector().newInstance(clazz));
-                }
+        StartupConditionStrategy scs
+                = 
camelContext.getCamelContextExtension().getContextPlugin(StartupConditionStrategy.class);
+        
scs.setEnabled(mainConfigurationProperties.startupCondition().isEnabled());
+        
scs.setInterval(mainConfigurationProperties.startupCondition().getInterval());
+        
scs.setTimeout(mainConfigurationProperties.startupCondition().getTimeout());
+        
scs.setOnTimeout(mainConfigurationProperties.startupCondition().getOnTimeout());
+        String env = 
mainConfigurationProperties.startupCondition().getEnvironmentVariableExists();
+        if (env != null) {
+            scs.addStartupCondition(new EnvStartupCondition(env));
+        }
+        String file = 
mainConfigurationProperties.startupCondition().getFileExists();
+        if (file != null) {
+            scs.addStartupCondition(new FileStartupCondition(env));
+        }
+        String classes = 
mainConfigurationProperties.startupCondition().getCustomClassNames();
+        if (classes != null) {
+            for (String fqn : classes.split(",")) {
+                fqn = fqn.trim();
+                Class<? extends StartupCondition> clazz
+                        = 
camelContext.getClassResolver().resolveMandatoryClass(fqn, 
StartupCondition.class);
+                
scs.addStartupCondition(camelContext.getInjector().newInstance(clazz));
             }
         }
     }
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultMainShutdownStrategy.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultMainShutdownStrategy.java
index d66fc9ec146..f88ae1abd7b 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/DefaultMainShutdownStrategy.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/DefaultMainShutdownStrategy.java
@@ -38,7 +38,7 @@ public class DefaultMainShutdownStrategy extends 
SimpleMainShutdownStrategy {
     private final AtomicBoolean hangupIntercepted;
     private final BaseMainSupport main;
 
-    private volatile boolean hangupInterceptorEnabled;
+    private volatile boolean hangupInterceptorEnabled = true;
 
     public DefaultMainShutdownStrategy(BaseMainSupport main) {
         this.main = main;
@@ -59,6 +59,12 @@ public class DefaultMainShutdownStrategy extends 
SimpleMainShutdownStrategy {
         hangupInterceptorEnabled = true;
     }
 
+    @Override
+    public void init() {
+        installHangupInterceptor();
+        super.init();
+    }
+
     @Override
     public void await() throws InterruptedException {
         installHangupInterceptor();
@@ -72,7 +78,8 @@ public class DefaultMainShutdownStrategy extends 
SimpleMainShutdownStrategy {
     }
 
     private void handleHangup() {
-        LOG.debug("Received hangup signal, stopping the main instance.");
+        LOG.info("JVM shutdown hook triggered by SIGTERM (PID {}). Shutting 
down {} {}", getPid(), getAppName(),
+                getAppVersion());
         // and shutdown listener to allow camel context to graceful shutdown 
if JVM shutdown hook is triggered
         // as otherwise the JVM terminates before Camel is graceful shutdown
         addShutdownListener(() -> {
@@ -121,11 +128,27 @@ public class DefaultMainShutdownStrategy extends 
SimpleMainShutdownStrategy {
                 }
                 tracker.close();
             }
-            LOG.trace("OnShutdown complete");
+            LOG.info("{} {} is shutdown", getAppName(), getAppVersion());
         });
         shutdown();
     }
 
+    private String getAppName() {
+        String app = "Apache Camel";
+        if (main instanceof MainSupport ms) {
+            app = ms.getAppName();
+        }
+        return app;
+    }
+
+    private String getAppVersion() {
+        return main.helper.getVersion();
+    }
+
+    private static String getPid() {
+        return String.valueOf(ProcessHandle.current().pid());
+    }
+
     private void installHangupInterceptor() {
         if (this.hangupIntercepted.compareAndSet(false, 
hangupInterceptorEnabled)) {
             Thread task = new Thread(this::handleHangup);
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/MainShutdownStrategy.java 
b/core/camel-main/src/main/java/org/apache/camel/main/MainShutdownStrategy.java
index 1001d3f6823..717d484d41b 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/MainShutdownStrategy.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/MainShutdownStrategy.java
@@ -56,6 +56,11 @@ public interface MainShutdownStrategy {
      */
     boolean shutdown();
 
+    /**
+     * Initializes this strategy.
+     */
+    void init();
+
     /**
      * Waiting for Camel Main to complete.
      */
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java 
b/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java
index ffb89845d66..808a65e20ca 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/MainSupport.java
@@ -70,6 +70,7 @@ public abstract class MainSupport extends BaseMainSupport {
         // we want this logging to be as early as possible
         LOG.info("{} {} is starting", appName, helper.getVersion());
         clock = new ResetableClock();
+        this.shutdownStrategy.init();
         super.doInit();
     }
 
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/SimpleMainShutdownStrategy.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/SimpleMainShutdownStrategy.java
index 61a819d9b14..9916f91f0d1 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/SimpleMainShutdownStrategy.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/SimpleMainShutdownStrategy.java
@@ -73,6 +73,11 @@ public class SimpleMainShutdownStrategy implements 
MainShutdownStrategy {
         return false;
     }
 
+    @Override
+    public void init() {
+        // noop
+    }
+
     @Override
     public void await() throws InterruptedException {
         LOG.debug("Await shutdown to complete");
diff --git 
a/core/camel-main/src/main/java/org/apache/camel/main/StartupConditionConfigurationProperties.java
 
b/core/camel-main/src/main/java/org/apache/camel/main/StartupConditionConfigurationProperties.java
index 3107d37c777..9705601344d 100644
--- 
a/core/camel-main/src/main/java/org/apache/camel/main/StartupConditionConfigurationProperties.java
+++ 
b/core/camel-main/src/main/java/org/apache/camel/main/StartupConditionConfigurationProperties.java
@@ -30,12 +30,12 @@ public class StartupConditionConfigurationProperties 
implements BootstrapCloseab
 
     @Metadata(defaultValue = "false")
     private boolean enabled;
-    @Metadata(defaultValue = "100")
-    private int interval = 100;
-    @Metadata(defaultValue = "10000")
-    private int timeout = 10000;
-    @Metadata(defaultValue = "true")
-    private boolean failOnTimeout = true;
+    @Metadata(defaultValue = "500")
+    private int interval = 500;
+    @Metadata(defaultValue = "20000")
+    private int timeout = 20000;
+    @Metadata(defaultValue = "stop", enums = "fail,stop,ignore")
+    private String onTimeout = "stop";
     @Metadata
     private String environmentVariableExists;
     @Metadata
@@ -89,16 +89,18 @@ public class StartupConditionConfigurationProperties 
implements BootstrapCloseab
         this.timeout = timeout;
     }
 
-    public boolean isFailOnTimeout() {
-        return failOnTimeout;
+    public String getOnTimeout() {
+        return onTimeout;
     }
 
     /**
-     * Whether to fail if the check timed out. The default is to fail and 
throw an exception causing Camel to not be
-     * able to startup.
+     * What action, to do on timeout.
+     *
+     * fail = do not startup, and throw an exception causing camel to fail 
stop = do not startup, and stop camel ignore
+     * = log a WARN and continue to startup
      */
-    public void setFailOnTimeout(boolean failOnTimeout) {
-        this.failOnTimeout = failOnTimeout;
+    public void setOnTimeout(String onTimeout) {
+        this.onTimeout = onTimeout;
     }
 
     public String getEnvironmentVariableExists() {
@@ -159,11 +161,13 @@ public class StartupConditionConfigurationProperties 
implements BootstrapCloseab
     }
 
     /**
-     * Whether to fail if the check timed out. The default is to fail and 
throw an exception causing Camel to not be
-     * able to startup.
+     * What action, to do on timeout.
+     *
+     * fail = do not startup, and throw an exception causing camel to fail 
stop = do not startup, and stop camel ignore
+     * = log a WARN and continue to startup
      */
-    public StartupConditionConfigurationProperties withFailOnTimeout(boolean 
failOnTimeout) {
-        this.failOnTimeout = failOnTimeout;
+    public StartupConditionConfigurationProperties withOnTimeout(String 
onTimeout) {
+        this.onTimeout = onTimeout;
         return this;
     }
 
diff --git 
a/core/camel-main/src/test/java/org/apache/camel/main/MainStartupConditionTimeoutTest.java
 
b/core/camel-main/src/test/java/org/apache/camel/main/MainStartupConditionTimeoutTest.java
index b7ed5372f62..66d8fd9c67d 100644
--- 
a/core/camel-main/src/test/java/org/apache/camel/main/MainStartupConditionTimeoutTest.java
+++ 
b/core/camel-main/src/test/java/org/apache/camel/main/MainStartupConditionTimeoutTest.java
@@ -31,6 +31,7 @@ public class MainStartupConditionTimeoutTest {
         Main main = new Main();
         try {
             main.configure().startupCondition().withEnabled(true)
+                    .withOnTimeout("fail")
                     .withTimeout(250)
                     
.withCustomClassNames("org.apache.camel.main.MainStartupConditionTimeoutTest$MyEnvCondition");
             main.start();


Reply via email to