You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/07/07 11:11:01 UTC

[camel] branch CAMEL-16757 updated (020605a -> 8f94c08)

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

davsclaus pushed a change to branch CAMEL-16757
in repository https://gitbox.apache.org/repos/asf/camel.git.


    from 020605a  CAMEL-16757: camel-core - Global error handling, interceptor in all DSL
     new 3490f00  CAMEL-16757: camel-core - Global error handling, interceptor in all DSL
     new 8f94c08  CAMEL-16757: camel-core - Global error handling, interceptor in all DSL

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../main/java/org/apache/camel/CamelContext.java   |  8 ++++
 ...ilder.java => RoutesConfigurationsBuilder.java} | 13 +++---
 .../camel/impl/engine/AbstractCamelContext.java    | 10 +++++
 .../camel/impl/lw/LightweightCamelContext.java     |  6 +++
 .../impl/lw/LightweightRuntimeCamelContext.java    |  6 +++
 .../services/org/apache/camel/model.properties     |  1 +
 .../resources/org/apache/camel/model/jaxb.index    |  1 +
 ...onfiguration.json => routesConfigurations.json} |  8 ++--
 .../org/apache/camel/builder/RouteBuilder.java     | 25 ++++++++++-
 .../camel/builder/RoutesConfigurationsBuilder.java | 14 +++---
 ...on.java => RoutesConfigurationsDefinition.java} | 51 +++++++++++++---------
 .../org/apache/camel/main/RoutesConfigurer.java    | 12 +++--
 .../java/org/apache/camel/xml/in/ModelParser.java  | 33 ++++++++++++++
 .../camel/dsl/xml/io/XmlRoutesBuilderLoader.java   | 19 ++++++++
 .../dsl/yaml/deserializers/ModelDeserializers.java | 44 +++++++++++++++++++
 .../deserializers/ModelDeserializersResolver.java  |  2 +
 .../src/generated/resources/camel-yaml-dsl.json    | 11 +++++
 .../camel/dsl/yaml/YamlRoutesBuilderLoader.java    | 11 +++++
 .../packaging/ModelXmlParserGeneratorMojo.java     |  4 +-
 19 files changed, 235 insertions(+), 44 deletions(-)
 copy core/camel-api/src/main/java/org/apache/camel/{RoutesBuilder.java => RoutesConfigurationsBuilder.java} (65%)
 copy core/camel-core-model/src/generated/resources/org/apache/camel/model/{routesConfiguration.json => routesConfigurations.json} (75%)
 copy components/camel-spring-xml/src/test/java/org/apache/camel/spring/StartAndStopRouteBuilder.java => core/camel-core-model/src/main/java/org/apache/camel/builder/RoutesConfigurationsBuilder.java (73%)
 copy core/camel-core-model/src/main/java/org/apache/camel/model/{OtherwiseDefinition.java => RoutesConfigurationsDefinition.java} (54%)

[camel] 01/02: CAMEL-16757: camel-core - Global error handling, interceptor in all DSL

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3490f00066be14134aea85fb24379680ae7d481a
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Jul 7 12:27:19 2021 +0200

    CAMEL-16757: camel-core - Global error handling, interceptor in all DSL
---
 .../main/java/org/apache/camel/CamelContext.java   |  8 ++++++
 .../apache/camel/RoutesConfigurationsBuilder.java  | 33 ++++++++++++++++++++++
 .../camel/impl/engine/AbstractCamelContext.java    | 10 +++++++
 .../org/apache/camel/builder/RouteBuilder.java     | 25 ++++++++++++++--
 .../camel/builder/RoutesConfigurationsBuilder.java | 32 +++++++++++++++++++++
 .../org/apache/camel/main/RoutesConfigurer.java    | 12 ++++++--
 6 files changed, 115 insertions(+), 5 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
