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 2023/12/23 07:53:08 UTC

(camel-spring-boot) branch main updated: CAMEL-20247: Updated dynamic router spring boot starter to reflect rework changes. (#1052)

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-spring-boot.git


The following commit(s) were added to refs/heads/main by this push:
     new 632fbd97fce CAMEL-20247: Updated dynamic router spring boot starter to reflect rework changes. (#1052)
632fbd97fce is described below

commit 632fbd97fcef6c76005386480833cd44266f18a4
Author: Steve Storck <st...@gmail.com>
AuthorDate: Sat Dec 23 02:53:03 2023 -0500

    CAMEL-20247: Updated dynamic router spring boot starter to reflect rework changes. (#1052)
---
 .../camel/springboot/catalog/components.properties |  1 +
 .../catalog/components/dynamic-router-control.json | 49 ++++++++++++++++++++++
 .../catalog/components/dynamic-router.json         | 47 ++++++++++-----------
 .../src/main/docs/dynamic-router.json              | 48 ++++++++++++++++++---
 ...icRouterControlComponentAutoConfiguration.java} | 20 ++++-----
 ...ynamicRouterControlComponentConfiguration.java} | 15 +++----
 .../DynamicRouterComponentAutoConfiguration.java   |  4 +-
 .../DynamicRouterComponentConfiguration.java       |  2 +-
 ...rk.boot.autoconfigure.AutoConfiguration.imports |  3 +-
 9 files changed, 137 insertions(+), 52 deletions(-)

diff --git a/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components.properties b/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components.properties
index c6cc066d8f2..6616db0c13f 100644
--- a/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components.properties
+++ b/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components.properties
@@ -90,6 +90,7 @@ docker
 drill
 dropbox
 dynamic-router
+dynamic-router-control
 ehcache
 elasticsearch
 elasticsearch-rest-client
diff --git a/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/dynamic-router-control.json b/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/dynamic-router-control.json
new file mode 100644
index 00000000000..659d5759138
--- /dev/null
+++ b/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/dynamic-router-control.json
@@ -0,0 +1,49 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "dynamic-router-control",
+    "title": "Dynamic Router Control",
+    "description": "The Dynamic Router control endpoint for operations that allow routing participants to subscribe or unsubscribe to participate in dynamic message routing.",
+    "deprecated": false,
+    "firstVersion": "4.3.0",
+    "label": "messaging",
+    "javaType": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel.springboot",
+    "artifactId": "camel-dynamic-router-starter",
+    "version": "4.4.0-SNAPSHOT",
+    "scheme": "dynamic-router-control",
+    "extendsScheme": "",
+    "syntax": "dynamic-router-control:controlAction",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "lazyStartProducer": { "index": 0, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail [...]
+    "autowiredEnabled": { "index": 1, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...]
+  },
+  "headers": {
+    "CamelDynamicRouterControlAction": { "index": 0, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The control action header.", "constantName": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConstants#CONTROL_ACTION_HEADER" },
+    "CamelDynamicRouterSubscribeChannel": { "index": 1, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The Dynamic Router channel that the subscriber is subscribing on.", "constantName": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConstants#CONTROL_SUBSCRIBE_CHANNEL" },
+    "CamelDynamicRouterSubscriptionId": { "index": 2, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The subscription ID.", "constantName": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConstants#CONTROL_SUBSCRIPTION_ID" },
+    "CamelDynamicRouterDestinationUri": { "index": 3, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The URI on which the routing participant wants to receive matching exchanges.", "constantName": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConstants#CONTROL_DESTINATION_URI" },
+    "CamelDynamicRouterPriority": { "index": 4, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The priority of this subscription", "constantName": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConstants#CONTROL_PRIORITY" },
+    "CamelDynamicRouterPredicate": { "index": 5, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The predicate to evaluate exchanges for this subscription", "constantName": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConstants#CONTROL_PREDICATE" },
+    "CamelDynamicRouterPredicateBean": { "index": 6, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The name of the bean in the registry that identifies the subscription predicate.", "constantName": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConstants#CONTROL_PREDICATE_BEAN" },
+    "CamelDynamicRouterExpressionLanguage": { "index": 7, "kind": "header", "displayName": "", "group": "producer", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The language for the predicate when supplied as a string.", "constantName": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConstants#CONTROL_EXPRESSION_LANGUAGE" }
+  },
+  "properties": {
+    "controlAction": { "index": 0, "kind": "path", "displayName": "Control Action", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "enum": [ "subscribe", "unsubscribe", "list" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Control action" },
+    "lazyStartProducer": { "index": 1, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produc [...]
+    "destinationUri": { "index": 2, "kind": "parameter", "displayName": "Destination Uri", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConfiguration", "configurationField": "configuration", "description": "The destination URI for exchanges that match." },
+    "expressionLanguage": { "index": 3, "kind": "parameter", "displayName": "Expression Language", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "simple", "configurationClass": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConfiguration", "configurationField": "configuration", "description": "The subscription predicate language." },
+    "predicate": { "index": 4, "kind": "parameter", "displayName": "Predicate", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConfiguration", "configurationField": "configuration", "description": "The subscription predicate." },
+    "predicateBean": { "index": 5, "kind": "parameter", "displayName": "Predicate Bean", "group": "control", "label": "control", "required": false, "type": "object", "javaType": "org.apache.camel.Predicate", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConfiguration", "configurationField": "configuration", "description": "A Predicate instance in the registry." },
+    "priority": { "index": 6, "kind": "parameter", "displayName": "Priority", "group": "control", "label": "control", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConfiguration", "configurationField": "configuration", "description": "The subscription priority." },
+    "subscribeChannel": { "index": 7, "kind": "parameter", "displayName": "Subscribe Channel", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConfiguration", "configurationField": "configuration", "description": "The channel to subscribe to" },
+    "subscriptionId": { "index": 8, "kind": "parameter", "displayName": "Subscription Id", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.control.DynamicRouterControlConfiguration", "configurationField": "configuration", "description": "The subscription ID; if unspecified, one will be assigned and returned." }
+  }
+}
diff --git a/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/dynamic-router.json b/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/dynamic-router.json
index c15abf46b02..5574ffa4e02 100644
--- a/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/dynamic-router.json
+++ b/catalog/camel-catalog-provider-springboot/src/main/resources/org/apache/camel/springboot/catalog/components/dynamic-router.json
@@ -7,7 +7,7 @@
     "deprecated": false,
     "firstVersion": "3.15.0",
     "label": "messaging,core",
-    "javaType": "org.apache.camel.component.dynamicrouter.DynamicRouterComponent",
+    "javaType": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterComponent",
     "supportLevel": "Stable",
     "groupId": "org.apache.camel.springboot",
     "artifactId": "camel-dynamic-router-starter",
@@ -15,7 +15,6 @@
     "scheme": "dynamic-router",
     "extendsScheme": "",
     "syntax": "dynamic-router:channel",
-    "alternativeSyntax": "dynamic-router:channel\/controlAction\/subscribeChannel",
     "async": false,
     "api": false,
     "consumerOnly": false,
@@ -27,28 +26,26 @@
     "autowiredEnabled": { "index": 1, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...]
   },
   "properties": {
-    "channel": { "index": 0, "kind": "path", "displayName": "Channel", "group": "common", "label": "common", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Channel of the Dynamic Router" },
-    "controlAction": { "index": 1, "kind": "path", "displayName": "Control Action", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "subscribe", "unsubscribe" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Control channel action: subscr [...]
-    "subscribeChannel": { "index": 2, "kind": "path", "displayName": "Subscribe Channel", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "The channel to subscribe to" },
-    "aggregationStrategy": { "index": 3, "kind": "parameter", "displayName": "Aggregation Strategy", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Refers to an AggregationStrategy to be used to assemble the replies from the m [...]
-    "executorService": { "index": 4, "kind": "parameter", "displayName": "Executor Service", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Refers to a custom Thread Pool to be used for parallel processing. Notice that, if you [...]
-    "ignoreInvalidEndpoints": { "index": 5, "kind": "parameter", "displayName": "Ignore Invalid Endpoints", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Ignore the invalid endpoint exception when attempting to [...]
-    "onPrepare": { "index": 6, "kind": "parameter", "displayName": "On Prepare", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Uses the Processor when preparing the org.apache.camel.Exchange to be sent. This can be used to de [...]
-    "parallelAggregate": { "index": 7, "kind": "parameter", "displayName": "Parallel Aggregate", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "If enabled then the aggregate method on AggregationStrategy can be  [...]
-    "parallelProcessing": { "index": 8, "kind": "parameter", "displayName": "Parallel Processing", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "If enabled, then sending via multicast occurs concurrently. Note  [...]
-    "recipientMode": { "index": 9, "kind": "parameter", "displayName": "Recipient Mode", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "firstMatch", "allMatch" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "firstMatch", "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Recipient mode: firstM [...]
-    "shareUnitOfWork": { "index": 10, "kind": "parameter", "displayName": "Share Unit Of Work", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Shares the org.apache.camel.spi.UnitOfWork with the parent and each  [...]
-    "stopOnException": { "index": 11, "kind": "parameter", "displayName": "Stop On Exception", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Will stop further processing if an exception or failure occurred duri [...]
-    "streaming": { "index": 12, "kind": "parameter", "displayName": "Streaming", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "If enabled, then Camel will process replies out-of-order (e.g., in the order they c [...]
-    "synchronous": { "index": 13, "kind": "parameter", "displayName": "Synchronous", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Sets whether synchronous processing should be strictly used. When enabled then  [...]
-    "timeout": { "index": 14, "kind": "parameter", "displayName": "Timeout", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": -1, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Sets a total timeout specified in milliseconds, when using parallel processing. If the Multic [...]
-    "warnDroppedMessage": { "index": 15, "kind": "parameter", "displayName": "Warn Dropped Message", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Flag to log a warning if no predicates match for an exchange." },
-    "lazyStartProducer": { "index": 16, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
-    "destinationUri": { "index": 17, "kind": "parameter", "displayName": "Destination Uri", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "The destination URI for exchanges that match." },
-    "expressionLanguage": { "index": 18, "kind": "parameter", "displayName": "Expression Language", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "simple", "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "The subscription predicate language." },
-    "predicate": { "index": 19, "kind": "parameter", "displayName": "Predicate", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "The subscription predicate." },
-    "predicateBean": { "index": 20, "kind": "parameter", "displayName": "Predicate Bean", "group": "control", "label": "control", "required": false, "type": "object", "javaType": "org.apache.camel.Predicate", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "A Predicate instance in the registry." },
-    "priority": { "index": 21, "kind": "parameter", "displayName": "Priority", "group": "control", "label": "control", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "The subscription priority." },
-    "subscriptionId": { "index": 22, "kind": "parameter", "displayName": "Subscription Id", "group": "control", "label": "control", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.DynamicRouterConfiguration", "configurationField": "configuration", "description": "The subscription ID; if unspecified, one will be assigned and returned." }
+    "channel": { "index": 0, "kind": "path", "displayName": "Channel", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Channel for the Dynamic Router. For example, if the Dynamic Router URI is dynamic-router:\/\/test, then the channel is test. Channels are a way of keeping routing participants, their rules, and exchanges logically separate from the participants [...]
+    "aggregationStrategy": { "index": 1, "kind": "parameter", "displayName": "Aggregation Strategy", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Refers to an AggregationStrategy to be used to assemble the replies fr [...]
+    "aggregationStrategyBean": { "index": 2, "kind": "parameter", "displayName": "Aggregation Strategy Bean", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "org.apache.camel.AggregationStrategy", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Refers to an AggregationStrategy to be us [...]
+    "aggregationStrategyMethodAllowNull": { "index": 3, "kind": "parameter", "displayName": "Aggregation Strategy Method Allow Null", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "If this option is fals [...]
+    "aggregationStrategyMethodName": { "index": 4, "kind": "parameter", "displayName": "Aggregation Strategy Method Name", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "You can use a POJO as the AggregationStrategy. T [...]
+    "cacheSize": { "index": 5, "kind": "parameter", "displayName": "Cache Size", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 100, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "When caching producer endpoints, this is the size of the cache. Default is 100." },
+    "executorService": { "index": 6, "kind": "parameter", "displayName": "Executor Service", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Refers to a custom Thread Pool to be used for parallel processing. Notice that [...]
+    "executorServiceBean": { "index": 7, "kind": "parameter", "displayName": "Executor Service Bean", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "java.util.concurrent.ExecutorService", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Refers to a custom Thread Pool to be used for par [...]
+    "ignoreInvalidEndpoints": { "index": 8, "kind": "parameter", "displayName": "Ignore Invalid Endpoints", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Ignore the invalid endpoint exception when attem [...]
+    "onPrepare": { "index": 9, "kind": "parameter", "displayName": "On Prepare", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Uses the Processor when preparing the org.apache.camel.Exchange to be sent. This can be us [...]
+    "onPrepareProcessor": { "index": 10, "kind": "parameter", "displayName": "On Prepare Processor", "group": "common", "label": "common", "required": false, "type": "object", "javaType": "org.apache.camel.Processor", "deprecated": false, "autowired": false, "secret": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Uses the Processor when preparing the org.apache.camel.Excha [...]
+    "parallelAggregate": { "index": 11, "kind": "parameter", "displayName": "Parallel Aggregate", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "If enabled then the aggregate method on AggregationStrateg [...]
+    "parallelProcessing": { "index": 12, "kind": "parameter", "displayName": "Parallel Processing", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "If enabled, then sending via multicast occurs concurrent [...]
+    "recipientMode": { "index": 13, "kind": "parameter", "displayName": "Recipient Mode", "group": "common", "label": "common", "required": false, "type": "string", "javaType": "java.lang.String", "enum": [ "firstMatch", "allMatch" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "firstMatch", "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Recipient mod [...]
+    "shareUnitOfWork": { "index": 14, "kind": "parameter", "displayName": "Share Unit Of Work", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Shares the org.apache.camel.spi.UnitOfWork with the parent a [...]
+    "stopOnException": { "index": 15, "kind": "parameter", "displayName": "Stop On Exception", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Will stop further processing if an exception or failure occur [...]
+    "streaming": { "index": 16, "kind": "parameter", "displayName": "Streaming", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "If enabled, then Camel will process replies out-of-order (e.g., in the orde [...]
+    "synchronous": { "index": 17, "kind": "parameter", "displayName": "Synchronous", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Sets whether synchronous processing should be strictly used. When enabl [...]
+    "timeout": { "index": 18, "kind": "parameter", "displayName": "Timeout", "group": "common", "label": "common", "required": false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": false, "secret": false, "defaultValue": -1, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Sets a total timeout specified in milliseconds, when using parallel processing. If th [...]
+    "warnDroppedMessage": { "index": 19, "kind": "parameter", "displayName": "Warn Dropped Message", "group": "common", "label": "common", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "configurationClass": "org.apache.camel.component.dynamicrouter.routing.DynamicRouterConfiguration", "configurationField": "configuration", "description": "Flag to log a warning if no predicates match for an exc [...]
+    "lazyStartProducer": { "index": 20, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produ [...]
   }
 }
diff --git a/components-starter/camel-dynamic-router-starter/src/main/docs/dynamic-router.json b/components-starter/camel-dynamic-router-starter/src/main/docs/dynamic-router.json
index a407eba7b21..8645a3c65b6 100644
--- a/components-starter/camel-dynamic-router-starter/src/main/docs/dynamic-router.json
+++ b/components-starter/camel-dynamic-router-starter/src/main/docs/dynamic-router.json
@@ -2,22 +2,58 @@
   "groups": [
     {
       "name": "camel.component.dynamic-router",
-      "type": "org.apache.camel.component.dynamicrouter.springboot.DynamicRouterComponentConfiguration",
-      "sourceType": "org.apache.camel.component.dynamicrouter.springboot.DynamicRouterComponentConfiguration"
+      "type": "org.apache.camel.component.dynamicrouter.routing.springboot.DynamicRouterComponentConfiguration",
+      "sourceType": "org.apache.camel.component.dynamicrouter.routing.springboot.DynamicRouterComponentConfiguration"
+    },
+    {
+      "name": "camel.component.dynamic-router-control",
+      "type": "org.apache.camel.component.dynamicrouter.control.springboot.DynamicRouterControlComponentConfiguration",
+      "sourceType": "org.apache.camel.component.dynamicrouter.control.springboot.DynamicRouterControlComponentConfiguration"
+    },
+    {
+      "name": "camel.component.dynamic-router-control.customizer",
+      "type": "org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon$CustomizerProperties",
+      "sourceType": "org.apache.camel.component.dynamicrouter.control.springboot.DynamicRouterControlComponentConfiguration",
+      "sourceMethod": "getCustomizer()"
     },
     {
       "name": "camel.component.dynamic-router.customizer",
       "type": "org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon$CustomizerProperties",
-      "sourceType": "org.apache.camel.component.dynamicrouter.springboot.DynamicRouterComponentConfiguration",
+      "sourceType": "org.apache.camel.component.dynamicrouter.routing.springboot.DynamicRouterComponentConfiguration",
       "sourceMethod": "getCustomizer()"
     }
   ],
   "properties": [
+    {
+      "name": "camel.component.dynamic-router-control.autowired-enabled",
+      "type": "java.lang.Boolean",
+      "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc.",
+      "sourceType": "org.apache.camel.component.dynamicrouter.control.springboot.DynamicRouterControlComponentConfiguration",
+      "defaultValue": true
+    },
+    {
+      "name": "camel.component.dynamic-router-control.customizer.enabled",
+      "type": "java.lang.Boolean",
+      "sourceType": "org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon$CustomizerProperties"
+    },
+    {
+      "name": "camel.component.dynamic-router-control.enabled",
+      "type": "java.lang.Boolean",
+      "description": "Whether to enable auto configuration of the dynamic-router-control component. This is enabled by default.",
+      "sourceType": "org.apache.camel.component.dynamicrouter.control.springboot.DynamicRouterControlComponentConfiguration"
+    },
+    {
+      "name": "camel.component.dynamic-router-control.lazy-start-producer",
+      "type": "java.lang.Boolean",
+      "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the [...]
+      "sourceType": "org.apache.camel.component.dynamicrouter.control.springboot.DynamicRouterControlComponentConfiguration",
+      "defaultValue": false
+    },
     {
       "name": "camel.component.dynamic-router.autowired-enabled",
       "type": "java.lang.Boolean",
       "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc.",
-      "sourceType": "org.apache.camel.component.dynamicrouter.springboot.DynamicRouterComponentConfiguration",
+      "sourceType": "org.apache.camel.component.dynamicrouter.routing.springboot.DynamicRouterComponentConfiguration",
       "defaultValue": true
     },
     {
@@ -29,13 +65,13 @@
       "name": "camel.component.dynamic-router.enabled",
       "type": "java.lang.Boolean",
       "description": "Whether to enable auto configuration of the dynamic-router component. This is enabled by default.",
-      "sourceType": "org.apache.camel.component.dynamicrouter.springboot.DynamicRouterComponentConfiguration"
+      "sourceType": "org.apache.camel.component.dynamicrouter.routing.springboot.DynamicRouterComponentConfiguration"
     },
     {
       "name": "camel.component.dynamic-router.lazy-start-producer",
       "type": "java.lang.Boolean",
       "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the [...]
-      "sourceType": "org.apache.camel.component.dynamicrouter.springboot.DynamicRouterComponentConfiguration",
+      "sourceType": "org.apache.camel.component.dynamicrouter.routing.springboot.DynamicRouterComponentConfiguration",
       "defaultValue": false
     }
   ],
diff --git a/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentAutoConfiguration.java b/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/control/springboot/DynamicRouterControlComponentAutoConfiguration.java
similarity index 82%
copy from components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentAutoConfiguration.java
copy to components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/control/springboot/DynamicRouterControlComponentAutoConfiguration.java
index 9e28d67f6f9..4eb669e0bdf 100644
--- a/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentAutoConfiguration.java
+++ b/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/control/springboot/DynamicRouterControlComponentAutoConfiguration.java
@@ -14,11 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.dynamicrouter.springboot;
+package org.apache.camel.component.dynamicrouter.control.springboot;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Component;
-import org.apache.camel.component.dynamicrouter.DynamicRouterComponent;
+import org.apache.camel.component.dynamicrouter.control.DynamicRouterControlComponent;
 import org.apache.camel.spi.ComponentCustomizer;
 import org.apache.camel.spring.boot.CamelAutoConfiguration;
 import org.apache.camel.spring.boot.ComponentConfigurationProperties;
@@ -40,25 +40,25 @@ import org.springframework.context.annotation.Lazy;
  */
 @Configuration(proxyBeanMethods = false)
 @Conditional(ConditionalOnCamelContextAndAutoConfigurationBeans.class)
-@EnableConfigurationProperties({ComponentConfigurationProperties.class,DynamicRouterComponentConfiguration.class})
-@ConditionalOnHierarchicalProperties({"camel.component", "camel.component.dynamic-router"})
+@EnableConfigurationProperties({ComponentConfigurationProperties.class,DynamicRouterControlComponentConfiguration.class})
+@ConditionalOnHierarchicalProperties({"camel.component", "camel.component.dynamic-router-control"})
 @AutoConfigureAfter(CamelAutoConfiguration.class)
-public class DynamicRouterComponentAutoConfiguration {
+public class DynamicRouterControlComponentAutoConfiguration {
 
     @Autowired
     private ApplicationContext applicationContext;
     private final CamelContext camelContext;
     @Autowired
-    private DynamicRouterComponentConfiguration configuration;
+    private DynamicRouterControlComponentConfiguration configuration;
 
-    public DynamicRouterComponentAutoConfiguration(
+    public DynamicRouterControlComponentAutoConfiguration(
             org.apache.camel.CamelContext camelContext) {
         this.camelContext = camelContext;
     }
 
     @Lazy
     @Bean
-    public ComponentCustomizer configureDynamicRouterComponent() {
+    public ComponentCustomizer configureDynamicRouterControlComponent() {
         return new ComponentCustomizer() {
             @Override
             public void configure(String name, Component target) {
@@ -69,8 +69,8 @@ public class DynamicRouterComponentAutoConfiguration {
                 return HierarchicalPropertiesEvaluator.evaluate(
                         applicationContext,
                         "camel.component.customizer",
-                        "camel.component.dynamic-router.customizer")
-                    && target instanceof DynamicRouterComponent;
+                        "camel.component.dynamic-router-control.customizer")
+                    && target instanceof DynamicRouterControlComponent;
             }
         };
     }
diff --git a/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentConfiguration.java b/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/control/springboot/DynamicRouterControlComponentConfiguration.java
similarity index 88%
copy from components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentConfiguration.java
copy to components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/control/springboot/DynamicRouterControlComponentConfiguration.java
index b1c1bed9571..4a118614112 100644
--- a/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentConfiguration.java
+++ b/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/control/springboot/DynamicRouterControlComponentConfiguration.java
@@ -14,25 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.dynamicrouter.springboot;
+package org.apache.camel.component.dynamicrouter.control.springboot;
 
 import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
 /**
- * The Dynamic Router component routes exchanges to recipients, and the
- * recipients (and their rules) may change at runtime.
+ * The Dynamic Router control endpoint for operations that allow routing
+ * participants to subscribe or unsubscribe to participate in dynamic message
+ * routing.
  * 
  * Generated by camel-package-maven-plugin - do not edit this file!
  */
-@ConfigurationProperties(prefix = "camel.component.dynamic-router")
-public class DynamicRouterComponentConfiguration
+@ConfigurationProperties(prefix = "camel.component.dynamic-router-control")
+public class DynamicRouterControlComponentConfiguration
         extends
             ComponentConfigurationPropertiesCommon {
 
     /**
-     * Whether to enable auto configuration of the dynamic-router component.
-     * This is enabled by default.
+     * Whether to enable auto configuration of the dynamic-router-control
+     * component. This is enabled by default.
      */
     private Boolean enabled;
     /**
diff --git a/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentAutoConfiguration.java b/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/routing/springboot/DynamicRouterComponentAutoConfiguration.java
similarity index 95%
rename from components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentAutoConfiguration.java
rename to components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/routing/springboot/DynamicRouterComponentAutoConfiguration.java
index 9e28d67f6f9..9e25cf640b8 100644
--- a/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentAutoConfiguration.java
+++ b/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/routing/springboot/DynamicRouterComponentAutoConfiguration.java
@@ -14,11 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.dynamicrouter.springboot;
+package org.apache.camel.component.dynamicrouter.routing.springboot;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Component;
-import org.apache.camel.component.dynamicrouter.DynamicRouterComponent;
+import org.apache.camel.component.dynamicrouter.routing.DynamicRouterComponent;
 import org.apache.camel.spi.ComponentCustomizer;
 import org.apache.camel.spring.boot.CamelAutoConfiguration;
 import org.apache.camel.spring.boot.ComponentConfigurationProperties;
diff --git a/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentConfiguration.java b/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/routing/springboot/DynamicRouterComponentConfiguration.java
similarity index 97%
rename from components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentConfiguration.java
rename to components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/routing/springboot/DynamicRouterComponentConfiguration.java
index b1c1bed9571..76aad61bc99 100644
--- a/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/springboot/DynamicRouterComponentConfiguration.java
+++ b/components-starter/camel-dynamic-router-starter/src/main/java/org/apache/camel/component/dynamicrouter/routing/springboot/DynamicRouterComponentConfiguration.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.component.dynamicrouter.springboot;
+package org.apache.camel.component.dynamicrouter.routing.springboot;
 
 import org.apache.camel.spring.boot.ComponentConfigurationPropertiesCommon;
 import org.springframework.boot.context.properties.ConfigurationProperties;
diff --git a/components-starter/camel-dynamic-router-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/components-starter/camel-dynamic-router-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index e62e2d1b9c2..e9c40eed33a 100644
--- a/components-starter/camel-dynamic-router-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/components-starter/camel-dynamic-router-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -15,4 +15,5 @@
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
 
-org.apache.camel.component.dynamicrouter.springboot.DynamicRouterComponentAutoConfiguration
\ No newline at end of file
+org.apache.camel.component.dynamicrouter.routing.springboot.DynamicRouterComponentAutoConfiguration
+org.apache.camel.component.dynamicrouter.control.springboot.DynamicRouterControlComponentAutoConfiguration