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 ecd6716401f6c..afe716ee7dcbc 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 @@ -579,6 +579,15 @@ public interface CamelContext extends CamelContextLifecycle, RuntimeConfiguratio */ void addRoutes(RoutesBuilder builder) throws Exception; + /** + * Adds the templated routes from the routes builder. + * For example in Java DSL you can use {@link org.apache.camel.builder.TemplatedRouteBuilder}. + * + * @param builder the builder which has templated routes + * @throws Exception if the routes could not be created for whatever reason + */ + void addTemplatedRoutes(RoutesBuilder builder) throws Exception; + /** * Adds the routes configurations (global configuration for all routes) from the routes builder. * diff --git a/core/camel-api/src/main/java/org/apache/camel/RoutesBuilder.java b/core/camel-api/src/main/java/org/apache/camel/RoutesBuilder.java index 39ee3bf9f1c41..a7bd5273d176b 100644 --- a/core/camel-api/src/main/java/org/apache/camel/RoutesBuilder.java +++ b/core/camel-api/src/main/java/org/apache/camel/RoutesBuilder.java @@ -36,6 +36,14 @@ public interface RoutesBuilder { */ void addRoutesToCamelContext(CamelContext context) throws Exception; + /** + * Adds the templated routes from this Route Builder to the CamelContext. + * + * @param context the Camel context + * @throws Exception is thrown if initialization of routes failed + */ + void addTemplatedRoutesToCamelContext(CamelContext context) throws Exception; + /** * Adds or updates the routes from this Route Builder to the CamelContext. * 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 d085b2b179832..520272ad2394b 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 @@ -1202,6 +1202,14 @@ public void addRoutes(RoutesBuilder builder) throws Exception { } } + @Override + public void addTemplatedRoutes(RoutesBuilder builder) throws Exception { + try (LifecycleHelper helper = new LifecycleHelper()) { + build(); + LOG.debug("Adding templated routes from builder: {}", builder); + builder.addTemplatedRoutesToCamelContext(AbstractCamelContext.this); + } + } @Override public void addRoutesConfigurations(RouteConfigurationsBuilder builder) throws Exception { try (LifecycleHelper helper = new LifecycleHelper()) { 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 53a5f2f2116fd..0800e42775e8f 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 @@ -576,6 +576,11 @@ public void addRoutes(RoutesBuilder builder) throws Exception { delegate.addRoutes(builder); } + @Override + public void addTemplatedRoutes(RoutesBuilder builder) throws Exception { + delegate.addTemplatedRoutes(builder); + } + @Override public void addRoutesConfigurations(RouteConfigurationsBuilder builder) throws Exception { delegate.addRoutesConfigurations(builder); 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 e4f996d30ed95..aec0eda679673 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 @@ -2043,6 +2043,11 @@ public void addRoutes(RoutesBuilder builder) throws Exception { throw new UnsupportedOperationException(); } + @Override + public void addTemplatedRoutes(RoutesBuilder builder) throws Exception { + throw new UnsupportedOperationException(); + } + @Override public void addRoutesConfigurations(RouteConfigurationsBuilder builder) throws Exception { throw new UnsupportedOperationException(); 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 9aa0025548e70..a646aff17b939 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 @@ -605,7 +605,6 @@ public void addRoutesToCamelContext(CamelContext context) throws Exception { populateTransformers(); populateValidators(); populateRouteTemplates(); - populateTemplatedRoutes(); // ensure routes are prepared before being populated for (RouteDefinition route : routeCollection.getRoutes()) { @@ -618,6 +617,11 @@ public void addRoutesToCamelContext(CamelContext context) throws Exception { } } + @Override + public void addTemplatedRoutesToCamelContext(CamelContext context) throws Exception { + populateTemplatedRoutes(); + } + @Override public Set updateRoutesToCamelContext(CamelContext context) throws Exception { Set answer = new LinkedHashSet<>(); 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 84ba9a9471f48..de7ea91ddcc01 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 @@ -236,6 +236,11 @@ private void addDiscoveredRoutes(CamelContext camelContext, List LOG.debug("Adding routes into CamelContext from RoutesBuilder: {}", builder); camelContext.addRoutes(builder); } + // then add templated routes last + for (RoutesBuilder builder : routes) { + LOG.debug("Adding templated routes into CamelContext from RoutesBuilder: {}", builder); + camelContext.addTemplatedRoutes(builder); + } } /**