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


The following commit(s) were added to refs/heads/main by this push:
     new b9960f5076f CAMEL-19478: Add synchronous option to relevant EIPs
b9960f5076f is described below

commit b9960f5076fa7cb8949c0ce418e61f1a8f2a6176
Author: Claus Ibsen <[email protected]>
AuthorDate: Wed Jun 21 10:48:53 2023 +0200

    CAMEL-19478: Add synchronous option to relevant EIPs
---
 .../org/apache/camel/catalog/models/multicast.json |  23 +++--
 .../apache/camel/catalog/models/recipientList.json |  25 ++---
 .../org/apache/camel/catalog/models/split.json     |  23 +++--
 .../apache/camel/catalog/schemas/camel-spring.xsd  |  42 +++++++-
 .../docs/modules/eips/pages/multicast-eip.adoc     |   7 ++
 .../docs/modules/eips/pages/recipientList-eip.adoc |   7 ++
 .../main/docs/modules/eips/pages/split-eip.adoc    | 115 ++++++++++++++++-----
 .../org/apache/camel/model/multicast.json          |  23 +++--
 .../org/apache/camel/model/recipientList.json      |  25 ++---
 .../resources/org/apache/camel/model/split.json    |  23 +++--
 .../apache/camel/model/MulticastDefinition.java    |  92 +++++++++++++++++
 .../camel/model/RecipientListDefinition.java       |  96 ++++++++++++++++-
 .../org/apache/camel/model/SplitDefinition.java    |  54 ++++++++++
 .../apache/camel/processor/MulticastProcessor.java |  34 ++++++
 .../org/apache/camel/processor/RecipientList.java  |  10 ++
 .../org/apache/camel/reifier/MulticastReifier.java |   5 +-
 .../apache/camel/reifier/RecipientListReifier.java |   2 +
 .../org/apache/camel/reifier/SplitReifier.java     |   2 +
 .../MulticastParallelSynchronousTest.java          |  74 +++++++++++++
 .../RecipientListParallelSynchronousTest.java      |  77 ++++++++++++++
 .../processor/SplitParallelSynchronousTest.java    |  68 ++++++++++++
 .../java/org/apache/camel/xml/in/ModelParser.java  |   3 +
 .../java/org/apache/camel/xml/out/ModelWriter.java |   3 +
 .../org/apache/camel/yaml/out/ModelWriter.java     |   3 +
 .../dsl/yaml/deserializers/ModelDeserializers.java |  18 ++++
 .../generated/resources/schema/camel-yaml-dsl.json |   9 ++
 .../generated/resources/schema/camelYamlDsl.json   |   9 ++
 27 files changed, 773 insertions(+), 99 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/multicast.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/multicast.json
