This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch errorhandler-in-dsl in repository https://gitbox.apache.org/repos/asf/camel.git
commit fc3020a28e331fc086f49c74745960976e8be82d Author: Claus Ibsen <[email protected]> AuthorDate: Tue Apr 5 16:22:25 2022 +0200 CAMEL-16834: error handler in model DSL. WIP --- .../org/apache/camel/model/redeliveryPolicy.json | 24 ++++++++--------- .../camel/model/RedeliveryPolicyDefinition.java | 24 ++++++++--------- .../errorhandler/DeadLetterChannelDefinition.java | 18 +++++++++++++ .../DefaultErrorHandlerDefinition.java | 3 +++ .../reifier/errorhandler/ErrorHandlerReifier.java | 31 +++++++++++++--------- 5 files changed, 64 insertions(+), 36 deletions(-) diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json index b4b43682a8a..d0475843b8f 100644 --- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json +++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/redeliveryPolicy.json @@ -13,28 +13,28 @@ }, "properties": { "maximumRedeliveries": { "kind": "attribute", "displayName": "Maximum Redeliveries", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum redeliveries x = redeliver at most x times 0 = no redeliveries -1 = redeliver forever" }, - "redeliveryDelay": { "kind": "attribute", "displayName": "Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the initial redelivery delay" }, + "redeliveryDelay": { "kind": "attribute", "displayName": "Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1000", "description": "Sets the initial redelivery delay" }, "asyncDelayedRedelivery": { "kind": "attribute", "displayName": "Async Delayed Redelivery", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allow asynchronous delayed redelivery. The route, in particular the consumer's component, must support the Asynchronous Routing Engine (e.g. seda)." }, - "backOffMultiplier": { "kind": "attribute", "displayName": "Back Off Multiplier", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the back off multiplier" }, + "backOffMultiplier": { "kind": "attribute", "displayName": "Back Off Multiplier", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "2.0", "description": "Sets the back off multiplier" }, "useExponentialBackOff": { "kind": "attribute", "displayName": "Use Exponential Back Off", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turn on exponential backk off" }, - "collisionAvoidanceFactor": { "kind": "attribute", "displayName": "Collision Avoidance Factor", "label": "advanced", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the collision avoidance factor" }, + "collisionAvoidanceFactor": { "kind": "attribute", "displayName": "Collision Avoidance Factor", "label": "advanced", "required": false, "type": "number", "javaType": "java.lang.Double", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "0.15", "description": "Sets the collision avoidance factor" }, "useCollisionAvoidance": { "kind": "attribute", "displayName": "Use Collision Avoidance", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Turn on collision avoidance." }, - "maximumRedeliveryDelay": { "kind": "attribute", "displayName": "Maximum Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the maximum delay between redelivery" }, - "retriesExhaustedLogLevel": { "kind": "attribute", "displayName": "Retries Exhausted Log Level", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the logging level to use when retries have been exhausted" }, - "retryAttemptedLogLevel": { "kind": "attribute", "displayName": "Retry Attempted Log Level", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the logging level to use for logging retry attempts" }, - "retryAttemptedLogInterval": { "kind": "attribute", "displayName": "Retry Attempted Log Interval", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the interval to use for logging retry attempts" }, - "logRetryAttempted": { "kind": "attribute", "displayName": "Log Retry Attempted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether retry attempts should be logged or not. Can be used to include or reduce verbose." }, - "logStackTrace": { "kind": "attribute", "displayName": "Log Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether stack traces should be logged. Can be used to include or reduce verbose." }, + "maximumRedeliveryDelay": { "kind": "attribute", "displayName": "Maximum Redelivery Delay", "required": false, "type": "duration", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "60000", "description": "Sets the maximum delay between redelivery" }, + "retriesExhaustedLogLevel": { "kind": "attribute", "displayName": "Retries Exhausted Log Level", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "ERROR", "description": "Sets the logging level to use when retries have been exhausted" }, + "retryAttemptedLogLevel": { "kind": "attribute", "displayName": "Retry Attempted Log Level", "required": false, "type": "object", "javaType": "org.apache.camel.LoggingLevel", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "DEBUG", "description": "Sets the logging level to use for logging retry attempts" }, + "retryAttemptedLogInterval": { "kind": "attribute", "displayName": "Retry Attempted Log Interval", "label": "advanced", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "1", "description": "Sets the interval to use for logging retry attempts" }, + "logRetryAttempted": { "kind": "attribute", "displayName": "Log Retry Attempted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether retry attempts should be logged or not. Can be used to include or reduce verbose." }, + "logStackTrace": { "kind": "attribute", "displayName": "Log Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether stack traces should be logged. Can be used to include or reduce verbose." }, "logRetryStackTrace": { "kind": "attribute", "displayName": "Log Retry Stack Trace", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether stack traces should be logged when an retry attempt failed. Can be used to include or reduce verbose." }, "logHandled": { "kind": "attribute", "displayName": "Log Handled", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether handled exceptions should be logged or not. Can be used to include or reduce verbose." }, - "logNewException": { "kind": "attribute", "displayName": "Log New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether new exceptions should be logged or not. Can be used to include or reduce verbose. A new exception is an exception that was thrown while handling a previous exception." }, + "logNewException": { "kind": "attribute", "displayName": "Log New Exception", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether new exceptions should be logged or not. Can be used to include or reduce verbose. A new exception is an exception that was thrown while handling a previous exception." }, "logContinued": { "kind": "attribute", "displayName": "Log Continued", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether continued exceptions should be logged or not. Can be used to include or reduce verbose." }, - "logExhausted": { "kind": "attribute", "displayName": "Log Exhausted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted exceptions should be logged or not. Can be used to include or reduce verbose." }, + "logExhausted": { "kind": "attribute", "displayName": "Log Exhausted", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Sets whether exhausted exceptions should be logged or not. Can be used to include or reduce verbose." }, "logExhaustedMessageHistory": { "kind": "attribute", "displayName": "Log Exhausted Message History", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted exceptions should be logged including message history or not (supports property placeholders). Can be used to include or reduce verbose." }, "logExhaustedMessageBody": { "kind": "attribute", "displayName": "Log Exhausted Message Body", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Sets whether exhausted message body should be logged including message history or not (supports property placeholders). Can be used to include or reduce verbose. Requires logExhaustedMessageHistory to be [...] "disableRedelivery": { "kind": "attribute", "displayName": "Disable Redelivery", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Disables redelivery (same as setting maximum redeliveries to 0)" }, "delayPattern": { "kind": "attribute", "displayName": "Delay Pattern", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the delay pattern with delay intervals." }, - "allowRedeliveryWhileStopping": { "kind": "attribute", "displayName": "Allow Redelivery While Stopping", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Controls whether to allow redelivery while stopping\/shutting down a route that uses error handling." }, + "allowRedeliveryWhileStopping": { "kind": "attribute", "displayName": "Allow Redelivery While Stopping", "label": "advanced", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Controls whether to allow redelivery while stopping\/shutting down a route that uses error handling." }, "exchangeFormatterRef": { "kind": "attribute", "displayName": "Exchange Formatter Ref", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the reference of the instance of org.apache.camel.spi.ExchangeFormatter to generate the log message from exchange." } } } diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java index afdace5c24b..dfbc09903ad 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RedeliveryPolicyDefinition.java @@ -36,40 +36,40 @@ public class RedeliveryPolicyDefinition implements Cloneable { @Metadata(javaType = "java.lang.Integer") private String maximumRedeliveries; @XmlAttribute - @Metadata(javaType = "java.time.Duration") + @Metadata(javaType = "java.time.Duration", defaultValue = "1000") private String redeliveryDelay; @XmlAttribute @Metadata(label = "advanced", javaType = "java.lang.Boolean") private String asyncDelayedRedelivery; @XmlAttribute - @Metadata(javaType = "java.lang.Double") + @Metadata(javaType = "java.lang.Double", defaultValue = "2.0") private String backOffMultiplier; @XmlAttribute @Metadata(label = "advanced", javaType = "java.lang.Boolean") private String useExponentialBackOff; @XmlAttribute - @Metadata(label = "advanced", javaType = "java.lang.Double") + @Metadata(label = "advanced", javaType = "java.lang.Double", defaultValue = "0.15") private String collisionAvoidanceFactor; @XmlAttribute @Metadata(label = "advanced", javaType = "java.lang.Boolean") private String useCollisionAvoidance; @XmlAttribute - @Metadata(javaType = "java.time.Duration") + @Metadata(javaType = "java.time.Duration", defaultValue = "60000") private String maximumRedeliveryDelay; @XmlAttribute - @Metadata(label = "advanced", javaType = "org.apache.camel.LoggingLevel") + @Metadata(label = "advanced", javaType = "org.apache.camel.LoggingLevel", defaultValue = "ERROR") private String retriesExhaustedLogLevel; @XmlAttribute - @Metadata(javaType = "org.apache.camel.LoggingLevel") + @Metadata(javaType = "org.apache.camel.LoggingLevel", defaultValue = "DEBUG") private String retryAttemptedLogLevel; @XmlAttribute - @Metadata(label = "advanced", javaType = "java.lang.Integer") + @Metadata(label = "advanced", javaType = "java.lang.Integer", defaultValue = "1") private String retryAttemptedLogInterval; @XmlAttribute - @Metadata(label = "advanced", javaType = "java.lang.Boolean") + @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true") private String logRetryAttempted; @XmlAttribute - @Metadata(label = "advanced", javaType = "java.lang.Boolean") + @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true") private String logStackTrace; @XmlAttribute @Metadata(label = "advanced", javaType = "java.lang.Boolean") @@ -78,13 +78,13 @@ public class RedeliveryPolicyDefinition implements Cloneable { @Metadata(label = "advanced", javaType = "java.lang.Boolean") private String logHandled; @XmlAttribute - @Metadata(label = "advanced", javaType = "java.lang.Boolean") + @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true") private String logNewException; @XmlAttribute @Metadata(javaType = "java.lang.Boolean") private String logContinued; @XmlAttribute - @Metadata(label = "advanced", javaType = "java.lang.Boolean") + @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true") private String logExhausted; @XmlAttribute @Metadata(label = "advanced", javaType = "java.lang.Boolean") @@ -99,7 +99,7 @@ public class RedeliveryPolicyDefinition implements Cloneable { @Metadata(label = "advanced") private String delayPattern; @XmlAttribute - @Metadata(label = "advanced", javaType = "java.lang.Boolean") + @Metadata(label = "advanced", javaType = "java.lang.Boolean", defaultValue = "true") private String allowRedeliveryWhileStopping; @XmlAttribute @Metadata(label = "advanced") diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java index 75a01a5804e..b9cd738814f 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DeadLetterChannelDefinition.java @@ -21,6 +21,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlRootElement; +import org.apache.camel.Endpoint; import org.apache.camel.builder.ErrorHandlerBuilder; import org.apache.camel.spi.Metadata; @@ -40,6 +41,23 @@ public class DeadLetterChannelDefinition extends DefaultErrorHandlerDefinition { @Metadata(defaultValue = "true") private String deadLetterHandleNewException; + public DeadLetterChannelDefinition() { + // DLC do not log exhausted by default + getRedeliveryPolicy().setLogExhausted("false"); + } + + public DeadLetterChannelDefinition(Endpoint deadLetter) { + setDeadLetterUri(deadLetter.getEndpointUri()); + // DLC do not log exhausted by default + getRedeliveryPolicy().setLogExhausted("false"); + } + + public DeadLetterChannelDefinition(String uri) { + setDeadLetterUri(uri); + // DLC do not log exhausted by default + getRedeliveryPolicy().setLogExhausted("false"); + } + public String getDeadLetterUri() { return deadLetterUri; } diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java index a2f3d918ed8..60501a5d008 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/errorhandler/DefaultErrorHandlerDefinition.java @@ -395,6 +395,9 @@ public class DefaultErrorHandlerDefinition extends BaseErrorHandlerDefinition im } public RedeliveryPolicyDefinition getRedeliveryPolicy() { + if (redeliveryPolicy == null) { + redeliveryPolicy = new RedeliveryPolicyDefinition(); + } return redeliveryPolicy; } diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java index 4b163bdd563..400d45a6d48 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/errorhandler/ErrorHandlerReifier.java @@ -261,35 +261,42 @@ public abstract class ErrorHandlerReifier<T extends ErrorHandlerFactory> extends } Map<RedeliveryOption, String> policy = new HashMap<>(); setOption(policy, RedeliveryOption.maximumRedeliveries, definition.getMaximumRedeliveries()); - setOption(policy, RedeliveryOption.redeliveryDelay, definition.getRedeliveryDelay()); + setOption(policy, RedeliveryOption.redeliveryDelay, definition.getRedeliveryDelay(), "1000"); setOption(policy, RedeliveryOption.asyncDelayedRedelivery, definition.getAsyncDelayedRedelivery()); - setOption(policy, RedeliveryOption.backOffMultiplier, definition.getBackOffMultiplier()); + setOption(policy, RedeliveryOption.backOffMultiplier, definition.getBackOffMultiplier(), "2"); setOption(policy, RedeliveryOption.useExponentialBackOff, definition.getUseExponentialBackOff()); - setOption(policy, RedeliveryOption.collisionAvoidanceFactor, definition.getCollisionAvoidanceFactor()); + setOption(policy, RedeliveryOption.collisionAvoidanceFactor, definition.getCollisionAvoidanceFactor(), "0.15"); setOption(policy, RedeliveryOption.useCollisionAvoidance, definition.getUseCollisionAvoidance()); - setOption(policy, RedeliveryOption.maximumRedeliveryDelay, definition.getMaximumRedeliveryDelay()); - setOption(policy, RedeliveryOption.retriesExhaustedLogLevel, definition.getRetriesExhaustedLogLevel()); - setOption(policy, RedeliveryOption.retryAttemptedLogLevel, definition.getRetryAttemptedLogLevel()); - setOption(policy, RedeliveryOption.retryAttemptedLogInterval, definition.getRetryAttemptedLogInterval()); - setOption(policy, RedeliveryOption.logRetryAttempted, definition.getLogRetryAttempted()); - setOption(policy, RedeliveryOption.logStackTrace, definition.getLogStackTrace()); + setOption(policy, RedeliveryOption.maximumRedeliveryDelay, definition.getMaximumRedeliveryDelay(), "60000"); + setOption(policy, RedeliveryOption.retriesExhaustedLogLevel, definition.getRetriesExhaustedLogLevel(), "ERROR"); + setOption(policy, RedeliveryOption.retryAttemptedLogLevel, definition.getRetryAttemptedLogLevel(), "DEBUG"); + setOption(policy, RedeliveryOption.retryAttemptedLogInterval, definition.getRetryAttemptedLogInterval(), "1"); + setOption(policy, RedeliveryOption.logRetryAttempted, definition.getLogRetryAttempted(), "true"); + setOption(policy, RedeliveryOption.logStackTrace, definition.getLogStackTrace(), "true"); setOption(policy, RedeliveryOption.logRetryStackTrace, definition.getLogRetryStackTrace()); setOption(policy, RedeliveryOption.logHandled, definition.getLogHandled()); - setOption(policy, RedeliveryOption.logNewException, definition.getLogNewException()); + setOption(policy, RedeliveryOption.logNewException, definition.getLogNewException(), "true"); setOption(policy, RedeliveryOption.logContinued, definition.getLogContinued()); - setOption(policy, RedeliveryOption.logExhausted, definition.getLogExhausted()); + setOption(policy, RedeliveryOption.logExhausted, definition.getLogExhausted(), "true"); setOption(policy, RedeliveryOption.logExhaustedMessageHistory, definition.getLogExhaustedMessageHistory()); setOption(policy, RedeliveryOption.logExhaustedMessageBody, definition.getLogExhaustedMessageBody()); setOption(policy, RedeliveryOption.disableRedelivery, definition.getDisableRedelivery()); setOption(policy, RedeliveryOption.delayPattern, definition.getDelayPattern()); - setOption(policy, RedeliveryOption.allowRedeliveryWhileStopping, definition.getAllowRedeliveryWhileStopping()); + setOption(policy, RedeliveryOption.allowRedeliveryWhileStopping, definition.getAllowRedeliveryWhileStopping(), "true"); setOption(policy, RedeliveryOption.exchangeFormatterRef, definition.getExchangeFormatterRef()); return policy; } private static void setOption(Map<RedeliveryOption, String> policy, RedeliveryOption option, Object value) { + setOption(policy, option, value, null); + } + + private static void setOption( + Map<RedeliveryOption, String> policy, RedeliveryOption option, Object value, Object defaultValue) { if (value != null) { policy.put(option, value.toString()); + } else if (defaultValue != null) { + policy.put(option, defaultValue.toString()); } }