index 387c071..7a82c74 100644
--- a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
@@ -573,6 +573,14 @@ public interface CamelContext extends CamelContextLifecycle, RuntimeConfiguratio
     void addRoutes(RoutesBuilder builder) throws Exception;
 
     /**
+     * Adds the routes configurations (global configuration for all routes) from the routes builder.
+     *
+     * @param  builder   the builder which has routes configurations
+     * @throws Exception if the routes configurations could not be created for whatever reason
+     */
+    void addRoutesConfigurations(RoutesConfigurationsBuilder builder) throws Exception;
+
+    /**
      * Removes the given route (the route <b>must</b> be stopped before it can be removed).
      * <p/>
      * A route which is removed will be unregistered from JMX, have its services stopped/shutdown and the route
diff --git a/core/camel-api/src/main/java/org/apache/camel/RoutesConfigurationsBuilder.java b/core/camel-api/src/main/java/org/apache/camel/RoutesConfigurationsBuilder.java
new file mode 100644
index 0000000..0ff22ed
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/RoutesConfigurationsBuilder.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel;
+
+/**
+ * A routes configurations builder is capable of building routes configurations (global configuration for all routes)
+ * using the builder and model classes.
+ */
+public interface RoutesConfigurationsBuilder {
+
+    /**
+     * Adds the routes configurations from this Routes Configurations Builder to the CamelContext.
+     *
+     * @param  context   the Camel context
+     * @throws Exception is thrown if initialization of routes configurations failed
+     */
+    void addRoutesConfigurationsToCamelContext(CamelContext context) throws Exception;
+
+}
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 dbc792c..805a238 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
@@ -65,6 +65,7 @@ import org.apache.camel.ResolveEndpointFailedException;
 import org.apache.camel.Route;
 import org.apache.camel.RouteAware;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.RoutesConfigurationsBuilder;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.Service;
 import org.apache.camel.ServiceStatus;
@@ -1151,6 +1152,15 @@ public abstract class AbstractCamelContext extends BaseService
         }
     }
 