index cc0dadf2258..5e4a32e3858 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/multicast.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/multicast.json
@@ -16,16 +16,17 @@
     "aggregationStrategyMethodName": { "index": 1, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Name", "label": "advanced", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "This 
option can be used to explicit declare the method name to use, when using POJOs 
as the AggregationStrategy." },
     "aggregationStrategyMethodAllowNull": { "index": 2, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Allow Null", "label": "advanced", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "If this option is false then the aggregate method is not 
used if there was no data to enrich. If this option is true then null values is 
used as the oldExchange (when no [...]
     "parallelAggregate": { "index": 3, "kind": "attribute", "displayName": 
"Parallel Aggregate", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
the aggregate method on AggregationStrategy can be called concurrently. Notice 
that this would require the implementation of AggregationStrategy to be 
implemented as thread-safe. By default  [...]
-    "parallelProcessing": { "index": 4, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then sending messages to the 
multicasts occurs concurrently. Note the caller thread will still wait until 
all messages has been fully processed, before it continues. Its only the 
sending and processing the replies  [...]
-    "streaming": { "index": 5, "kind": "attribute", "displayName": 
"Streaming", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then Camel will process 
replies out-of-order, eg in the order they come back. If disabled, Camel will 
process replies in the same order as defined by the multicast." },
-    "stopOnException": { "index": 6, "kind": "attribute", "displayName": "Stop 
On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed  [...]
-    "timeout": { "index": 7, "kind": "attribute", "displayName": "Timeout", 
"label": "advanced", "required": false, "type": "duration", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "0", "description": "Sets a total timeout specified in millis, 
when using parallel processing. If the Multicast hasn't been able to send and 
process all replies within the given timeframe, then the timeout triggers and 
the Multicast breaks out and co [...]
-    "executorService": { "index": 8, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "Refers to a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatic implied, and you do not have to enable that 
option as well." },
-    "onPrepare": { "index": 9, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be send. This can be used to deep-clone messages 
that should be send, or any custom logic needed before the exchange is send." },
-    "shareUnitOfWork": { "index": 10, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Multicast will by default not share unit of work between the parent exchange 
and each multicasted exchange. This means [...]
-    "outputs": { "index": 11, "kind": "element", "displayName": "Outputs", 
"required": true, "type": "array", "javaType": "java.util.List", "oneOf": [ 
"aggregate", "bean", "choice", "circuitBreaker", "claimCheck", "convertBodyTo", 
"delay", "doCatch", "doFinally", "doTry", "dynamicRouter", "enrich", "filter", 
"idempotentConsumer", "intercept", "interceptFrom", "interceptSendToEndpoint", 
"kamelet", "loadBalance", "log", "loop", "marshal", "multicast", 
"onCompletion", "onException", "onFall [...]
-    "disabled": { "index": 12, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
-    "id": { "index": 13, "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": { "index": 14, "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" }
+    "parallelProcessing": { "index": 4, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then sending messages to the 
multicasts occurs concurrently. Note the caller thread will still wait until 
all messages has been fully processed, before it continues. Its only the 
sending and processing the replies  [...]
+    "synchronous": { "index": 5, "kind": "attribute", "displayName": 
"Synchronous", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Sets whether synchronous processing 
should be strictly used. When enabled then the same thread is used to continue 
routing after the multicast is complete, even if parallel processing is 
enabled." },
+    "streaming": { "index": 6, "kind": "attribute", "displayName": 
"Streaming", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then Camel will process 
replies out-of-order, eg in the order they come back. If disabled, Camel will 
process replies in the same order as defined by the multicast." },
+    "stopOnException": { "index": 7, "kind": "attribute", "displayName": "Stop 
On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed  [...]
+    "timeout": { "index": 8, "kind": "attribute", "displayName": "Timeout", 
"label": "advanced", "required": false, "type": "duration", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "0", "description": "Sets a total timeout specified in millis, 
when using parallel processing. If the Multicast hasn't been able to send and 
process all replies within the given timeframe, then the timeout triggers and 
the Multicast breaks out and co [...]
+    "executorService": { "index": 9, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "Refers to a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatic implied, and you do not have to enable that 
option as well." },
+    "onPrepare": { "index": 10, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be send. This can be used to deep-clone messages 
that should be send, or any custom logic needed before the exchange is send." },
+    "shareUnitOfWork": { "index": 11, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Multicast will by default not share unit of work between the parent exchange 
and each multicasted exchange. This means [...]
+    "outputs": { "index": 12, "kind": "element", "displayName": "Outputs", 
"required": true, "type": "array", "javaType": "java.util.List", "oneOf": [ 
"aggregate", "bean", "choice", "circuitBreaker", "claimCheck", "convertBodyTo", 
"delay", "doCatch", "doFinally", "doTry", "dynamicRouter", "enrich", "filter", 
"idempotentConsumer", "intercept", "interceptFrom", "interceptSendToEndpoint", 
"kamelet", "loadBalance", "log", "loop", "marshal", "multicast", 
"onCompletion", "onException", "onFall [...]
+    "disabled": { "index": 13, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
+    "id": { "index": 14, "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": { "index": 15, "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/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/recipientList.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/recipientList.json
index 219aca1dcb1..04dad8cfa13 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/recipientList.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/recipientList.json
@@ -18,17 +18,18 @@
     "aggregationStrategyMethodName": { "index": 3, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Name", "label": "advanced", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "This 
option can be used to explicit declare the method name to use, when using POJOs 
as the AggregationStrategy." },
     "aggregationStrategyMethodAllowNull": { "index": 4, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Allow Null", "label": "advanced", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "If this option is false then the aggregate method is not 
used if there was no data to enrich. If this option is true then null values is 
used as the oldExchange (when no [...]
     "parallelAggregate": { "index": 5, "kind": "attribute", "displayName": 
"Parallel Aggregate", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
the aggregate method on AggregationStrategy can be called concurrently. Notice 
that this would require the implementation of AggregationStrategy to be 
implemented as thread-safe. By default  [...]
-    "parallelProcessing": { "index": 6, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then sending messages to the 
recipients occurs concurrently. Note the caller thread will still wait until 
all messages has been fully processed, before it continues. Its only the 
sending and processing the replies  [...]
-    "timeout": { "index": 7, "kind": "attribute", "displayName": "Timeout", 
"required": false, "type": "duration", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": "0", 
"description": "Sets a total timeout specified in millis, when using parallel 
processing. If the Recipient List hasn't been able to send and process all 
replies within the given timeframe, then the timeout triggers and the Recipient 
List breaks out and continues. No [...]
-    "executorService": { "index": 8, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatic implied, and you do not have to enable that 
option as well." },
-    "stopOnException": { "index": 9, "kind": "attribute", "displayName": "Stop 
On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed  [...]
-    "ignoreInvalidEndpoints": { "index": 10, "kind": "attribute", 
"displayName": "Ignore Invalid Endpoints", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Ignore the invalidate endpoint exception when try to create a producer with 
that endpoint" },
-    "streaming": { "index": 11, "kind": "attribute", "displayName": 
"Streaming", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "If enabled then Camel 
will process replies out-of-order, eg in the order they come back. If disabled, 
Camel will process replies in the same order as defined by the recipient list." 
},
-    "onPrepare": { "index": 12, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be used send. This can be used to deep-clone 
messages that should be send, or any custom logic needed before the exchange is 
send." },
-    "cacheSize": { "index": 13, "kind": "attribute", "displayName": "Cache 
Size", "label": "advanced", "required": false, "type": "integer", "javaType": 
"java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, 
"description": "Sets the maximum size used by the 
org.apache.camel.spi.ProducerCache which is used to cache and reuse producers 
when using this recipient list, when uris are reused. Beware that when using 
dynamic endpoints then it affects how well the cache ca [...]
-    "shareUnitOfWork": { "index": 14, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Recipient List will by default not share unit of work between the parent 
exchange and each recipient exchange. This me [...]
-    "disabled": { "index": 15, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
-    "id": { "index": 16, "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": { "index": 17, "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" }
+    "parallelProcessing": { "index": 6, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then sending messages to the 
recipients occurs concurrently. Note the caller thread will still wait until 
all messages has been fully processed, before it continues. Its only the 
sending and processing the replies  [...]
+    "synchronous": { "index": 7, "kind": "attribute", "displayName": 
"Synchronous", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Sets whether synchronous processing 
should be strictly used. When enabled then the same thread is used to continue 
routing after the recipient list is complete, even if parallel processing is 
enabled." },
+    "timeout": { "index": 8, "kind": "attribute", "displayName": "Timeout", 
"required": false, "type": "duration", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": "0", 
"description": "Sets a total timeout specified in millis, when using parallel 
processing. If the Recipient List hasn't been able to send and process all 
replies within the given timeframe, then the timeout triggers and the Recipient 
List breaks out and continues. No [...]
+    "executorService": { "index": 9, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatic implied, and you do not have to enable that 
option as well." },
+    "stopOnException": { "index": 10, "kind": "attribute", "displayName": 
"Stop On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed [...]
+    "ignoreInvalidEndpoints": { "index": 11, "kind": "attribute", 
"displayName": "Ignore Invalid Endpoints", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Ignore the invalidate endpoint exception when try to create a producer with 
that endpoint" },
+    "streaming": { "index": 12, "kind": "attribute", "displayName": 
"Streaming", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "If enabled then Camel 
will process replies out-of-order, eg in the order they come back. If disabled, 
Camel will process replies in the same order as defined by the recipient list." 
},
+    "onPrepare": { "index": 13, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be used send. This can be used to deep-clone 
messages that should be send, or any custom logic needed before the exchange is 
send." },
+    "cacheSize": { "index": 14, "kind": "attribute", "displayName": "Cache 
Size", "label": "advanced", "required": false, "type": "integer", "javaType": 
"java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, 
"description": "Sets the maximum size used by the 
org.apache.camel.spi.ProducerCache which is used to cache and reuse producers 
when using this recipient list, when uris are reused. Beware that when using 
dynamic endpoints then it affects how well the cache ca [...]
+    "shareUnitOfWork": { "index": 15, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Recipient List will by default not share unit of work between the parent 
exchange and each recipient exchange. This me [...]
+    "disabled": { "index": 16, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
+    "id": { "index": 17, "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": { "index": 18, "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/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/split.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/split.json
index f7a11b19030..a2badb93d05 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/split.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/split.json
@@ -18,16 +18,17 @@
     "aggregationStrategyMethodName": { "index": 3, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Name", "label": "advanced", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "This 
option can be used to explicit declare the method name to use, when using POJOs 
as the AggregationStrategy." },
     "aggregationStrategyMethodAllowNull": { "index": 4, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Allow Null", "label": "advanced", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "If this option is false then the aggregate method is not 
used if there was no data to enrich. If this option is true then null values is 
used as the oldExchange (when no [...]
     "parallelAggregate": { "index": 5, "kind": "attribute", "displayName": 
"Parallel Aggregate", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
the aggregate method on AggregationStrategy can be called concurrently. Notice 
that this would require the implementation of AggregationStrategy to be 
implemented as thread-safe. By default  [...]
-    "parallelProcessing": { "index": 6, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then processing each split 
messages occurs concurrently. Note the caller thread will still wait until all 
messages has been fully processed, before it continues. It's only processing 
the sub messages from the split [...]
-    "streaming": { "index": 7, "kind": "attribute", "displayName": 
"Streaming", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "When in streaming mode, then the 
splitter splits the original message on-demand, and each split message is 
processed one by one. This reduces memory usage as the splitter do not split 
all the messages first, but then we do not know the total si [...]
-    "stopOnException": { "index": 8, "kind": "attribute", "displayName": "Stop 
On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed  [...]
-    "timeout": { "index": 9, "kind": "attribute", "displayName": "Timeout", 
"label": "advanced", "required": false, "type": "duration", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "0", "description": "Sets a total timeout specified in millis, 
when using parallel processing. If the Splitter hasn't been able to split and 
process all the sub messages within the given timeframe, then the timeout 
triggers and the Splitter breaks ou [...]
-    "executorService": { "index": 10, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatically implied, and you do not have to enable 
that option as well." },
-    "onPrepare": { "index": 11, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be sent. This can be used to deep-clone messages 
that should be sent, or any custom logic needed before the exchange is sent." },
-    "shareUnitOfWork": { "index": 12, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Splitter will by default not share unit of work between the parent exchange and 
each split exchange. This means each s [...]
-    "outputs": { "index": 13, "kind": "element", "displayName": "Outputs", 
"required": true, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.ProcessorDefinition<java.lang.Object>>", 
"oneOf": [ "aggregate", "bean", "choice", "circuitBreaker", "claimCheck", 
"convertBodyTo", "delay", "doCatch", "doFinally", "doTry", "dynamicRouter", 
"enrich", "filter", "idempotentConsumer", "intercept", "interceptFrom", 
"interceptSendToEndpoint", "kamelet", "loadBalance", "log", "loop",  [...]
-    "disabled": { "index": 14, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
-    "id": { "index": 15, "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": { "index": 16, "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" }
+    "parallelProcessing": { "index": 6, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then processing each split 
messages occurs concurrently. Note the caller thread will still wait until all 
messages has been fully processed, before it continues. It's only processing 
the sub messages from the split [...]
+    "synchronous": { "index": 7, "kind": "attribute", "displayName": 
"Synchronous", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Sets whether synchronous processing 
should be strictly used. When enabled then the same thread is used to continue 
routing after the split is complete, even if parallel processing is enabled." },
+    "streaming": { "index": 8, "kind": "attribute", "displayName": 
"Streaming", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "When in streaming mode, then the 
splitter splits the original message on-demand, and each split message is 
processed one by one. This reduces memory usage as the splitter do not split 
all the messages first, but then we do not know the total si [...]
+    "stopOnException": { "index": 9, "kind": "attribute", "displayName": "Stop 
On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed  [...]
+    "timeout": { "index": 10, "kind": "attribute", "displayName": "Timeout", 
"label": "advanced", "required": false, "type": "duration", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "0", "description": "Sets a total timeout specified in millis, 
when using parallel processing. If the Splitter hasn't been able to split and 
process all the sub messages within the given timeframe, then the timeout 
triggers and the Splitter breaks o [...]
+    "executorService": { "index": 11, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatically implied, and you do not have to enable 
that option as well." },
+    "onPrepare": { "index": 12, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be sent. This can be used to deep-clone messages 
that should be sent, or any custom logic needed before the exchange is sent." },
+    "shareUnitOfWork": { "index": 13, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Splitter will by default not share unit of work between the parent exchange and 
each split exchange. This means each s [...]
+    "outputs": { "index": 14, "kind": "element", "displayName": "Outputs", 
"required": true, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.ProcessorDefinition<java.lang.Object>>", 
"oneOf": [ "aggregate", "bean", "choice", "circuitBreaker", "claimCheck", 
"convertBodyTo", "delay", "doCatch", "doFinally", "doTry", "dynamicRouter", 
"enrich", "filter", "idempotentConsumer", "intercept", "interceptFrom", 
"interceptSendToEndpoint", "kamelet", "loadBalance", "log", "loop",  [...]
+    "disabled": { "index": 15, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
+    "id": { "index": 16, "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": { "index": 17, "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/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
index d4d47558890..4616bc9c742 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd
@@ -10052,7 +10052,19 @@ when the AggregationStrategy is implemented as 
thread-safe. Default value: false
 <![CDATA[
 If enabled then sending messages to the multicasts occurs concurrently. Note 
the caller thread will still wait until all
 messages has been fully processed, before it continues. Its only the sending 
and processing the replies from the
-multicasts which happens concurrently. Default value: false
+multicasts which happens concurrently. When parallel processing is enabled, 
then the Camel routing engin will continue
+processing using last used thread from the parallel thread pool. However, if 
you want to use the original thread that
+called the multicast, then make sure to enable the synchronous option as well. 
Default value: false
+]]>
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="synchronous" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en">
+<![CDATA[
+Sets whether synchronous processing should be strictly used. When enabled then 
the same thread is used to continue
+routing after the multicast is complete, even if parallel processing is 
enabled. Default value: false
 ]]>
             </xs:documentation>
           </xs:annotation>
@@ -10989,7 +11001,19 @@ when the AggregationStrategy is implemented as 
thread-safe. Default value: false
 <![CDATA[
 If enabled then sending messages to the recipients occurs concurrently. Note 
the caller thread will still wait until all
 messages has been fully processed, before it continues. Its only the sending 
and processing the replies from the
-recipients which happens concurrently. Default value: false
+recipients which happens concurrently. When parallel processing is enabled, 
then the Camel routing engin will continue
+processing using last used thread from the parallel thread pool. However, if 
you want to use the original thread that
+called the recipient list, then make sure to enable the synchronous option as 
well. Default value: false
+]]>
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="synchronous" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en">
+<![CDATA[
+Sets whether synchronous processing should be strictly used. When enabled then 
the same thread is used to continue
+routing after the recipient list is complete, even if parallel processing is 
enabled. Default value: false
 ]]>
             </xs:documentation>
           </xs:annotation>
@@ -12473,7 +12497,19 @@ when the AggregationStrategy is implemented as 
thread-safe. Default value: false
 <![CDATA[
 If enabled then processing each split messages occurs concurrently. Note the 
caller thread will still wait until all
 messages has been fully processed, before it continues. It's only processing 
the sub messages from the splitter which
-happens concurrently. Default value: false
+happens concurrently. When parallel processing is enabled, then the Camel 
routing engin will continue processing using
+last used thread from the parallel thread pool. However, if you want to use 
the original thread that called the
+splitter, then make sure to enable the synchronous option as well. Default 
value: false
+]]>
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="synchronous" type="xs:string">
+          <xs:annotation>
+            <xs:documentation xml:lang="en">
+<![CDATA[
+Sets whether synchronous processing should be strictly used. When enabled then 
the same thread is used to continue
+routing after the split is complete, even if parallel processing is enabled. 
Default value: false
 ]]>
             </xs:documentation>
           </xs:annotation>
diff --git 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
index 81f8c639ecf..992cde66657 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
@@ -105,6 +105,13 @@ XML::
 ----
 ====
 
+[IMPORTANT]
+====
+When parallel processing is enabled, then the Camel routing engin will 
continue processing
+using last used thread from the parallel thread pool. However, if you want to 
use the original
+thread that called the multicast, then make sure to enable the synchronous 
option as well.
+====
+
 === Ending a Multicast block
 
 You may want to continue routing the exchange after the Multicast EIP. 
diff --git 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/recipientList-eip.adoc
 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/recipientList-eip.adoc
index 04ebed37e68..74899da126f 100644
--- 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/recipientList-eip.adoc
+++ 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/recipientList-eip.adoc
@@ -178,6 +178,13 @@ XML::
 ----
 ====
 
+[IMPORTANT]
+====
+When parallel processing is enabled, then the Camel routing engin will 
continue processing
+using last used thread from the parallel thread pool. However, if you want to 
use the original
+thread that called the recipient list, then make sure to enable the 
synchronous option as well.
+====
+
 ==== Using custom thread pool
 
 A thread pool is only used for `parallelProcessing`. You supply your own 
custom thread pool via the `ExecutorServiceStrategy` (see Camel's Threading 
Model),
diff --git 
a/core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc 
b/core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc
index 081c2db3e18..2c02c1560c8 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/split-eip.adoc
@@ -91,6 +91,10 @@ so you could use any of the supported languages such as
 xref:components:languages:simple-language.adoc[Simple], 
xref:components:languages:xpath-language.adoc[XPath],
 xref:components:languages:jsonpath-language.adoc[JSonPath], 
xref:components:languages:groovy-language.adoc[Groovy] to perform the split.
 
+[tabs]
+====
+Java::
++
 [source,java]
 ----
 from("activemq:my.queue")
@@ -98,8 +102,8 @@ from("activemq:my.queue")
         .to("file:some/directory")
 ----
 
-And in XML:
-
+XML::
++
 [source,xml]
 ----
 <route>
@@ -110,6 +114,7 @@ And in XML:
     </split>
 </route>
 ----
+====
 
 === Splitting the message body
 
@@ -131,6 +136,10 @@ the Split EIP will be split into a single message (the 
same).
 
 To use this with the splitter you should _just_ use body as the expression:
 
+[tabs]
+====
+Java::
++
 [source,java]
 ----
 from("direct:splitUsingBody")
@@ -138,6 +147,8 @@ from("direct:splitUsingBody")
         .to("mock:result");
 ----
 
+XML::
++
 In XML you use xref:components:languages:simple-language.adoc[Simple] to refer 
to the message body:
 
 [source,xml]
@@ -150,6 +161,7 @@ In XML you use 
xref:components:languages:simple-language.adoc[Simple] to refer t
   </split>
 </route>
 ----
+====
 
 === Splitting with parallel processing
 
@@ -158,6 +170,10 @@ is processed by its own thread in parallel.
 
 The example below enabled parallel mode:
 
+[tabs]
+====
+Java::
++
 [source,java]
 ----
 from("direct:a")
@@ -167,8 +183,8 @@ from("direct:a")
     .to("direct:z");
 ----
 
-And in XML:
-
+XML::
++
 [source,xml]
 ----
 <route>
@@ -181,6 +197,14 @@ And in XML:
     </split>
 </route>
 ----
+====
+
+[IMPORTANT]
+====
+When parallel processing is enabled, then the Camel routing engin will 
continue processing
+using last used thread from the parallel thread pool. However, if you want to 
use the original
+thread that called the splitter, then make sure to enable the synchronous 
option as well.
+====
 
 === Ending a Split block
 
@@ -191,6 +215,10 @@ In the example above then sending to mock:result happens 
after the Spllit EIP ha
 In other words the message should finish splitting the entire message before 
the message
 continues.
 
+[tabs]
+====
+Java::
++
 [source,java]
 ----
 from("direct:a")
@@ -202,6 +230,8 @@ from("direct:a")
   .to("mock:result");
 ----
 
+XML::
++
 And in XML its intuitive as `</split>` marks the end of the block:
 
 [source,xml]
@@ -217,6 +247,7 @@ And in XML its intuitive as `</split>` marks the end of the 
block:
     <to uri="mock:result"/>
 </route>
 ----
+====
 
 === What is returned from Split EIP when its complete
 
@@ -231,6 +262,10 @@ as a single response exchange, that becomes the outgoing 
exchange after the Spli
 
 The example now aggregates with the `MyAggregationStrategy` class:
 
+[tabs]
+====
+Java::
++
 [source,java]
 ----
 from("direct:start")
@@ -242,6 +277,8 @@ from("direct:start")
   .to("mock:result");
 ----
 
+XML::
++
 And in XML we can refer to the FQN class name with `#class:` syntax as shown 
below:
 
 [source,xml]
@@ -257,6 +294,7 @@ And in XML we can refer to the FQN class name with 
`#class:` syntax as shown bel
     <to uri="mock:result"/>
 </route>
 ----
+====
 
 [NOTE]
 ====
@@ -277,6 +315,10 @@ The Split EIP operates in two modes when splitting:
 
 You can split in streaming mode as shown:
 
+[tabs]
+====
+Java::
++
 [source,java]
 ----
 from("direct:streaming")
@@ -284,8 +326,8 @@ from("direct:streaming")
     .to("activemq:my.parts");
 ----
 
-And in XML:
-
+XML::
++
 [source,xml]
 ----
 <route>
@@ -296,10 +338,15 @@ And in XML:
     </split>
 </route>
 ----
+====
 
 You can also supply a custom xref:components:languages:bean-language.adoc[Bean]
 to perform the splitting in streaming mode like this:
 
+[tabs]
+====
+Java::
++
 [source,java]
 ----
 from("direct:streaming")
@@ -307,8 +354,8 @@ from("direct:streaming")
     .to("activemq:my.parts")
 ----
 
-And in XML:
-
+XML::
++
 [source,xml]
 ----
 <route>
@@ -319,6 +366,7 @@ And in XML:
     </split>
 </route>
 ----
+====
 
 Then the custom bean could for example be implemented as follows:
 
@@ -394,15 +442,18 @@ Now to split this big file using 
xref:components:languages:xpath-language.adoc[X
 would cause the entire content to be loaded into memory. So instead we can use 
the
 xref:components:languages:tokenize-language.adoc[Tokenize] language to do this 
as follows:
 
+[tabs]
+====
+Java::
++
 [source,java]
 ----
 from("file:inbox")
   .split().tokenizeXML("order").streaming()
      .to("activemq:queue:order");
 ----
-
-In XML the route would be as follows:
-
+XML::
++
 [source,xml]
 ----
 <route>
@@ -413,6 +464,7 @@ In XML the route would be as follows:
   </split>
 </route>
 ----
+====
 
 This will split the file using the tag name of the child nodes (more precisely 
speaking, the local name of the element without its namespace prefix if any),
 which mean it will grab the content between the `<order>` and `</order>` tags 
(incl. the tags).
@@ -428,6 +480,19 @@ So for example a split message would be structured as 
follows:
 
 If you want to inherit namespaces from a root/parent tag, then you can do this 
as well by providing the name of the root/parent tag:
 
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("file:inbox")
+  .split().tokenizeXML("order", "orders").streaming()
+     .to("activemq:queue:order");
+----
+
+XML::
++
 [source,xml]
 ----
 <route>
@@ -438,15 +503,7 @@ If you want to inherit namespaces from a root/parent tag, 
then you can do this a
   </split>
 </route>
 ----
-
-And in Java DSL it is done like this:
-
-[source,java]
-----
-from("file:inbox")
-  .split().tokenizeXML("order", "orders").streaming()
-     .to("activemq:queue:order");
-----
+====
 
 You can set `inheritNamsepaceTagName` property to `*` to include the preceding 
context in each token (i.e., generating each token enclosed in its ancestor 
elements). It is noted that each token must share the same ancestor elements in 
this case.
 The above tokenizer works well on simple structures but has some inherent 
limitations in handling more complex XML structures.
@@ -550,6 +607,10 @@ can be used for grouping N parts together, for example to 
split big files into c
 
 Doing this is easy as the following example shows:
 
+[tabs]
+====
+Java::
++
 [source,java]
 ----
 from("file:inbox")
@@ -557,8 +618,8 @@ from("file:inbox")
      .to("activemq:queue:order");
 ----
 
-And in XML DSL:
-
+XML::
++
 [source,xml]
 ----
 <route>
@@ -569,6 +630,7 @@ And in XML DSL:
   </split>
 </route>
 ----
+====
 
 The `group` value must be a positive number dictating how many elements to 
combine together in a group.
 Each part will be combined using the token.
@@ -707,6 +769,10 @@ handle it. You can do this by specifying that it should 
stop in case of an
 exception occurred. This is done by the `stopOnException` option as
 shown below:
 
+[tabs]
+====
+Java::
++
 [source,java]
 ----
 from("direct:start")
@@ -717,8 +783,8 @@ from("direct:start")
     .to("direct:cheese");
 ----
 
-And using XML DSL you specify it as follows:
-
+XML::
++
 [source,xml]
 ----
 <route>
@@ -731,6 +797,7 @@ And using XML DSL you specify it as follows:
     <to uri="direct:cheese"/>
 </route>
 ----
+====
 
 In the example above, then `MyProcessor` is causing a failure and throws an 
exception.
 This means the Split EIP will stop after this, and not split anymore.
diff --git 
a/core/camel-core-model/src/generated/resources/org/apache/camel/model/multicast.json
 
b/core/camel-core-model/src/generated/resources/org/apache/camel/model/multicast.json
index cc0dadf2258..5e4a32e3858 100644
--- 
a/core/camel-core-model/src/generated/resources/org/apache/camel/model/multicast.json
+++ 
b/core/camel-core-model/src/generated/resources/org/apache/camel/model/multicast.json
@@ -16,16 +16,17 @@
     "aggregationStrategyMethodName": { "index": 1, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Name", "label": "advanced", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "This 
option can be used to explicit declare the method name to use, when using POJOs 
as the AggregationStrategy." },
     "aggregationStrategyMethodAllowNull": { "index": 2, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Allow Null", "label": "advanced", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "If this option is false then the aggregate method is not 
used if there was no data to enrich. If this option is true then null values is 
used as the oldExchange (when no [...]
     "parallelAggregate": { "index": 3, "kind": "attribute", "displayName": 
"Parallel Aggregate", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
the aggregate method on AggregationStrategy can be called concurrently. Notice 
that this would require the implementation of AggregationStrategy to be 
implemented as thread-safe. By default  [...]
-    "parallelProcessing": { "index": 4, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then sending messages to the 
multicasts occurs concurrently. Note the caller thread will still wait until 
all messages has been fully processed, before it continues. Its only the 
sending and processing the replies  [...]
-    "streaming": { "index": 5, "kind": "attribute", "displayName": 
"Streaming", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then Camel will process 
replies out-of-order, eg in the order they come back. If disabled, Camel will 
process replies in the same order as defined by the multicast." },
-    "stopOnException": { "index": 6, "kind": "attribute", "displayName": "Stop 
On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed  [...]
-    "timeout": { "index": 7, "kind": "attribute", "displayName": "Timeout", 
"label": "advanced", "required": false, "type": "duration", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "0", "description": "Sets a total timeout specified in millis, 
when using parallel processing. If the Multicast hasn't been able to send and 
process all replies within the given timeframe, then the timeout triggers and 
the Multicast breaks out and co [...]
-    "executorService": { "index": 8, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "Refers to a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatic implied, and you do not have to enable that 
option as well." },
-    "onPrepare": { "index": 9, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be send. This can be used to deep-clone messages 
that should be send, or any custom logic needed before the exchange is send." },
-    "shareUnitOfWork": { "index": 10, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Multicast will by default not share unit of work between the parent exchange 
and each multicasted exchange. This means [...]
-    "outputs": { "index": 11, "kind": "element", "displayName": "Outputs", 
"required": true, "type": "array", "javaType": "java.util.List", "oneOf": [ 
"aggregate", "bean", "choice", "circuitBreaker", "claimCheck", "convertBodyTo", 
"delay", "doCatch", "doFinally", "doTry", "dynamicRouter", "enrich", "filter", 
"idempotentConsumer", "intercept", "interceptFrom", "interceptSendToEndpoint", 
"kamelet", "loadBalance", "log", "loop", "marshal", "multicast", 
"onCompletion", "onException", "onFall [...]
-    "disabled": { "index": 12, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
-    "id": { "index": 13, "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": { "index": 14, "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" }
+    "parallelProcessing": { "index": 4, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then sending messages to the 
multicasts occurs concurrently. Note the caller thread will still wait until 
all messages has been fully processed, before it continues. Its only the 
sending and processing the replies  [...]
+    "synchronous": { "index": 5, "kind": "attribute", "displayName": 
"Synchronous", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Sets whether synchronous processing 
should be strictly used. When enabled then the same thread is used to continue 
routing after the multicast is complete, even if parallel processing is 
enabled." },
+    "streaming": { "index": 6, "kind": "attribute", "displayName": 
"Streaming", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then Camel will process 
replies out-of-order, eg in the order they come back. If disabled, Camel will 
process replies in the same order as defined by the multicast." },
+    "stopOnException": { "index": 7, "kind": "attribute", "displayName": "Stop 
On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed  [...]
+    "timeout": { "index": 8, "kind": "attribute", "displayName": "Timeout", 
"label": "advanced", "required": false, "type": "duration", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "0", "description": "Sets a total timeout specified in millis, 
when using parallel processing. If the Multicast hasn't been able to send and 
process all replies within the given timeframe, then the timeout triggers and 
the Multicast breaks out and co [...]
+    "executorService": { "index": 9, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "Refers to a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatic implied, and you do not have to enable that 
option as well." },
+    "onPrepare": { "index": 10, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be send. This can be used to deep-clone messages 
that should be send, or any custom logic needed before the exchange is send." },
+    "shareUnitOfWork": { "index": 11, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Multicast will by default not share unit of work between the parent exchange 
and each multicasted exchange. This means [...]
+    "outputs": { "index": 12, "kind": "element", "displayName": "Outputs", 
"required": true, "type": "array", "javaType": "java.util.List", "oneOf": [ 
"aggregate", "bean", "choice", "circuitBreaker", "claimCheck", "convertBodyTo", 
"delay", "doCatch", "doFinally", "doTry", "dynamicRouter", "enrich", "filter", 
"idempotentConsumer", "intercept", "interceptFrom", "interceptSendToEndpoint", 
"kamelet", "loadBalance", "log", "loop", "marshal", "multicast", 
"onCompletion", "onException", "onFall [...]
+    "disabled": { "index": 13, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
+    "id": { "index": 14, "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": { "index": 15, "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/generated/resources/org/apache/camel/model/recipientList.json
 
b/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json
index 219aca1dcb1..04dad8cfa13 100644
--- 
a/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json
+++ 
b/core/camel-core-model/src/generated/resources/org/apache/camel/model/recipientList.json
@@ -18,17 +18,18 @@
     "aggregationStrategyMethodName": { "index": 3, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Name", "label": "advanced", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "This 
option can be used to explicit declare the method name to use, when using POJOs 
as the AggregationStrategy." },
     "aggregationStrategyMethodAllowNull": { "index": 4, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Allow Null", "label": "advanced", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "If this option is false then the aggregate method is not 
used if there was no data to enrich. If this option is true then null values is 
used as the oldExchange (when no [...]
     "parallelAggregate": { "index": 5, "kind": "attribute", "displayName": 
"Parallel Aggregate", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
the aggregate method on AggregationStrategy can be called concurrently. Notice 
that this would require the implementation of AggregationStrategy to be 
implemented as thread-safe. By default  [...]
-    "parallelProcessing": { "index": 6, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then sending messages to the 
recipients occurs concurrently. Note the caller thread will still wait until 
all messages has been fully processed, before it continues. Its only the 
sending and processing the replies  [...]
-    "timeout": { "index": 7, "kind": "attribute", "displayName": "Timeout", 
"required": false, "type": "duration", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": "0", 
"description": "Sets a total timeout specified in millis, when using parallel 
processing. If the Recipient List hasn't been able to send and process all 
replies within the given timeframe, then the timeout triggers and the Recipient 
List breaks out and continues. No [...]
-    "executorService": { "index": 8, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatic implied, and you do not have to enable that 
option as well." },
-    "stopOnException": { "index": 9, "kind": "attribute", "displayName": "Stop 
On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed  [...]
-    "ignoreInvalidEndpoints": { "index": 10, "kind": "attribute", 
"displayName": "Ignore Invalid Endpoints", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Ignore the invalidate endpoint exception when try to create a producer with 
that endpoint" },
-    "streaming": { "index": 11, "kind": "attribute", "displayName": 
"Streaming", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "If enabled then Camel 
will process replies out-of-order, eg in the order they come back. If disabled, 
Camel will process replies in the same order as defined by the recipient list." 
},
-    "onPrepare": { "index": 12, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be used send. This can be used to deep-clone 
messages that should be send, or any custom logic needed before the exchange is 
send." },
-    "cacheSize": { "index": 13, "kind": "attribute", "displayName": "Cache 
Size", "label": "advanced", "required": false, "type": "integer", "javaType": 
"java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, 
"description": "Sets the maximum size used by the 
org.apache.camel.spi.ProducerCache which is used to cache and reuse producers 
when using this recipient list, when uris are reused. Beware that when using 
dynamic endpoints then it affects how well the cache ca [...]
-    "shareUnitOfWork": { "index": 14, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Recipient List will by default not share unit of work between the parent 
exchange and each recipient exchange. This me [...]
-    "disabled": { "index": 15, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
-    "id": { "index": 16, "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": { "index": 17, "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" }
+    "parallelProcessing": { "index": 6, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then sending messages to the 
recipients occurs concurrently. Note the caller thread will still wait until 
all messages has been fully processed, before it continues. Its only the 
sending and processing the replies  [...]
+    "synchronous": { "index": 7, "kind": "attribute", "displayName": 
"Synchronous", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Sets whether synchronous processing 
should be strictly used. When enabled then the same thread is used to continue 
routing after the recipient list is complete, even if parallel processing is 
enabled." },
+    "timeout": { "index": 8, "kind": "attribute", "displayName": "Timeout", 
"required": false, "type": "duration", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": "0", 
"description": "Sets a total timeout specified in millis, when using parallel 
processing. If the Recipient List hasn't been able to send and process all 
replies within the given timeframe, then the timeout triggers and the Recipient 
List breaks out and continues. No [...]
+    "executorService": { "index": 9, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatic implied, and you do not have to enable that 
option as well." },
+    "stopOnException": { "index": 10, "kind": "attribute", "displayName": 
"Stop On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed [...]
+    "ignoreInvalidEndpoints": { "index": 11, "kind": "attribute", 
"displayName": "Ignore Invalid Endpoints", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Ignore the invalidate endpoint exception when try to create a producer with 
that endpoint" },
+    "streaming": { "index": 12, "kind": "attribute", "displayName": 
"Streaming", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "If enabled then Camel 
will process replies out-of-order, eg in the order they come back. If disabled, 
Camel will process replies in the same order as defined by the recipient list." 
},
+    "onPrepare": { "index": 13, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be used send. This can be used to deep-clone 
messages that should be send, or any custom logic needed before the exchange is 
send." },
+    "cacheSize": { "index": 14, "kind": "attribute", "displayName": "Cache 
Size", "label": "advanced", "required": false, "type": "integer", "javaType": 
"java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, 
"description": "Sets the maximum size used by the 
org.apache.camel.spi.ProducerCache which is used to cache and reuse producers 
when using this recipient list, when uris are reused. Beware that when using 
dynamic endpoints then it affects how well the cache ca [...]
+    "shareUnitOfWork": { "index": 15, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Recipient List will by default not share unit of work between the parent 
exchange and each recipient exchange. This me [...]
+    "disabled": { "index": 16, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
+    "id": { "index": 17, "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": { "index": 18, "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/generated/resources/org/apache/camel/model/split.json
 
b/core/camel-core-model/src/generated/resources/org/apache/camel/model/split.json
index f7a11b19030..a2badb93d05 100644
--- 
a/core/camel-core-model/src/generated/resources/org/apache/camel/model/split.json
+++ 
b/core/camel-core-model/src/generated/resources/org/apache/camel/model/split.json
@@ -18,16 +18,17 @@
     "aggregationStrategyMethodName": { "index": 3, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Name", "label": "advanced", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": "This 
option can be used to explicit declare the method name to use, when using POJOs 
as the AggregationStrategy." },
     "aggregationStrategyMethodAllowNull": { "index": 4, "kind": "attribute", 
"displayName": "Aggregation Strategy Method Allow Null", "label": "advanced", 
"required": false, "type": "boolean", "javaType": "java.lang.Boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "If this option is false then the aggregate method is not 
used if there was no data to enrich. If this option is true then null values is 
used as the oldExchange (when no [...]
     "parallelAggregate": { "index": 5, "kind": "attribute", "displayName": 
"Parallel Aggregate", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "If enabled then 
the aggregate method on AggregationStrategy can be called concurrently. Notice 
that this would require the implementation of AggregationStrategy to be 
implemented as thread-safe. By default  [...]
-    "parallelProcessing": { "index": 6, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then processing each split 
messages occurs concurrently. Note the caller thread will still wait until all 
messages has been fully processed, before it continues. It's only processing 
the sub messages from the split [...]
-    "streaming": { "index": 7, "kind": "attribute", "displayName": 
"Streaming", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "When in streaming mode, then the 
splitter splits the original message on-demand, and each split message is 
processed one by one. This reduces memory usage as the splitter do not split 
all the messages first, but then we do not know the total si [...]
-    "stopOnException": { "index": 8, "kind": "attribute", "displayName": "Stop 
On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed  [...]
-    "timeout": { "index": 9, "kind": "attribute", "displayName": "Timeout", 
"label": "advanced", "required": false, "type": "duration", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "0", "description": "Sets a total timeout specified in millis, 
when using parallel processing. If the Splitter hasn't been able to split and 
process all the sub messages within the given timeframe, then the timeout 
triggers and the Splitter breaks ou [...]
-    "executorService": { "index": 10, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatically implied, and you do not have to enable 
that option as well." },
-    "onPrepare": { "index": 11, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be sent. This can be used to deep-clone messages 
that should be sent, or any custom logic needed before the exchange is sent." },
-    "shareUnitOfWork": { "index": 12, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Splitter will by default not share unit of work between the parent exchange and 
each split exchange. This means each s [...]
-    "outputs": { "index": 13, "kind": "element", "displayName": "Outputs", 
"required": true, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.ProcessorDefinition<java.lang.Object>>", 
"oneOf": [ "aggregate", "bean", "choice", "circuitBreaker", "claimCheck", 
"convertBodyTo", "delay", "doCatch", "doFinally", "doTry", "dynamicRouter", 
"enrich", "filter", "idempotentConsumer", "intercept", "interceptFrom", 
"interceptSendToEndpoint", "kamelet", "loadBalance", "log", "loop",  [...]
-    "disabled": { "index": 14, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
-    "id": { "index": 15, "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": { "index": 16, "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" }
+    "parallelProcessing": { "index": 6, "kind": "attribute", "displayName": 
"Parallel Processing", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "If enabled then processing each split 
messages occurs concurrently. Note the caller thread will still wait until all 
messages has been fully processed, before it continues. It's only processing 
the sub messages from the split [...]
+    "synchronous": { "index": 7, "kind": "attribute", "displayName": 
"Synchronous", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Sets whether synchronous processing 
should be strictly used. When enabled then the same thread is used to continue 
routing after the split is complete, even if parallel processing is enabled." },
+    "streaming": { "index": 8, "kind": "attribute", "displayName": 
"Streaming", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "When in streaming mode, then the 
splitter splits the original message on-demand, and each split message is 
processed one by one. This reduces memory usage as the splitter do not split 
all the messages first, but then we do not know the total si [...]
+    "stopOnException": { "index": 9, "kind": "attribute", "displayName": "Stop 
On Exception", "label": "advanced", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will now stop further 
processing if an exception or failure occurred during processing of an 
org.apache.camel.Exchange and the caused exception will be thrown. Will also 
stop if processing the exchange failed  [...]
+    "timeout": { "index": 10, "kind": "attribute", "displayName": "Timeout", 
"label": "advanced", "required": false, "type": "duration", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "0", "description": "Sets a total timeout specified in millis, 
when using parallel processing. If the Splitter hasn't been able to split and 
process all the sub messages within the given timeframe, then the timeout 
triggers and the Splitter breaks o [...]
+    "executorService": { "index": 11, "kind": "attribute", "displayName": 
"Executor Service", "label": "advanced", "required": false, "type": "object", 
"javaType": "java.util.concurrent.ExecutorService", "deprecated": false, 
"autowired": false, "secret": false, "description": "To use a custom Thread 
Pool to be used for parallel processing. Notice if you set this option, then 
parallel processing is automatically implied, and you do not have to enable 
that option as well." },
+    "onPrepare": { "index": 12, "kind": "attribute", "displayName": "On 
Prepare", "label": "advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.Processor", "deprecated": false, "autowired": false, 
"secret": false, "description": "Uses the Processor when preparing the 
org.apache.camel.Exchange to be sent. This can be used to deep-clone messages 
that should be sent, or any custom logic needed before the exchange is sent." },
+    "shareUnitOfWork": { "index": 13, "kind": "attribute", "displayName": 
"Share Unit Of Work", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": false, "description": "Shares the 
org.apache.camel.spi.UnitOfWork with the parent and each of the sub messages. 
Splitter will by default not share unit of work between the parent exchange and 
each split exchange. This means each s [...]
+    "outputs": { "index": 14, "kind": "element", "displayName": "Outputs", 
"required": true, "type": "array", "javaType": 
"java.util.List<org.apache.camel.model.ProcessorDefinition<java.lang.Object>>", 
"oneOf": [ "aggregate", "bean", "choice", "circuitBreaker", "claimCheck", 
"convertBodyTo", "delay", "doCatch", "doFinally", "doTry", "dynamicRouter", 
"enrich", "filter", "idempotentConsumer", "intercept", "interceptFrom", 
"interceptSendToEndpoint", "kamelet", "loadBalance", "log", "loop",  [...]
+    "disabled": { "index": 15, "kind": "attribute", "displayName": "Disabled", 
"label": "advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether to disable this EIP from the 
route during build time. Once an EIP has been disabled then it cannot be 
enabled later at runtime." },
+    "id": { "index": 16, "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": { "index": 17, "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/MulticastDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/MulticastDefinition.java
index 94c452608e6..e62541dc0f6 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/MulticastDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/MulticastDefinition.java
@@ -65,6 +65,9 @@ public class MulticastDefinition extends 
OutputDefinition<MulticastDefinition>
     private String parallelProcessing;
     @XmlAttribute
     @Metadata(javaType = "java.lang.Boolean")
+    private String synchronous;
+    @XmlAttribute
+    @Metadata(javaType = "java.lang.Boolean")
     private String streaming;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
@@ -176,6 +179,10 @@ public class MulticastDefinition extends 
OutputDefinition<MulticastDefinition>
      * until all messages has been fully processed, before it continues. Its 
only the sending and processing the replies
      * from the multicasts which happens concurrently.
      *
+     * When parallel processing is enabled, then the Camel routing engin will 
continue processing using last used thread
+     * from the parallel thread pool. However, if you want to use the original 
thread that called the multicast, then
+     * make sure to enable the synchronous option as well.
+     *
      * @return the builder
      */
     public MulticastDefinition parallelProcessing() {
@@ -188,6 +195,26 @@ public class MulticastDefinition extends 
OutputDefinition<MulticastDefinition>
      * until all messages has been fully processed, before it continues. Its 
only the sending and processing the replies
      * from the multicasts which happens concurrently.
      *
+     * When parallel processing is enabled, then the Camel routing engin will 
continue processing using last used thread
+     * from the parallel thread pool. However, if you want to use the original 
thread that called the multicast, then
+     * make sure to enable the synchronous option as well.
+     *
+     * @return the builder
+     */
+    public MulticastDefinition parallelProcessing(String parallelProcessing) {
+        setParallelProcessing(parallelProcessing);
+        return this;
+    }
+
+    /**
+     * If enabled then sending messages to the multicasts occurs concurrently. 
Note the caller thread will still wait
+     * until all messages has been fully processed, before it continues. Its 
only the sending and processing the replies
+     * from the multicasts which happens concurrently.
+     *
+     * When parallel processing is enabled, then the Camel routing engin will 
continue processing using last used thread
+     * from the parallel thread pool. However, if you want to use the original 
thread that called the multicast, then
+     * make sure to enable the synchronous option as well.
+     *
      * @return the builder
      */
     public MulticastDefinition parallelProcessing(boolean parallelProcessing) {
@@ -195,6 +222,37 @@ public class MulticastDefinition extends 
OutputDefinition<MulticastDefinition>
         return this;
     }
 
+    /**
+     * Sets whether synchronous processing should be strictly used. When 
enabled then the same thread is used to
+     * continue routing after the multicast is complete, even if parallel 
processing is enabled.
+     *
+     * @return the builder
+     */
+    public MulticastDefinition synchronous() {
+        return synchronous(true);
+    }
+
+    /**
+     * Sets whether synchronous processing should be strictly used. When 
enabled then the same thread is used to
+     * continue routing after the multicast is complete, even if parallel 
processing is enabled.
+     *
+     * @return the builder
+     */
+    public MulticastDefinition synchronous(boolean synchronous) {
+        return synchronous(Boolean.toString(synchronous));
+    }
+
+    /**
+     * Sets whether synchronous processing should be strictly used. When 
enabled then the same thread is used to
+     * continue routing after the multicast is complete, even if parallel 
processing is enabled.
+     *
+     * @return the builder
+     */
+    public MulticastDefinition synchronous(String synchronous) {
+        setSynchronous(synchronous);
+        return this;
+    }
+
     /**
      * If enabled then the aggregate method on AggregationStrategy can be 
called concurrently. Notice that this would
      * require the implementation of AggregationStrategy to be implemented as 
thread-safe. By default this is false
@@ -208,6 +266,32 @@ public class MulticastDefinition extends 
OutputDefinition<MulticastDefinition>
         return this;
     }
 
+    /**
+     * If enabled then the aggregate method on AggregationStrategy can be 
called concurrently. Notice that this would
+     * require the implementation of AggregationStrategy to be implemented as 
thread-safe. By default this is false
+     * meaning that Camel synchronizes the call to the aggregate method. 
Though in some use-cases this can be used to
+     * archive higher performance when the AggregationStrategy is implemented 
as thread-safe.
+     *
+     * @return the builder
+     */
+    public MulticastDefinition parallelAggregate(boolean parallelAggregate) {
+        setParallelAggregate(Boolean.toString(parallelAggregate));
+        return this;
+    }
+
+    /**
+     * If enabled then the aggregate method on AggregationStrategy can be 
called concurrently. Notice that this would
+     * require the implementation of AggregationStrategy to be implemented as 
thread-safe. By default this is false
+     * meaning that Camel synchronizes the call to the aggregate method. 
Though in some use-cases this can be used to
+     * archive higher performance when the AggregationStrategy is implemented 
as thread-safe.
+     *
+     * @return the builder
+     */
+    public MulticastDefinition parallelAggregate(String parallelAggregate) {
+        setParallelAggregate(parallelAggregate);
+        return this;
+    }
+
     /**
      * If enabled then Camel will process replies out-of-order, eg in the 
order they come back. If disabled, Camel will
      * process replies in the same order as defined by the multicast.
@@ -373,6 +457,14 @@ public class MulticastDefinition extends 
OutputDefinition<MulticastDefinition>
         this.parallelProcessing = parallelProcessing;
     }
 
+    public String getSynchronous() {
+        return synchronous;
+    }
+
+    public void setSynchronous(String synchronous) {
+        this.synchronous = synchronous;
+    }
+
     public String getStreaming() {
         return streaming;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RecipientListDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RecipientListDefinition.java
index d9c58f2378f..59544cfddd4 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/RecipientListDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/RecipientListDefinition.java
@@ -66,6 +66,9 @@ public class RecipientListDefinition<Type extends 
ProcessorDefinition<Type>> ext
     @Metadata(javaType = "java.lang.Boolean")
     private String parallelProcessing;
     @XmlAttribute
+    @Metadata(javaType = "java.lang.Boolean")
+    private String synchronous;
+    @XmlAttribute
     @Metadata(javaType = "java.time.Duration", defaultValue = "0")
     private String timeout;
     @XmlAttribute
@@ -197,6 +200,10 @@ public class RecipientListDefinition<Type extends 
ProcessorDefinition<Type>> ext
      * until all messages has been fully processed, before it continues. Its 
only the sending and processing the replies
      * from the recipients which happens concurrently.
      *
+     * When parallel processing is enabled, then the Camel routing engin will 
continue processing using last used thread
+     * from the parallel thread pool. However, if you want to use the original 
thread that called the recipient list,
+     * then make sure to enable the synchronous option as well.
+     *
      * @return the builder
      */
     public RecipientListDefinition<Type> parallelProcessing() {
@@ -209,13 +216,32 @@ public class RecipientListDefinition<Type extends 
ProcessorDefinition<Type>> ext
      * until all messages has been fully processed, before it continues. Its 
only the sending and processing the replies
      * from the recipients which happens concurrently.
      *
+     * When parallel processing is enabled, then the Camel routing engin will 
continue processing using last used thread
+     * from the parallel thread pool. However, if you want to use the original 
thread that called the recipient list,
+     * then make sure to enable the synchronous option as well.
+     *
      * @return the builder
      */
-    public RecipientListDefinition<Type> parallelProcessing(boolean 
parallelProcessing) {
-        setParallelProcessing(Boolean.toString(parallelProcessing));
+    public RecipientListDefinition<Type> parallelProcessing(String 
parallelProcessing) {
+        setParallelProcessing(parallelProcessing);
         return this;
     }
 
+    /**
+     * If enabled then sending messages to the recipients occurs concurrently. 
Note the caller thread will still wait
+     * until all messages has been fully processed, before it continues. Its 
only the sending and processing the replies
+     * from the recipients which happens concurrently.
+     *
+     * When parallel processing is enabled, then the Camel routing engin will 
continue processing using last used thread
+     * from the parallel thread pool. However, if you want to use the original 
thread that called the recipient list,
+     * then make sure to enable the synchronous option as well.
+     *
+     * @return the builder
+     */
+    public RecipientListDefinition<Type> parallelProcessing(boolean 
parallelProcessing) {
+        return parallelProcessing(Boolean.toString(parallelProcessing));
+    }
+
     /**
      * If enabled then the aggregate method on AggregationStrategy can be 
called concurrently. Notice that this would
      * require the implementation of AggregationStrategy to be implemented as 
thread-safe. By default this is false
@@ -225,7 +251,63 @@ public class RecipientListDefinition<Type extends 
ProcessorDefinition<Type>> ext
      * @return the builder
      */
     public RecipientListDefinition<Type> parallelAggregate() {
-        setParallelAggregate(Boolean.toString(true));
+        return parallelAggregate(Boolean.toString(true));
+    }
+
+    /**
+     * If enabled then the aggregate method on AggregationStrategy can be 
called concurrently. Notice that this would
+     * require the implementation of AggregationStrategy to be implemented as 
thread-safe. By default this is false
+     * meaning that Camel synchronizes the call to the aggregate method. 
Though in some use-cases this can be used to
+     * archive higher performance when the AggregationStrategy is implemented 
as thread-safe.
+     *
+     * @return the builder
+     */
+    public RecipientListDefinition<Type> parallelAggregate(boolean 
parallelAggregate) {
+        setParallelAggregate(Boolean.toString(parallelAggregate));
+        return this;
+    }
+
+    /**
+     * If enabled then the aggregate method on AggregationStrategy can be 
called concurrently. Notice that this would
+     * require the implementation of AggregationStrategy to be implemented as 
thread-safe. By default this is false
+     * meaning that Camel synchronizes the call to the aggregate method. 
Though in some use-cases this can be used to
+     * archive higher performance when the AggregationStrategy is implemented 
as thread-safe.
+     *
+     * @return the builder
+     */
+    public RecipientListDefinition<Type> parallelAggregate(String 
parallelAggregate) {
+        setParallelAggregate(parallelAggregate);
+        return this;
+    }
+
+    /**
+     * Sets whether synchronous processing should be strictly used. When 
enabled then the same thread is used to
+     * continue routing after the recipient list is complete, even if parallel 
processing is enabled.
+     *
+     * @return the builder
+     */
+    public RecipientListDefinition<Type> synchronous() {
+        return synchronous(true);
+    }
+
+    /**
+     * Sets whether synchronous processing should be strictly used. When 
enabled then the same thread is used to
+     * continue routing after the recipient list is complete, even if parallel 
processing is enabled.
+     *
+     * @return the builder
+     */
+    public RecipientListDefinition<Type> synchronous(boolean synchronous) {
+        return synchronous(Boolean.toString(synchronous));
+    }
+
+    /**
+     * Sets whether synchronous processing should be strictly used. When 
enabled then the same thread is used to
+     * continue routing after the recipient list is complete, even if parallel 
processing is enabled.
+     *
+     * @return the builder
+     */
+    public RecipientListDefinition<Type> synchronous(String synchronous) {
+        setSynchronous(synchronous);
         return this;
     }
 
@@ -430,6 +512,14 @@ public class RecipientListDefinition<Type extends 
ProcessorDefinition<Type>> ext
         this.parallelProcessing = parallelProcessing;
     }
 
+    public String getSynchronous() {
+        return synchronous;
+    }
+
+    public void setSynchronous(String synchronous) {
+        this.synchronous = synchronous;
+    }
+
     public String getIgnoreInvalidEndpoints() {
         return ignoreInvalidEndpoints;
     }
diff --git 
a/core/camel-core-model/src/main/java/org/apache/camel/model/SplitDefinition.java
 
b/core/camel-core-model/src/main/java/org/apache/camel/model/SplitDefinition.java
index f23e3576c48..59b6b9d141d 100644
--- 
a/core/camel-core-model/src/main/java/org/apache/camel/model/SplitDefinition.java
+++ 
b/core/camel-core-model/src/main/java/org/apache/camel/model/SplitDefinition.java
@@ -65,6 +65,9 @@ public class SplitDefinition extends OutputExpressionNode 
implements ExecutorSer
     private String parallelProcessing;
     @XmlAttribute
     @Metadata(javaType = "java.lang.Boolean")
+    private String synchronous;
+    @XmlAttribute
+    @Metadata(javaType = "java.lang.Boolean")
     private String streaming;
     @XmlAttribute
     @Metadata(label = "advanced", javaType = "java.lang.Boolean")
@@ -194,6 +197,10 @@ public class SplitDefinition extends OutputExpressionNode 
implements ExecutorSer
      * all messages has been fully processed, before it continues. It's only 
processing the sub messages from the
      * splitter which happens concurrently.
      *
+     * When parallel processing is enabled, then the Camel routing engin will 
continue processing using last used thread
+     * from the parallel thread pool. However, if you want to use the original 
thread that called the splitter, then
+     * make sure to enable the synchronous option as well.
+     *
      * @return the builder
      */
     public SplitDefinition parallelProcessing() {
@@ -205,6 +212,10 @@ public class SplitDefinition extends OutputExpressionNode 
implements ExecutorSer
      * all messages has been fully processed, before it continues. It's only 
processing the sub messages from the
      * splitter which happens concurrently.
      *
+     * When parallel processing is enabled, then the Camel routing engin will 
continue processing using last used thread
+     * from the parallel thread pool. However, if you want to use the original 
thread that called the splitter, then
+     * make sure to enable the synchronous option as well.
+     *
      * @return the builder
      */
     public SplitDefinition parallelProcessing(boolean parallelProcessing) {
@@ -216,6 +227,10 @@ public class SplitDefinition extends OutputExpressionNode 
implements ExecutorSer
      * all messages has been fully processed, before it continues. It's only 
processing the sub messages from the
      * splitter which happens concurrently.
      *
+     * When parallel processing is enabled, then the Camel routing engin will 
continue processing using last used thread
+     * from the parallel thread pool. However, if you want to use the original 
thread that called the splitter, then
+     * make sure to enable the synchronous option as well.
+     *
      * @return the builder
      */
     public SplitDefinition parallelProcessing(String parallelProcessing) {
@@ -260,6 +275,37 @@ public class SplitDefinition extends OutputExpressionNode 
implements ExecutorSer
         return this;
     }
 
+    /**
+     * Sets whether synchronous processing should be strictly used. When 
enabled then the same thread is used to
+     * continue routing after the split is complete, even if parallel 
processing is enabled.
+     *
+     * @return the builder
+     */
+    public SplitDefinition synchronous() {
+        return synchronous(true);
+    }
+
+    /**
+     * Sets whether synchronous processing should be strictly used. When 
enabled then the same thread is used to
+     * continue routing after the split is complete, even if parallel 
processing is enabled.
+     *
+     * @return the builder
+     */
+    public SplitDefinition synchronous(boolean synchronous) {
+        return synchronous(Boolean.toString(synchronous));
+    }
+
+    /**
+     * Sets whether synchronous processing should be strictly used. When 
enabled then the same thread is used to
+     * continue routing after the split is complete, even if parallel 
processing is enabled.
+     *
+     * @return the builder
+     */
+    public SplitDefinition synchronous(String synchronous) {
+        setSynchronous(synchronous);
+        return this;
+    }
+
     /**
      * When in streaming mode, then the splitter splits the original message 
on-demand, and each split message is
      * processed one by one. This reduces memory usage as the splitter do not 
split all the messages first, but then we
@@ -522,6 +568,14 @@ public class SplitDefinition extends OutputExpressionNode 
implements ExecutorSer
         this.parallelProcessing = parallelProcessing;
     }
 
+    public String getSynchronous() {
+        return synchronous;
+    }
+
+    public void setSynchronous(String synchronous) {
+        this.synchronous = synchronous;
+    }
+
     public String getStreaming() {
         return streaming;
     }
diff --git 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/MulticastProcessor.java
 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/MulticastProcessor.java
index 68af442f070..954511a28e8 100644
--- 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/MulticastProcessor.java
+++ 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/MulticastProcessor.java
@@ -53,6 +53,7 @@ import org.apache.camel.Traceable;
 import org.apache.camel.processor.aggregate.ShareUnitOfWorkAggregationStrategy;
 import org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy;
 import org.apache.camel.processor.errorhandler.ErrorHandlerSupport;
+import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.ErrorHandlerAware;
 import org.apache.camel.spi.IdAware;
 import org.apache.camel.spi.InternalProcessorFactory;
@@ -148,6 +149,7 @@ public class MulticastProcessor extends 
AsyncProcessorSupport
 
     protected final Processor onPrepare;
     protected final ProcessorExchangeFactory processorExchangeFactory;
+    private final AsyncProcessorAwaitManager awaitManager;
     private final CamelContext camelContext;
     private final InternalProcessorFactory internalProcessorFactory;
     private final Route route;
@@ -158,6 +160,7 @@ public class MulticastProcessor extends 
AsyncProcessorSupport
     private Collection<Processor> processors;
     private final AggregationStrategy aggregationStrategy;
     private final boolean parallelProcessing;
+    private boolean synchronous;
     private final boolean streaming;
     private final boolean parallelAggregate;
     private final boolean stopOnException;
@@ -188,6 +191,7 @@ public class MulticastProcessor extends 
AsyncProcessorSupport
         notNull(camelContext, "camelContext");
         this.camelContext = camelContext;
         this.internalProcessorFactory = 
PluginHelper.getInternalProcessorFactory(camelContext);
+        this.awaitManager = 
PluginHelper.getAsyncProcessorAwaitManager(camelContext);
         this.route = route;
         this.reactiveExecutor = 
camelContext.getCamelContextExtension().getReactiveExecutor();
         this.processors = processors;
@@ -250,6 +254,14 @@ public class MulticastProcessor extends 
AsyncProcessorSupport
         return camelContext;
     }
 
+    public boolean isSynchronous() {
+        return synchronous;
+    }
+
+    public void setSynchronous(boolean synchronous) {
+        this.synchronous = synchronous;
+    }
+
     @Override
     protected void doBuild() throws Exception {
         if (processorExchangeFactory != null) {
@@ -288,6 +300,28 @@ public class MulticastProcessor extends 
AsyncProcessorSupport
 
     @Override
     public boolean process(Exchange exchange, AsyncCallback callback) {
+        if (synchronous) {
+            try {
+                // force synchronous processing using await manager
+                awaitManager.process(new AsyncProcessorSupport() {
+                    @Override
+                    public boolean process(Exchange exchange, AsyncCallback 
callback) {
+                        // must invoke doProcess directly here to avoid 
calling recursive
+                        return doProcess(exchange, callback);
+                    }
+                }, exchange);
+            } catch (Throwable e) {
+                exchange.setException(e);
+            } finally {
+                callback.done(true);
+            }
+            return true;
+        } else {
+            return doProcess(exchange, callback);
+        }
+    }
+
+    protected boolean doProcess(Exchange exchange, AsyncCallback callback) {
         Iterable<ProcessorExchangePair> pairs;
         int size = 0;
         try {
diff --git 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/RecipientList.java
 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/RecipientList.java
index bed81851648..dbccb6cacf7 100644
--- 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/RecipientList.java
+++ 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/RecipientList.java
@@ -58,6 +58,7 @@ public class RecipientList extends AsyncProcessorSupport 
implements IdAware, Rou
     private final Expression expression;
     private final String delimiter;
     private boolean parallelProcessing;
+    private boolean synchronous;
     private boolean parallelAggregate;
     private boolean stopOnException;
     private boolean ignoreInvalidEndpoints;
@@ -205,6 +206,7 @@ public class RecipientList extends AsyncProcessorSupport 
implements IdAware, Rou
                 camelContext, null, expression, delimiter, producerCache, 
getAggregationStrategy(),
                 isParallelProcessing(), getExecutorService(), 
isShutdownExecutorService(),
                 isStreaming(), isStopOnException(), getTimeout(), 
getOnPrepare(), isShareUnitOfWork(), isParallelAggregate());
+        recipientListProcessor.setSynchronous(synchronous);
         recipientListProcessor.setErrorHandler(errorHandler);
         
recipientListProcessor.setAggregateExecutorService(aggregateExecutorService);
         
recipientListProcessor.setIgnoreInvalidEndpoints(isIgnoreInvalidEndpoints());
@@ -264,6 +266,14 @@ public class RecipientList extends AsyncProcessorSupport 
implements IdAware, Rou
         this.parallelProcessing = parallelProcessing;
     }
 
+    public boolean isSynchronous() {
+        return synchronous;
+    }
+
+    public void setSynchronous(boolean synchronous) {
+        this.synchronous = synchronous;
+    }
+
     public boolean isParallelAggregate() {
         return parallelAggregate;
     }
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/MulticastReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/MulticastReifier.java
index 103eb79cc14..86d2de72f2a 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/MulticastReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/MulticastReifier.java
@@ -58,6 +58,7 @@ public class MulticastReifier extends 
ProcessorReifier<MulticastDefinition> {
         final AggregationStrategy strategy = createAggregationStrategy();
 
         boolean isParallelProcessing = 
parseBoolean(definition.getParallelProcessing(), false);
+        boolean isSynchronous = parseBoolean(definition.getSynchronous(), 
false);
         boolean isShareUnitOfWork = 
parseBoolean(definition.getShareUnitOfWork(), false);
         boolean isStreaming = parseBoolean(definition.getStreaming(), false);
         boolean isStopOnException = 
parseBoolean(definition.getStopOnException(), false);
@@ -75,9 +76,11 @@ public class MulticastReifier extends 
ProcessorReifier<MulticastDefinition> {
             prepare = mandatoryLookup(definition.getOnPrepare(), 
Processor.class);
         }
 
-        return new MulticastProcessor(
+        MulticastProcessor answer = new MulticastProcessor(
                 camelContext, route, list, strategy, isParallelProcessing, 
threadPool, shutdownThreadPool, isStreaming,
                 isStopOnException, timeout, prepare, isShareUnitOfWork, 
isParallelAggregate);
+        answer.setSynchronous(isSynchronous);
+        return answer;
     }
 
     private AggregationStrategy createAggregationStrategy() {
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
index bfc3ad6f61f..5ced2c43173 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RecipientListReifier.java
@@ -46,6 +46,7 @@ public class RecipientListReifier extends 
ProcessorReifier<RecipientListDefiniti
         final Expression expression = 
createExpression(definition.getExpression());
 
         boolean isParallelProcessing = 
parseBoolean(definition.getParallelProcessing(), false);
+        boolean isSynchronous = parseBoolean(definition.getSynchronous(), 
false);
         boolean isStreaming = parseBoolean(definition.getStreaming(), false);
         boolean isParallelAggregate = 
parseBoolean(definition.getParallelAggregate(), false);
         boolean isShareUnitOfWork = 
parseBoolean(definition.getShareUnitOfWork(), false);
@@ -62,6 +63,7 @@ public class RecipientListReifier extends 
ProcessorReifier<RecipientListDefiniti
         answer.setAggregationStrategy(createAggregationStrategy());
         answer.setParallelProcessing(isParallelProcessing);
         answer.setParallelAggregate(isParallelAggregate);
+        answer.setSynchronous(isSynchronous);
         answer.setStreaming(isStreaming);
         answer.setShareUnitOfWork(isShareUnitOfWork);
         answer.setStopOnException(isStopOnException);
diff --git 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SplitReifier.java
 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SplitReifier.java
index 471beee3b01..55fc66c1e4b 100644
--- 
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SplitReifier.java
+++ 
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/SplitReifier.java
@@ -44,6 +44,7 @@ public class SplitReifier extends 
ExpressionReifier<SplitDefinition> {
         final AggregationStrategy strategy = createAggregationStrategy();
 
         boolean isParallelProcessing = 
parseBoolean(definition.getParallelProcessing(), false);
+        boolean isSynchronous = parseBoolean(definition.getSynchronous(), 
false);
         boolean isStreaming = parseBoolean(definition.getStreaming(), false);
         boolean isShareUnitOfWork = 
parseBoolean(definition.getShareUnitOfWork(), false);
         boolean isParallelAggregate = 
parseBoolean(definition.getParallelAggregate(), false);
@@ -75,6 +76,7 @@ public class SplitReifier extends 
ExpressionReifier<SplitDefinition> {
                     threadPool, shutdownThreadPool, isStreaming, 
isStopOnException, timeout, prepare,
                     isShareUnitOfWork, isParallelAggregate);
         }
+        answer.setSynchronous(isSynchronous);
 
         return answer;
     }
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelSynchronousTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelSynchronousTest.java
new file mode 100644
index 00000000000..0b90f83f8e1
--- /dev/null
+++ 
b/core/camel-core/src/test/java/org/apache/camel/processor/MulticastParallelSynchronousTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class MulticastParallelSynchronousTest extends ContextTestSupport {
+
+    private String before;
+    private String middle;
+    private String middle2;
+    private String after;
+
+    @Test
+    public void testSynchronous() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:end");
+        mock.expectedMessageCount(1);
+
+        template.sendBody("direct:a", "A");
+
+        assertMockEndpointsSatisfied();
+
+        Assertions.assertNotEquals(before, middle);
+        Assertions.assertNotEquals(before, middle2);
+        Assertions.assertNotEquals(after, middle);
+        Assertions.assertNotEquals(after, middle2);
+        Assertions.assertEquals(before, after);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:a")
+                        .process(e -> {
+                            before = Thread.currentThread().getName();
+                        })
+                        .multicast().parallelProcessing().synchronous()
+                        .process(e -> {
+                            middle = Thread.currentThread().getName();
+                        })
+                        .process(e -> {
+                            middle2 = Thread.currentThread().getName();
+                        })
+                        .end()
+                        .process(e -> {
+                            after = Thread.currentThread().getName();
+                        })
+                        .to("mock:end");
+
+            }
+        };
+    }
+
+}
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListParallelSynchronousTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListParallelSynchronousTest.java
new file mode 100644
index 00000000000..7ab24dbbced
--- /dev/null
+++ 
b/core/camel-core/src/test/java/org/apache/camel/processor/RecipientListParallelSynchronousTest.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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class RecipientListParallelSynchronousTest extends ContextTestSupport {
+
+    private String before;
+    private String middle;
+    private String middle2;
+    private String after;
+
+    @Test
+    public void testSynchronous() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:end");
+        mock.expectedMessageCount(1);
+
+        template.sendBodyAndHeader("direct:a", "A", "whereTo", 
"direct:b,direct:c");
+
+        assertMockEndpointsSatisfied();
+
+        Assertions.assertNotEquals(before, middle);
+        Assertions.assertNotEquals(before, middle2);
+        Assertions.assertNotEquals(after, middle);
+        Assertions.assertNotEquals(after, middle2);
+        Assertions.assertEquals(before, after);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:a")
+                        .process(e -> {
+                            before = Thread.currentThread().getName();
+                        })
+                        
.recipientList(header("whereTo")).parallelProcessing().synchronous()
+                        .process(e -> {
+                            after = Thread.currentThread().getName();
+                        })
+                        .to("mock:end");
+
+                from("direct:b")
+                        .process(e -> {
+                            middle = Thread.currentThread().getName();
+                        });
+
+                from("direct:c")
+                        .process(e -> {
+                            middle2 = Thread.currentThread().getName();
+                        });
+
+            }
+        };
+    }
+
+}
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/processor/SplitParallelSynchronousTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/processor/SplitParallelSynchronousTest.java
new file mode 100644
index 00000000000..4bd5a300ea3
--- /dev/null
+++ 
b/core/camel-core/src/test/java/org/apache/camel/processor/SplitParallelSynchronousTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class SplitParallelSynchronousTest extends ContextTestSupport {
+
+    private String before;
+    private String middle;
+    private String after;
+
+    @Test
+    public void testSynchronous() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:end");
+        mock.expectedMessageCount(1);
+
+        template.sendBody("direct:a", "A,B,C,D,E");
+
+        assertMockEndpointsSatisfied();
+
+        Assertions.assertNotEquals(before, middle);
+        Assertions.assertNotEquals(after, middle);
+        Assertions.assertEquals(before, after);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:a")
+                        .process(e -> {
+                            before = Thread.currentThread().getName();
+                        })
+                        
.split(body().tokenize(",")).parallelProcessing().synchronous()
+                        .process(e -> {
+                            middle = Thread.currentThread().getName();
+                        })
+                        .end()
+                        .process(e -> {
+                            after = Thread.currentThread().getName();
+                        })
+                        .to("mock:end");
+
+            }
+        };
+    }
+
+}
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 e4f5932df7f..3f1bca0a6cd 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
@@ -599,6 +599,7 @@ public class ModelParser extends BaseParser {
                 case "shareUnitOfWork": def.setShareUnitOfWork(val); break;
                 case "stopOnException": def.setStopOnException(val); break;
                 case "streaming": def.setStreaming(val); break;
+                case "synchronous": def.setSynchronous(val); break;
                 case "timeout": def.setTimeout(val); break;
                 default: return 
processorDefinitionAttributeHandler().accept(def, key, val);
             }
@@ -802,6 +803,7 @@ public class ModelParser extends BaseParser {
                 case "shareUnitOfWork": def.setShareUnitOfWork(val); break;
                 case "stopOnException": def.setStopOnException(val); break;
                 case "streaming": def.setStreaming(val); break;
+                case "synchronous": def.setSynchronous(val); break;
                 case "timeout": def.setTimeout(val); break;
                 default: return 
processorDefinitionAttributeHandler().accept(def, key, val);
             }
@@ -1325,6 +1327,7 @@ public class ModelParser extends BaseParser {
                 case "shareUnitOfWork": def.setShareUnitOfWork(val); break;
                 case "stopOnException": def.setStopOnException(val); break;
                 case "streaming": def.setStreaming(val); break;
+                case "synchronous": def.setSynchronous(val); break;
                 case "timeout": def.setTimeout(val); break;
                 default: return 
processorDefinitionAttributeHandler().accept(def, key, val);
             }
diff --git 
a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
 
b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
index 530682f71e0..5adeebfbe01 100644
--- 
a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
+++ 
b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java
@@ -1540,6 +1540,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("aggregationStrategy", def.getAggregationStrategy());
         doWriteAttribute("onPrepare", def.getOnPrepare());
         doWriteAttribute("executorService", def.getExecutorService());
+        doWriteAttribute("synchronous", def.getSynchronous());
         doWriteAttribute("aggregationStrategyMethodName", 
def.getAggregationStrategyMethodName());
         doWriteAttribute("timeout", def.getTimeout());
         doWriteAttribute("streaming", def.getStreaming());
@@ -1778,6 +1779,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("aggregationStrategy", def.getAggregationStrategy());
         doWriteAttribute("onPrepare", def.getOnPrepare());
         doWriteAttribute("executorService", def.getExecutorService());
+        doWriteAttribute("synchronous", def.getSynchronous());
         doWriteAttribute("aggregationStrategyMethodName", 
def.getAggregationStrategyMethodName());
         doWriteAttribute("timeout", def.getTimeout());
         doWriteAttribute("ignoreInvalidEndpoints", 
def.getIgnoreInvalidEndpoints());
@@ -2209,6 +2211,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("aggregationStrategy", def.getAggregationStrategy());
         doWriteAttribute("onPrepare", def.getOnPrepare());
         doWriteAttribute("executorService", def.getExecutorService());
+        doWriteAttribute("synchronous", def.getSynchronous());
         doWriteAttribute("aggregationStrategyMethodName", 
def.getAggregationStrategyMethodName());
         doWriteAttribute("timeout", def.getTimeout());
         doWriteAttribute("streaming", def.getStreaming());
diff --git 
a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
 
b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
index 5ce1bd53bdc..1c93ab15420 100644
--- 
a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
+++ 
b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/ModelWriter.java
@@ -1540,6 +1540,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("aggregationStrategy", def.getAggregationStrategy());
         doWriteAttribute("onPrepare", def.getOnPrepare());
         doWriteAttribute("executorService", def.getExecutorService());
+        doWriteAttribute("synchronous", def.getSynchronous());
         doWriteAttribute("aggregationStrategyMethodName", 
def.getAggregationStrategyMethodName());
         doWriteAttribute("timeout", def.getTimeout());
         doWriteAttribute("streaming", def.getStreaming());
@@ -1778,6 +1779,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("aggregationStrategy", def.getAggregationStrategy());
         doWriteAttribute("onPrepare", def.getOnPrepare());
         doWriteAttribute("executorService", def.getExecutorService());
+        doWriteAttribute("synchronous", def.getSynchronous());
         doWriteAttribute("aggregationStrategyMethodName", 
def.getAggregationStrategyMethodName());
         doWriteAttribute("timeout", def.getTimeout());
         doWriteAttribute("ignoreInvalidEndpoints", 
def.getIgnoreInvalidEndpoints());
@@ -2209,6 +2211,7 @@ public class ModelWriter extends BaseWriter {
         doWriteAttribute("aggregationStrategy", def.getAggregationStrategy());
         doWriteAttribute("onPrepare", def.getOnPrepare());
         doWriteAttribute("executorService", def.getExecutorService());
+        doWriteAttribute("synchronous", def.getSynchronous());
         doWriteAttribute("aggregationStrategyMethodName", 
def.getAggregationStrategyMethodName());
         doWriteAttribute("timeout", def.getTimeout());
         doWriteAttribute("streaming", def.getStreaming());
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 28aaf1dff1b..0d1b82fa624 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
@@ -8825,6 +8825,7 @@ public final class ModelDeserializers extends 
YamlDeserializerSupport {
                     @YamlProperty(name = "steps", type = 
"array:org.apache.camel.model.ProcessorDefinition"),
                     @YamlProperty(name = "stop-on-exception", type = 
"boolean"),
                     @YamlProperty(name = "streaming", type = "boolean"),
+                    @YamlProperty(name = "synchronous", type = "boolean"),
                     @YamlProperty(name = "timeout", type = "string")
             }
     )
@@ -8902,6 +8903,11 @@ public final class ModelDeserializers extends 
YamlDeserializerSupport {
                     target.setStreaming(val);
                     break;
                 }
+                case "synchronous": {
+                    String val = asText(node);
+                    target.setSynchronous(val);
+                    break;
+                }
                 case "timeout": {
                     String val = asText(node);
                     target.setTimeout(val);
@@ -11361,6 +11367,7 @@ public final class ModelDeserializers extends 
YamlDeserializerSupport {
                     @YamlProperty(name = "share-unit-of-work", type = 
"boolean"),
                     @YamlProperty(name = "stop-on-exception", type = 
"boolean"),
                     @YamlProperty(name = "streaming", type = "boolean"),
+                    @YamlProperty(name = "synchronous", type = "boolean"),
                     @YamlProperty(name = "timeout", type = "string")
             }
     )
@@ -11458,6 +11465,11 @@ public final class ModelDeserializers extends 
YamlDeserializerSupport {
                     target.setStreaming(val);
                     break;
                 }
+                case "synchronous": {
+                    String val = asText(node);
+                    target.setSynchronous(val);
+                    break;
+                }
                 case "timeout": {
                     String val = asText(node);
                     target.setTimeout(val);
@@ -15376,6 +15388,7 @@ public final class ModelDeserializers extends 
YamlDeserializerSupport {
                     @YamlProperty(name = "steps", type = 
"array:org.apache.camel.model.ProcessorDefinition"),
                     @YamlProperty(name = "stop-on-exception", type = 
"boolean"),
                     @YamlProperty(name = "streaming", type = "boolean"),
+                    @YamlProperty(name = "synchronous", type = "boolean"),
                     @YamlProperty(name = "timeout", type = "string")
             }
     )
@@ -15463,6 +15476,11 @@ public final class ModelDeserializers extends 
YamlDeserializerSupport {
                     target.setStreaming(val);
                     break;
                 }
+                case "synchronous": {
+                    String val = asText(node);
+                    target.setSynchronous(val);
+                    break;
+                }
                 case "timeout": {
                     String val = asText(node);
                     target.setTimeout(val);
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json
index 3d3b6d14411..29d73d24ff4 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camel-yaml-dsl.json
@@ -1549,6 +1549,9 @@
           "streaming" : {
             "type" : "boolean"
           },
+          "synchronous" : {
+            "type" : "boolean"
+          },
           "timeout" : {
             "type" : "string"
           }
@@ -2014,6 +2017,9 @@
           "streaming" : {
             "type" : "boolean"
           },
+          "synchronous" : {
+            "type" : "boolean"
+          },
           "timeout" : {
             "type" : "string"
           }
@@ -2942,6 +2948,9 @@
           "streaming" : {
             "type" : "boolean"
           },
+          "synchronous" : {
+            "type" : "boolean"
+          },
           "timeout" : {
             "type" : "string"
           }
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
index 5a94fa93312..1c4725fae54 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json
@@ -1459,6 +1459,9 @@
           "streaming" : {
             "type" : "boolean"
           },
+          "synchronous" : {
+            "type" : "boolean"
+          },
           "timeout" : {
             "type" : "string"
           }
@@ -1924,6 +1927,9 @@
           "streaming" : {
             "type" : "boolean"
           },
+          "synchronous" : {
+            "type" : "boolean"
+          },
           "timeout" : {
             "type" : "string"
           }
@@ -2852,6 +2858,9 @@
           "streaming" : {
             "type" : "boolean"
           },
+          "synchronous" : {
+            "type" : "boolean"
+          },
           "timeout" : {
             "type" : "string"
           }


Reply via email to