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();