+    @Override
+    public void addRoutesConfigurations(RoutesConfigurationsBuilder builder) throws Exception {
+        try (LifecycleHelper helper = new LifecycleHelper()) {
+            build();
+            LOG.debug("Adding route configurations from builder: {}", builder);
+            builder.addRoutesConfigurationsToCamelContext(AbstractCamelContext.this);
+        }
+    }
+
     public ServiceStatus getRouteStatus(String key) {
         RouteService routeService = routeServices.get(key);
         if (routeService != null) {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
index 622b225..90ae70e 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/RouteBuilder.java
@@ -29,6 +29,7 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Ordered;
 import org.apache.camel.Route;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.RoutesConfigurationsBuilder;
 import org.apache.camel.model.FromDefinition;
 import org.apache.camel.model.InterceptDefinition;
 import org.apache.camel.model.InterceptFromDefinition;
@@ -61,10 +62,11 @@ import org.slf4j.LoggerFactory;
  * A <a href="http://camel.apache.org/dsl.html">Java DSL</a> which is used to build {@link Route} instances in a
  * {@link CamelContext} for smart routing.
  */
-public abstract class RouteBuilder extends BuilderSupport implements RoutesBuilder, Ordered {
+public abstract class RouteBuilder extends BuilderSupport implements RoutesBuilder, RoutesConfigurationsBuilder, Ordered {
     protected Logger log = LoggerFactory.getLogger(getClass());
 
     private final AtomicBoolean initialized = new AtomicBoolean();
+    private final AtomicBoolean initializedConfiguration = new AtomicBoolean();
     private final List<RouteBuilderLifecycleStrategy> lifecycleInterceptors = new ArrayList<>();
     private final List<TransformerBuilder> transformerBuilders = new ArrayList<>();
     private final List<ValidatorBuilder> validatorBuilders = new ArrayList<>();
@@ -169,6 +171,16 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
     public abstract void configure() throws Exception;
 
     /**
+     * <b>Called on initialization to build routes configuration (global routes configurations) using the fluent builder
+     * syntax.</b>
+     *
+     * @throws Exception can be thrown during configuration
+     */
+    public void configuration() throws Exception {
+        // noop
+    }
+
+    /**
      * Binds the bean to the repository (if possible).
      *
      * @param id   the id of the bean
@@ -477,7 +489,6 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
         configureRests(context);
 
         // but populate rests before routes, as we want to turn rests into routes
-        populateRoutesConfiguration();
         populateRests();
         populateTransformers();
         populateValidators();
@@ -489,6 +500,16 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
         }
     }
 
+    @Override
+    public void addRoutesConfigurationsToCamelContext(CamelContext context) throws Exception {
+        setCamelContext(context);
+        routeCollection.setCamelContext(context);
+        if (initializedConfiguration.compareAndSet(false, true)) {
+            configuration();
+        }
+        populateRoutesConfiguration();
+    }
+
     /**
      * Configures the routes
      *
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/builder/RoutesConfigurationsBuilder.java b/core/camel-core-model/src/main/java/org/apache/camel/builder/RoutesConfigurationsBuilder.java
new file mode 100644
index 0000000..a31275a
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/builder/RoutesConfigurationsBuilder.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder;
+
+/**
+ * A <a href="http://camel.apache.org/dsl.html">Java DSL</a> which is used for defining routes configuration (global
+ * routes configuration)
+ */
+public abstract class RoutesConfigurationsBuilder extends RouteBuilder {
+
+    @Override
+    public void configure() throws Exception {
+        // noop
+    }
+
+    public abstract void configuration() throws Exception;
+
+}
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java b/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
index 4d59e2f..4ed77f3 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
@@ -24,6 +24,7 @@ import java.util.Set;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.RoutesConfigurationsBuilder;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.CamelBeanPostProcessor;
 import org.apache.camel.support.OrderedComparator;
@@ -205,9 +206,14 @@ public class RoutesConfigurer {
         // sort routes according to ordered
         routes.sort(OrderedComparator.get());
 
-        // TODO: 1st-pass for RoutesConfiguration
-        // TODO: 2nd-pass for the routes
-
+        // first add the routes configurations as they are globally for all routes
+        for (RoutesBuilder builder : routes) {
+            if (builder instanceof RoutesConfigurationsBuilder) {
+                RoutesConfigurationsBuilder rcb = (RoutesConfigurationsBuilder) builder;
+                LOG.debug("Adding routes configurations into CamelContext from RoutesConfigurationsBuilder: {}", rcb);
+                camelContext.addRoutesConfigurations(rcb);
+            }
+        }
         // then add the routes
         for (RoutesBuilder builder : routes) {
             LOG.debug("Adding routes into CamelContext from RoutesBuilder: {}", builder);

[camel] 02/02: CAMEL-16757: camel-core - Global error handling, interceptor in all DSL

Posted by da...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 8f94c0888383dd8a6a9714e5f6c8e54728ae7112
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Jul 7 13:10:25 2021 +0200

    CAMEL-16757: camel-core - Global error handling, interceptor in all DSL
---
 .../camel/impl/lw/LightweightCamelContext.java     |  6 ++
 .../impl/lw/LightweightRuntimeCamelContext.java    |  6 ++
 .../services/org/apache/camel/model.properties     |  1 +
 .../resources/org/apache/camel/model/jaxb.index    |  1 +
 .../apache/camel/model/routesConfigurations.json   | 17 +++++
 .../model/RoutesConfigurationsDefinition.java      | 77 ++++++++++++++++++++++
 .../java/org/apache/camel/xml/in/ModelParser.java  | 33 ++++++++++
 .../camel/dsl/xml/io/XmlRoutesBuilderLoader.java   | 19 ++++++
 .../dsl/yaml/deserializers/ModelDeserializers.java | 44 +++++++++++++
 .../deserializers/ModelDeserializersResolver.java  |  2 +
 .../src/generated/resources/camel-yaml-dsl.json    | 11 ++++
 .../camel/dsl/yaml/YamlRoutesBuilderLoader.java    | 11 ++++
 .../packaging/ModelXmlParserGeneratorMojo.java     |  4 +-
 13 files changed, 231 insertions(+), 1 deletion(-)

diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
index bf5b72e..8701f68 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
@@ -43,6 +43,7 @@ import org.apache.camel.ProducerTemplate;
 import org.apache.camel.Route;
 import org.apache.camel.RouteTemplateContext;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.RoutesConfigurationsBuilder;
 import org.apache.camel.Service;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.ShutdownRoute;
@@ -553,6 +554,11 @@ public class LightweightCamelContext implements ExtendedCamelContext, CatalogCam
     }
 
     @Override
+    public void addRoutesConfigurations(RoutesConfigurationsBuilder builder) throws Exception {
+        delegate.addRoutesConfigurations(builder);
+    }
+
+    @Override
     public boolean removeRoute(String routeId) throws Exception {
         return delegate.removeRoute(routeId);
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
index e807148..d7351ee 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
@@ -51,6 +51,7 @@ import org.apache.camel.ResolveEndpointFailedException;
 import org.apache.camel.Route;
 import org.apache.camel.RouteTemplateContext;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.RoutesConfigurationsBuilder;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.Service;
 import org.apache.camel.ServiceStatus;
@@ -1863,6 +1864,11 @@ public class LightweightRuntimeCamelContext implements ExtendedCamelContext, Cat
     }
 
     @Override
+    public void addRoutesConfigurations(RoutesConfigurationsBuilder builder) throws Exception {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
     public boolean removeRoute(String routeId) throws Exception {
         throw new UnsupportedOperationException();
     }
diff --git a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
index 0aa905d..9a55b3e 100644
--- a/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
+++ b/core/camel-core-model/src/generated/resources/META-INF/services/org/apache/camel/model.properties
@@ -143,6 +143,7 @@ routeTemplateContextRef
 routeTemplates
 routes
 routesConfiguration
+routesConfigurations
 routingSlip
 rss
 saga
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index b/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index
index c211311..9ac2703 100644
--- a/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/jaxb.index
@@ -72,6 +72,7 @@ RouteTemplateParameterDefinition
 RouteTemplateScriptDefinition
 RouteTemplatesDefinition
 RoutesConfigurationDefinition
+RoutesConfigurationsDefinition
 RoutesDefinition
 RoutingSlipDefinition
 SagaCompletionMode
diff --git a/core/camel-core-model/src/generated/resources/org/apache/camel/model/routesConfigurations.json b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routesConfigurations.json
new file mode 100644
index 0000000..8bd9060
--- /dev/null
+++ b/core/camel-core-model/src/generated/resources/org/apache/camel/model/routesConfigurations.json
@@ -0,0 +1,17 @@
+{
+  "model": {
+    "kind": "model",
+    "name": "routesConfigurations",
+    "title": "Routes Configurations",
+    "description": "A series of global configuration for Camel routes",
+    "deprecated": false,
+    "label": "configuration",
+    "javaType": "org.apache.camel.model.RoutesConfigurationsDefinition",
+    "input": false,
+    "output": false
+  },
+  "properties": {
+    "id": { "kind": "attribute", "displayName": "Id", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the id of this node" },
+    "description": { "kind": "element", "displayName": "Description", "required": false, "type": "object", "javaType": "org.apache.camel.model.DescriptionDefinition", "deprecated": false, "autowired": false, "secret": false, "description": "Sets the description of this node" }
+  }
+}
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesConfigurationsDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesConfigurationsDefinition.java
new file mode 100644
index 0000000..55a708f
--- /dev/null
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RoutesConfigurationsDefinition.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElementRef;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.Metadata;
+
+/**
+ * A series of global configuration for Camel routes
+ */
+@Metadata(label = "configuration")
+@XmlRootElement(name = "routesConfigurations")
+@XmlAccessorType(XmlAccessType.FIELD)
+public class RoutesConfigurationsDefinition extends OptionalIdentifiedDefinition<RoutesDefinition> {
+
+    @XmlElementRef
+    private List<RoutesConfigurationDefinition> routesConfigurations = new ArrayList<>();
+    @XmlTransient
+    private CamelContext camelContext;
+
+    public RoutesConfigurationsDefinition() {
+    }
+
+    @Override
+    public String toString() {
+        return "RoutesConfigurations: " + getId();
+    }
+
+    @Override
+    public String getShortName() {
+        return "routesConfigurations";
+    }
+
+    @Override
+    public String getLabel() {
+        return "RoutesConfigurations " + getId();
+    }
+
+    public List<RoutesConfigurationDefinition> getRoutesConfigurations() {
+        return routesConfigurations;
+    }
+
+    public void setRoutesConfigurations(List<RoutesConfigurationDefinition> routesConfigurations) {
+        this.routesConfigurations = routesConfigurations;
+    }
+
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+}
diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
index 72895e0..3d5ccff 100644
--- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
+++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java
@@ -1126,6 +1126,39 @@ public class ModelParser extends BaseParser {
             return true;
         }, noValueHandler());
     }
+    public Optional<RoutesConfigurationsDefinition> parseRoutesConfigurationsDefinition()
+            throws IOException, XmlPullParserException {
+        String tag = getNextTag("routesConfigurations", "routesConfiguration");
+        if (tag != null) {
+            switch (tag) {
+                case "routesConfigurations" : return Optional.of(doParseRoutesConfigurationsDefinition());
+                case "routesConfiguration" : return parseSingleRoutesConfigurationsDefinition();
+            }
+        }
+        return Optional.empty();
+    }
+    private Optional<RoutesConfigurationsDefinition> parseSingleRoutesConfigurationsDefinition()
+            throws IOException, XmlPullParserException {
+        Optional<RoutesConfigurationDefinition> single = Optional.of(doParseRoutesConfigurationDefinition());
+        if (single.isPresent()) {
+            List<RoutesConfigurationDefinition> list = new ArrayList<>();
+            list.add(single.get());
+            RoutesConfigurationsDefinition def = new RoutesConfigurationsDefinition();
+            def.setRoutesConfigurations(list);
+            return Optional.of(def);
+        }
+        return Optional.empty();
+    }
+    protected RoutesConfigurationsDefinition doParseRoutesConfigurationsDefinition() throws IOException, XmlPullParserException {
+        return doParse(new RoutesConfigurationsDefinition(),
+            optionalIdentifiedDefinitionAttributeHandler(), (def, key) -> {
+            if ("routesConfiguration".equals(key)) {
+                doAdd(doParseRoutesConfigurationDefinition(), def.getRoutesConfigurations(), def::setRoutesConfigurations);
+                return true;
+            }
+            return optionalIdentifiedDefinitionElementHandler().accept(def, key);
+        }, noValueHandler());
+    }
     public Optional<RoutesDefinition> parseRoutesDefinition()
             throws IOException, XmlPullParserException {
         String tag = getNextTag("routes", "route");
diff --git a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
index 59abcfd..8565107 100644
--- a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
+++ b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
@@ -22,7 +22,10 @@ import org.apache.camel.CamelContextAware;
 import org.apache.camel.api.management.ManagedResource;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.dsl.support.RouteBuilderLoaderSupport;
+import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.model.RoutesConfigurationDefinition;
+import org.apache.camel.model.RoutesConfigurationsDefinition;
 import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.annotations.RoutesLoader;
@@ -76,6 +79,15 @@ public class XmlRoutesBuilderLoader extends RouteBuilderLoaderSupport {
                 }
             }
 
+            @Override
+            public void configuration() throws Exception {
+                try (InputStream is = resource.getInputStream()) {
+                    new ModelParser(is)
+                            .parseRoutesConfigurationsDefinition()
+                            .ifPresent(this::addConfigurations);
+                }
+            }
+
             private void addRoutes(RoutesDefinition routes) {
                 CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
 
@@ -85,6 +97,13 @@ public class XmlRoutesBuilderLoader extends RouteBuilderLoaderSupport {
                     getRouteCollection().route(route);
                 }
             }
+
+            private void addConfigurations(RoutesConfigurationsDefinition configurations) {
+                CamelContextAware.trySetCamelContext(getRouteCollection(), getCamelContext());
+                for (RoutesConfigurationDefinition config : configurations.getRoutesConfigurations()) {
+                    getCamelContext().adapt(ModelCamelContext.class).addRoutesConfiguration(config);
+                }
+            }
         };
     }
 }
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
index 56ecd7b..2fa29b6 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java
@@ -73,6 +73,7 @@ import org.apache.camel.model.RouteContextRefDefinition;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.RouteTemplateParameterDefinition;
 import org.apache.camel.model.RouteTemplateScriptDefinition;
+import org.apache.camel.model.RoutesConfigurationsDefinition;
 import org.apache.camel.model.RoutingSlipDefinition;
 import org.apache.camel.model.SagaActionUriDefinition;
 import org.apache.camel.model.SagaDefinition;
@@ -12880,6 +12881,49 @@ public final class ModelDeserializers extends YamlDeserializerSupport {
     }
 
     @YamlType(
+            types = org.apache.camel.model.RoutesConfigurationsDefinition.class,
+            order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
+            nodes = "routes-configurations",
+            properties = @YamlProperty(name = "routes-configuration", type = "array:org.apache.camel.model.RoutesConfigurationDefinition")
+    )
+    public static class RoutesConfigurationsDefinitionDeserializer extends YamlDeserializerBase<RoutesConfigurationsDefinition> {
+        public RoutesConfigurationsDefinitionDeserializer() {
+            super(RoutesConfigurationsDefinition.class);
+        }
+
+        @Override
+        protected RoutesConfigurationsDefinition newInstance() {
+            return new RoutesConfigurationsDefinition();
+        }
+
+        @Override
+        protected boolean setProperty(RoutesConfigurationsDefinition target, String propertyKey,
+                String propertyName, Node node) {
+            switch(propertyKey) {
+                case "routes-configuration": {
+                    java.util.List<org.apache.camel.model.RoutesConfigurationDefinition> val = asFlatList(node, org.apache.camel.model.RoutesConfigurationDefinition.class);
+                    target.setRoutesConfigurations(val);
+                    break;
+                }
+                case "id": {
+                    String val = asText(node);
+                    target.setId(val);
+                    break;
+                }
+                case "description": {
+                    org.apache.camel.model.DescriptionDefinition val = asType(node, org.apache.camel.model.DescriptionDefinition.class);
+                    target.setDescription(val);
+                    break;
+                }
+                default: {
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+
+    @YamlType(
             inline = true,
             types = org.apache.camel.model.RoutingSlipDefinition.class,
             order = org.apache.camel.dsl.yaml.common.YamlDeserializerResolver.ORDER_LOWEST - 1,
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
index 965e470..197bfda 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializersResolver.java
@@ -304,6 +304,8 @@ public final class ModelDeserializersResolver implements YamlDeserializerResolve
             case "org.apache.camel.model.RouteTemplateParameterDefinition": return new ModelDeserializers.RouteTemplateParameterDefinitionDeserializer();
             case "template-script": return new ModelDeserializers.RouteTemplateScriptDefinitionDeserializer();
             case "org.apache.camel.model.RouteTemplateScriptDefinition": return new ModelDeserializers.RouteTemplateScriptDefinitionDeserializer();
+            case "routes-configurations": return new ModelDeserializers.RoutesConfigurationsDefinitionDeserializer();
+            case "org.apache.camel.model.RoutesConfigurationsDefinition": return new ModelDeserializers.RoutesConfigurationsDefinitionDeserializer();
             case "routing-slip": return new ModelDeserializers.RoutingSlipDefinitionDeserializer();
             case "org.apache.camel.model.RoutingSlipDefinition": return new ModelDeserializers.RoutingSlipDefinitionDeserializer();
             case "rss": return new ModelDeserializers.RssDataFormatDeserializer();
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
index 3708e2f..e58c408 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/camel-yaml-dsl.json
@@ -2189,6 +2189,17 @@
           }
         } ]
       },
+      "org.apache.camel.model.RoutesConfigurationsDefinition" : {
+        "type" : "object",
+        "properties" : {
+          "routes-configuration" : {
+            "type" : "array",
+            "items" : {
+              "$ref" : "#/items/definitions/org.apache.camel.model.RoutesConfigurationDefinition"
+            }
+          }
+        }
+      },
       "org.apache.camel.model.RoutingSlipDefinition" : {
         "oneOf" : [ {
           "type" : "string"
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
index 15a4057..48a5e92 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
@@ -96,6 +96,17 @@ public class YamlRoutesBuilderLoader extends YamlRoutesBuilderLoaderSupport {
                     }
                 }
             }
+
+            @Override
+            public void configuration() throws Exception {
+                for (Node node : asSequenceNode(root).getValue()) {
+                    Object item = getDeserializationContext().mandatoryResolve(node).construct(node);
+                    if (item instanceof RoutesConfigurationDefinition) {
+                        getContext().adapt(ModelCamelContext.class)
+                                .addRoutesConfiguration((RoutesConfigurationDefinition) item);
+                    }
+                }
+            }
         };
     }
 
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java
index bfc4cece..3f9f1bb 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/ModelXmlParserGeneratorMojo.java
@@ -101,6 +101,7 @@ public class ModelXmlParserGeneratorMojo extends AbstractGeneratorMojo {
     private Class<?> outputDefinitionClass;
     private Class<?> expressionDefinitionClass;
     private Class<?> routesDefinitionClass;
+    private Class<?> routesConfigurationsDefinitionClass;
     private Class<?> routeTemplatesDefinitionClass;
     private Class<?> restsDefinitionClass;
     private Class<?> processorDefinitionClass;
@@ -134,6 +135,7 @@ public class ModelXmlParserGeneratorMojo extends AbstractGeneratorMojo {
 
         outputDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".OutputDefinition");
         routesDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".RoutesDefinition");
+        routesConfigurationsDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".RoutesConfigurationsDefinition");
         routeTemplatesDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".RouteTemplatesDefinition");
         dataFormatDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".DataFormatDefinition");
         processorDefinitionClass = loadClass(classLoader, MODEL_PACKAGE + ".ProcessorDefinition");
@@ -476,7 +478,7 @@ public class ModelXmlParserGeneratorMojo extends AbstractGeneratorMojo {
                 }
                 return " noValueHandler()";
             });
-            if (clazz == routesDefinitionClass || clazz == routeTemplatesDefinitionClass || clazz == restsDefinitionClass) {
+            if (clazz == routesDefinitionClass || clazz == routeTemplatesDefinitionClass || clazz == restsDefinitionClass || clazz == routesConfigurationsDefinitionClass) {
 
                 // for routes/rests/routeTemplates we want to support single-mode as well, this means
                 // we check that the tag name is either plural or singular and parse accordingly