diff --git a/apache-libraries-2/pom.xml b/apache-libraries-2/pom.xml
index d188204208..2e7ef0344c 100644
--- a/apache-libraries-2/pom.xml
+++ b/apache-libraries-2/pom.xml
@@ -19,10 +19,29 @@
validation-api
${javax.validation.validation-api.version}
+
+ org.apache.camel
+ camel-core
+ ${camel.version}
+
+
+
+ org.apache.camel
+ camel-test-junit5
+ ${camel.version}
+ test
+
+
+
+ org.apache.camel
+ camel-main
+ ${camel.version}
+
2.0.1.Final
+ 4.3.0
\ No newline at end of file
diff --git a/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java
new file mode 100644
index 0000000000..a28c3959a4
--- /dev/null
+++ b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterBean.java
@@ -0,0 +1,29 @@
+package com.baeldung.dynamicrouter;
+
+import org.apache.camel.ExchangeProperties;
+
+import java.util.Map;
+
+public class DynamicRouterBean {
+ public String route(String body, @ExchangeProperties Map properties) {
+ int invoked = (int) properties.getOrDefault("invoked", 0) + 1;
+
+ properties.put("invoked", invoked);
+
+ if (invoked == 1) {
+ switch (body.toLowerCase()) {
+ case "mock":
+ return "mock:dynamicRouter";
+ case "direct":
+ return "mock:directDynamicRouter";
+ case "seda":
+ return "mock:sedaDynamicRouter";
+ case "file":
+ return "mock:fileDynamicRouter";
+ default:
+ break;
+ }
+ }
+ return null;
+ }
+}
diff --git a/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterRoute.java b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterRoute.java
new file mode 100644
index 0000000000..875263f0b1
--- /dev/null
+++ b/apache-libraries-2/src/main/java/com/baeldung/dynamicrouter/DynamicRouterRoute.java
@@ -0,0 +1,13 @@
+package com.baeldung.dynamicrouter;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class DynamicRouterRoute extends RouteBuilder {
+
+ @Override
+ public void configure() {
+
+ from("direct:dynamicRouter").dynamicRouter(method(DynamicRouterBean.class, "route"));
+
+ }
+}
diff --git a/apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java b/apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java
new file mode 100644
index 0000000000..6401fa4be2
--- /dev/null
+++ b/apache-libraries-2/src/test/java/dynamicrouter/DynamicRouterRouteUnitTest.java
@@ -0,0 +1,61 @@
+package dynamicrouter;
+
+import com.baeldung.dynamicrouter.DynamicRouterRoute;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+public class DynamicRouterRouteUnitTest extends CamelTestSupport {
+
+ @Override
+ protected RoutesBuilder createRouteBuilder() {
+ return new DynamicRouterRoute();
+ }
+
+ @Test
+ void givenDynamicRouter_whenMockEndpointExpectedMessageCountOneAndMockAsMessageBody_thenMessageSentToDynamicRouter() throws InterruptedException {
+
+ MockEndpoint mockDynamicEndpoint = getMockEndpoint("mock:dynamicRouter");
+ mockDynamicEndpoint.expectedMessageCount(1);
+
+ template.send("direct:dynamicRouter", exchange -> exchange.getIn()
+ .setBody("mock"));
+ MockEndpoint.assertIsSatisfied(context);
+ }
+
+ @Test
+ void givenDynamicRouter_whenMockEndpointExpectedMessageCountOneAndDirectAsMessageBody_thenMessageSentToDynamicRouter() throws InterruptedException {
+
+ MockEndpoint mockDynamicEndpoint = context.getEndpoint("mock:directDynamicRouter", MockEndpoint.class);
+ mockDynamicEndpoint.expectedMessageCount(1);
+
+ template.send("direct:dynamicRouter", exchange -> exchange.getIn()
+ .setBody("direct"));
+
+ MockEndpoint.assertIsSatisfied(context);
+ }
+
+ @Test
+ void givenDynamicRouter_whenMockEndpointExpectedMessageCountOneAndSedaAsMessageBody_thenMessageSentToDynamicRouter() throws InterruptedException {
+
+ MockEndpoint mockDynamicEndpoint = context.getEndpoint("mock:sedaDynamicRouter", MockEndpoint.class);
+ mockDynamicEndpoint.expectedMessageCount(1);
+
+ template.send("direct:dynamicRouter", exchange -> exchange.getIn()
+ .setBody("seda"));
+ MockEndpoint.assertIsSatisfied(context);
+ }
+
+ @Test
+ void givenDynamicRouter_whenMockEndpointExpectedMessageCountOneAndBookAsMessageBody_thenMessageSentToDynamicRouter() throws InterruptedException {
+
+ MockEndpoint mockDynamicEndpoint = getMockEndpoint("mock:fileDynamicRouter");
+ mockDynamicEndpoint.expectedMessageCount(1);
+
+ template.send("direct:dynamicRouter", exchange -> exchange.getIn()
+ .setBody("file"));
+ MockEndpoint.assertIsSatisfied(context);
+ }
+
+}
\ No newline at end of file