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

[camel] branch master updated (03adbd8 -> 8860d83)

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

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


    from 03adbd8  Sync deps
     new b9c19ec  CAMEL-16056: Added StartupStep to diagnose startup exeuction times for various steps. To be integated with JFR later.
     new 2dc16e1  CAMEL-16056: Added StartupStep to diagnose startup exeuction times for various steps.
     new e638f1a  CAMEL-16056: Added camel-jfr for java flight recorder integration
     new 4f8a08b  CAMEL-16056: Added StartupStep to diagnose startup exeuction times for various steps.
     new 3b112be  CAMEL-16056: Added camel-jfr for java flight recorder integration
     new 8860d83  CAMEL-16056: Added camel-jfr for java flight recorder integration

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


Summary of changes:
 bom/camel-bom/pom.xml                              |     5 +
 .../org/apache/camel/catalog/docs.properties       |     1 +
 .../org/apache/camel/catalog/docs/jfr.adoc         |    30 +
 .../main/camel-main-configuration-metadata.json    |     6 +
 .../org/apache/camel/catalog/others.properties     |     2 +
 .../camel/catalog/others/flight-recorder.json      |    15 +
 .../org/apache/camel/catalog/others/jfr.json       |    15 +
 .../apache/camel/catalog/schemas/camel-spring.xsd  | 13246 +++++++++++++++----
 components/camel-jfr/pom.xml                       |    69 +
 .../services/org/apache/camel/other.properties     |     7 +
 .../org/apache/camel/startup-step-recorder         |     2 +
 .../camel-jfr/src/generated/resources/jfr.json     |    15 +
 components/camel-jfr/src/main/docs/jfr.adoc        |    30 +
 .../startup/jfr/FlightRecorderStartupStep.java     |   100 +
 .../jfr/FlightRecorderStartupStepRecorder.java     |   131 +
 components/pom.xml                                 |     1 +
 core/camel-allcomponents/pom.xml                   |     4 +
 .../org/apache/camel/ExtendedCamelContext.java     |    11 +
 .../main/java/org/apache/camel/StartupStep.java    |    65 +
 .../org/apache/camel/spi/StartupStepRecorder.java  |   111 +
 .../camel/impl/engine/AbstractCamelContext.java    |    89 +-
 .../impl/engine/InternalRouteStartupManager.java   |     9 +
 .../camel/impl/ExtendedCamelContextConfigurer.java |     6 +
 .../org/apache/camel/impl/DefaultCamelContext.java |     8 +
 .../camel/impl/lw/LightweightCamelContext.java     |    11 +
 .../impl/lw/LightweightRuntimeCamelContext.java    |    11 +
 .../org/apache/camel/reifier/ChoiceReifier.java    |     1 -
 .../org/apache/camel/reifier/ProcessorReifier.java |    10 +-
 .../org/apache/camel/reifier/RouteReifier.java     |    13 +-
 .../org/apache/camel/impl/CustomIdFactoryTest.java |    10 +-
 .../apache/camel/impl/StartupStepLoggingTest.java  |    46 +
 .../MainConfigurationPropertiesConfigurer.java     |    36 +
 .../camel-main-configuration-metadata.json         |     6 +
 core/camel-main/src/main/docs/main.adoc            |     6 +
 .../org/apache/camel/main/BaseMainSupport.java     |    73 +-
 .../camel/main/DefaultConfigurationConfigurer.java |    26 +
 .../camel/main/DefaultConfigurationProperties.java |   157 +
 .../src/main/java/org/apache/camel/main/Main.java  |    11 +-
 .../camel/support/startup/DefaultStartupStep.java  |    81 +
 .../startup/DefaultStartupStepRecorder.java        |   191 +
 .../startup/LoggingStartupStepRecorder.java        |    62 +
 docs/components/modules/others/nav.adoc            |     1 +
 docs/components/modules/others/pages/jfr.adoc      |    32 +
 docs/components/modules/others/pages/main.adoc     |     6 +
 parent/pom.xml                                     |     5 +
 45 files changed, 11935 insertions(+), 2838 deletions(-)
 create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jfr.adoc
 create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/flight-recorder.json
 create mode 100644 catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/jfr.json
 create mode 100644 components/camel-jfr/pom.xml
 create mode 100644 components/camel-jfr/src/generated/resources/META-INF/services/org/apache/camel/other.properties
 create mode 100644 components/camel-jfr/src/generated/resources/META-INF/services/org/apache/camel/startup-step-recorder
 create mode 100644 components/camel-jfr/src/generated/resources/jfr.json
 create mode 100644 components/camel-jfr/src/main/docs/jfr.adoc
 create mode 100644 components/camel-jfr/src/main/java/org/apache/camel/startup/jfr/FlightRecorderStartupStep.java
 create mode 100644 components/camel-jfr/src/main/java/org/apache/camel/startup/jfr/FlightRecorderStartupStepRecorder.java
 create mode 100644 core/camel-api/src/main/java/org/apache/camel/StartupStep.java
 create mode 100644 core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java
 create mode 100644 core/camel-core/src/test/java/org/apache/camel/impl/StartupStepLoggingTest.java
 create mode 100644 core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStep.java
 create mode 100644 core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStepRecorder.java
 create mode 100644 core/camel-support/src/main/java/org/apache/camel/support/startup/LoggingStartupStepRecorder.java
 create mode 100644 docs/components/modules/others/pages/jfr.adoc


[camel] 03/06: CAMEL-16056: Added camel-jfr for java flight recorder integration

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

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

commit e638f1a5e57beb8bcdb78175dbb73c56cabca5da
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jan 19 21:42:06 2021 +0100

    CAMEL-16056: Added camel-jfr for java flight recorder integration
---
 bom/camel-bom/pom.xml                              |     5 +
 .../org/apache/camel/catalog/docs.properties       |     1 +
 .../org/apache/camel/catalog/docs/jfr.adoc         |    42 +
 .../main/camel-main-configuration-metadata.json    |     2 +
 .../org/apache/camel/catalog/others.properties     |     2 +
 .../camel/catalog/others/flight-recorder.json      |    15 +
 .../org/apache/camel/catalog/others/jfr.json       |    15 +
 .../apache/camel/catalog/schemas/camel-spring.xsd  | 13246 +++++++++++++++----
 components/camel-jfr/pom.xml                       |    69 +
 .../services/org/apache/camel/other.properties     |     7 +
 .../org/apache/camel/startup-step-recorder         |     2 +
 .../camel-jfr/src/generated/resources/jfr.json     |    15 +
 components/camel-jfr/src/main/docs/jfr.adoc        |    42 +
 .../startup/jfr/FlightRecorderStartupStep.java     |    25 +-
 .../jfr/FlightRecorderStartupStepRecorder.java     |     7 +-
 components/pom.xml                                 |     1 +
 core/camel-allcomponents/pom.xml                   |     4 +
 .../main/java/org/apache/camel/StartupStep.java    |     2 +-
 .../org/apache/camel/spi/StartupStepRecorder.java  |     7 +-
 .../camel/impl/engine/AbstractCamelContext.java    |    15 +-
 .../camel/main/DefaultConfigurationConfigurer.java |    11 +-
 .../camel/support/startup/DefaultStartupStep.java  |     2 +-
 .../startup/DefaultStartupStepRecorder.java        |     4 +-
 docs/components/modules/others/nav.adoc            |     1 +
 docs/components/modules/others/pages/jfr.adoc      |    44 +
 docs/components/modules/others/pages/main.adoc     |     2 +
 parent/pom.xml                                     |     5 +
 27 files changed, 10760 insertions(+), 2833 deletions(-)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index 37f27d5..9092713 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -1054,6 +1054,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-jfr</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-jgroups</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
index 8932401..fd2e98b 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
@@ -258,6 +258,7 @@ jclouds-component
 jcr-component
 jdbc-component
 jetty-component
+jfr
 jgroups-component
 jgroups-raft-component
 jing-component
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jfr.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jfr.adoc
new file mode 100644
index 0000000..3a8fa2e
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jfr.adoc
@@ -0,0 +1,42 @@
+[[jfr-other]]
+= Jfr Component
+:docTitle: Jfr
+:artifactId: camel-jfr
+:description: Diagnose Camel applications with Java Flight Recorder
+:since: 3.8
+:supportLevel: Preview
+include::{cq-version}@camel-quarkus:ROOT:partial$reference/others/jfr.adoc[opts=optional]
+
+*Since Camel {since}*
+
+The Camel Java Flight Recorder (JFR) component is used for integrating Camel with Java Flight Recorder (JFR).
+
+This allows to monitor and troubleshoot your Camel applications with JFR.
+
+The camel-jfr component emits lifecycle events for startup to JFR.
+This can for example be used to pin-point which Camel routes may be slow to startup.
+
+[[jfr-Options]]
+== Options
+
+[width="100%",cols="10%,10%,80%",options="header",]
+|===
+|Option
+|Default
+|Description
+
+|enabled
+|true
+|Whether Camel flight recorder is enabled globally
+
+|===
+
+
+[[jfr-Example]]
+== Example
+
+To enable you just need to add `camel-jfr` to the classpath.
+
+See the `camel-example-flight-recorder` from the Camel Examples.
+
+include::camel-spring-boot::page$jfr-starter.adoc[]
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index 7a249fd..9429f05 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -71,6 +71,8 @@
     { "name": "camel.main.shutdownRoutesInReverseOrder", "description": "Sets whether routes should be shutdown in reverse or the same order as they were started.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
     { "name": "camel.main.shutdownSuppressLoggingOnTimeout", "description": "Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors\/warnings et all in the logs as a side-effect of the forced timeout. Notice the suppress is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control. This option is defa [...]
     { "name": "camel.main.shutdownTimeout", "description": "Timeout in seconds to graceful shutdown Camel.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int", "defaultValue": 45 },
+    { "name": "camel.main.startupRecorder", "description": "To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false, logging, java-flight-recorder The default is false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.main.startupRecorderMaxDepth", "description": "To filter our sub steps at a maximum depth. Use -1 for no maximum. Use 0 for no sub steps. Use 1 for max 1 sub step, and so forth. The default is -1.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int", "defaultValue": -1 },
     { "name": "camel.main.streamCachingAnySpoolRules", "description": "Sets whether if just any of the org.apache.camel.spi.StreamCachingStrategy.SpoolRule rules returns true then shouldSpoolCache(long) returns true, to allow spooling to disk. If this option is false, then all the org.apache.camel.spi.StreamCachingStrategy.SpoolRule must return true. The default value is false which means that all the rules must return true.", "sourceType": "org.apache.camel.main.DefaultConfigurationProp [...]
     { "name": "camel.main.streamCachingBufferSize", "description": "Sets the stream caching buffer size to use when allocating in-memory buffers used for in-memory stream caches. The default size is 4096.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int" },
     { "name": "camel.main.streamCachingEnabled", "description": "Sets whether stream caching is enabled or not. Default is false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean" },
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
index e3e9ff2..47e9091 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
@@ -5,9 +5,11 @@ csimple-joor
 cxf-transport
 elytron
 etcd3
+flight-recorder
 headersmap
 hystrix
 jasypt
+jfr
 jta
 leveldb
 leveldb-legacy
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/flight-recorder.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/flight-recorder.json
new file mode 100644
index 0000000..8552d44
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/flight-recorder.json
@@ -0,0 +1,15 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "flight-recorder",
+    "title": "Java Flight Recorder",
+    "description": "Diagnose Camel with Java Flight Recorder",
+    "deprecated": false,
+    "firstVersion": "3.8.0",
+    "label": "monitoring",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-flight-recorder",
+    "version": "3.8.0-SNAPSHOT"
+  }
+}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/jfr.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/jfr.json
new file mode 100644
index 0000000..06c11cd
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/jfr.json
@@ -0,0 +1,15 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "jfr",
+    "title": "Jfr",
+    "description": "Diagnose Camel applications with Java Flight Recorder",
+    "deprecated": false,
+    "firstVersion": "3.8.0",
+    "label": "monitoring",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-jfr",
+    "version": "3.8.0-SNAPSHOT"
+  }
+}
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 1dde93b..5991b13 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
@@ -1,627 +1,778 @@
 <?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://camel.apache.org/schema/spring" elementFormDefault="qualified" targetNamespace="http://camel.apache.org/schema/spring" version="1.0">
-
+    
   <xs:element name="aggregate" type="tns:aggregateDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Aggregates many messages into a single message
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="any23" type="tns:any23DataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Extract RDF data from HTML documents.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="apiKey" type="tns:restSecurityApiKey">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest security basic auth definition
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="asn1" type="tns:asn1DataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Encode and decode data structures using Abstract Syntax Notation One (ASN.1).
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="avro" type="tns:avroDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Serialize and deserialize messages using Apache Avro binary data format.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="barcode" type="tns:barcodeDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Transform strings to various 1D/2D barcode bitmap formats and back.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="base64" type="tns:base64DataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Encode and decode data using Base64.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="basicAuth" type="tns:restSecurityBasicAuth">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest security basic auth definition
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="batch-config" type="tns:batchResequencerConfig">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configures batch-processing resequence eip.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="bean" type="tns:beanDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Calls a java bean
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="beanPostProcessor" type="tns:camelBeanPostProcessor">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Spring specific DefaultCamelBeanPostProcessor which uses Spring
 BeanPostProcessor to post process beans.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="beanio" type="tns:beanioDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal Java beans to and from flat files (such as CSV, delimited,
 or fixed length formats).
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="bindy" type="tns:bindyDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal Java beans from and to flat payloads (such as CSV,
 delimited, fixed length formats, or FIX messages).
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="blacklistServiceFilter" type="tns:blacklistServiceCallServiceFilterConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="cachingServiceDiscovery" type="tns:cachingServiceCallServiceDiscoveryConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="camelContext" type="tns:camelContextFactoryBean">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 CamelContext using XML configuration.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="cbor" type="tns:cborDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Unmarshal a CBOR payload to POJO and back.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="choice" type="tns:choiceDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Routes messages based on a series of predicates
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="circuitBreaker" type="tns:circuitBreakerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="claimCheck" type="tns:claimCheckDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 The Claim Check EIP allows you to replace message content with a claim check (a
 unique key), which can be used to retrieve the message content at a later time.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="combinedServiceDiscovery" type="tns:combinedServiceCallServiceDiscoveryConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="combinedServiceFilter" type="tns:combinedServiceCallServiceFilterConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="constant" type="tns:constantExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 A fixed value set only once during the route startup.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="consulServiceDiscovery" type="tns:consulServiceCallServiceDiscoveryConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="consumerTemplate" type="tns:camelConsumerTemplateFactoryBean">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configures a ConsumerTemplate
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="contextScan" type="tns:contextScanDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Scans for Java org.apache.camel.builder.RouteBuilder instances in the context
 org.apache.camel.spi.Registry .
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="convertBodyTo" type="tns:convertBodyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Converts the message body to another type
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="crypto" type="tns:cryptoDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Encrypt and decrypt messages using Java Cryptography Extension (JCE).
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="csimple" type="tns:cSimpleExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate a compile simple expression language.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="csv" type="tns:csvDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Handle CSV (Comma Separated Values) payloads.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="customDataFormat" type="tns:customDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Delegate to a custom org.apache.camel.spi.DataFormat implementation via Camel
 registry.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="customLoadBalancer" type="tns:customLoadBalancerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Custom load balancer
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="customServiceFilter" type="tns:customServiceCallServiceFilterConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="dataFormats" type="tns:dataFormatsDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configure data formats.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="datasonnet" type="tns:datasonnetExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To use DataSonnet scripts in Camel expressions or predicates.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="defaultLoadBalancer" type="tns:defaultServiceCallServiceLoadBalancerConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="delay" type="tns:delayDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Delays processing for a specified length of time
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="delete" type="tns:deleteVerbDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest DELETE command
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="description" type="tns:descriptionDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To provide comments about the node.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="dnsServiceDiscovery" type="tns:dnsServiceCallServiceDiscoveryConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="doCatch" type="tns:catchDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Catches exceptions as part of a try, catch, finally block
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="doFinally" type="tns:finallyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Path traversed when a try, catch, finally block exits
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="doTry" type="tns:tryDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marks the beginning of a try, catch, finally block
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="dynamicRouter" type="tns:dynamicRouterDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Routes messages based on dynamic rules
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="endpoint" type="tns:camelEndpointFactoryBean">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Camel endpoint configuration
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="enrich" type="tns:enrichDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Enriches a message with data from a secondary resource
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="errorHandler" type="tns:errorHandlerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Error handler settings
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="etcdServiceDiscovery" type="tns:etcdServiceCallServiceDiscoveryConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="exchangeProperty" type="tns:exchangePropertyExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Get the value of named Camel Exchange property.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="export" type="tns:camelServiceExporterDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Used for export a service using Spring Remoting to hide the network call using
 an interface.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="expression" type="tns:expressionSubElementDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 A useful base class for an expression
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="expressionDefinition" type="tns:expression"/>
-
+    
   <xs:element name="failover" type="tns:failoverLoadBalancerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Failover load balancer The failover load balancer is capable of trying the next
 processor in case an Exchange failed with an exception during processing. You
 can constrain the failover to activate only when one exception of a list you
 specify occurs. If you do not specify a list any exception will cause fail over
 to occur. This balancer uses the same strategy for matching exceptions as the
 Exception Clause does for the onException.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="faultToleranceConfiguration" type="tns:faultToleranceConfigurationDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 MicroProfile Fault Tolerance Circuit Breaker EIP configuration
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="fhirJson" type="tns:fhirJsonDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshall and unmarshall FHIR objects to/from JSON.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="fhirXml" type="tns:fhirXmlDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshall and unmarshall FHIR objects to/from XML.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="filter" type="tns:filterDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Filter out messages based using a predicate
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="flatpack" type="tns:flatpackDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal Java lists and maps to/from flat files (such as CSV,
 delimited, or fixed length formats) using Flatpack library.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="fluentTemplate" type="tns:camelFluentProducerTemplateFactoryBean">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configures a org.apache.camel.FluentProducerTemplate
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="from" type="tns:fromDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Act as a message source as input to a route
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="get" type="tns:getVerbDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest GET command
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="globalOption" type="tns:globalOptionDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Models a string key/value pair for configuring some global options on a Camel
 context such as max debug log length.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="globalOptions" type="tns:globalOptionsDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Models a series of string key/value pairs for configuring some global options on
 a Camel context such as max debug log length.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="grok" type="tns:grokDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Unmarshal unstructured data to objects using Logstash based Grok patterns.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="groovy" type="tns:groovyExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate a Groovy script.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="gzipdeflater" type="tns:gzipDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Compress and decompress messages using java.util.zip.GZIPStream.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="head" type="tns:headVerbDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest HEAD command
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="header" type="tns:headerExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Get the value of the named Camel Message header.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="healthyServiceFilter" type="tns:healthyServiceCallServiceFilterConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="hl7" type="tns:hl7DataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal HL7 (Health Care) model objects using the HL7 MLLP codec.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="hl7terser" type="tns:hl7TerserExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Get the value of an HL7 message field specified by terse location specification
 syntax.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="hystrixConfiguration" type="tns:hystrixConfigurationDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Hystrix Circuit Breaker EIP configuration
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="ical" type="tns:icalDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal iCal (.ics) documents to/from model objects provided by
 the iCal4j library.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="idempotentConsumer" type="tns:idempotentConsumerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Filters out duplicate messages
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="inOnly" type="tns:inOnlyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marks the exchange pattern for the route to one way
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="inOut" type="tns:inOutDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marks the exchange pattern for the route to request/reply
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="inputType" type="tns:inputTypeDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Set the expected data type of the input message. If the actual message type is
 different at runtime, camel look for a required Transformer and apply if exists.
 If validate attribute is true then camel applies Validator as well. Type name
@@ -631,250 +782,310 @@ consists of two parts, 'scheme' and 'name' connected with ':'. For Java type
 it works like a wildcard. If only 'xml' is specified, all the XML message
 matches. It's handy to add only one transformer/validator for all the
 transformation from/to XML.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="intercept" type="tns:interceptDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Intercepts a message at each step in the route
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="interceptFrom" type="tns:interceptFromDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Intercepts incoming messages
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="interceptSendToEndpoint" type="tns:interceptSendToEndpointDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Intercepts messages being sent to an endpoint
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="jacksonxml" type="tns:jacksonXMLDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Unmarshal a XML payloads to POJOs and back using XMLMapper extension of Jackson.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="jaxb" type="tns:jaxbDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Unmarshal XML payloads to POJOs and back using JAXB2 XML marshalling standard.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="jmxAgent" type="tns:camelJMXAgentDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 JMX configuration.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="joor" type="tns:joorExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate a jOOR (Java compiled once at runtime) expression language.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="json" type="tns:jsonDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal POJOs to JSON and back.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="jsonApi" type="tns:jsonApiDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal JSON:API resources using JSONAPI-Converter library.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="jsonpath" type="tns:jsonPathExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate a JsonPath expression against a JSON message body.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="keyStoreParameters" type="tns:keyStoreParametersFactoryBean"/>
-
+    
   <xs:element name="kubernetesServiceDiscovery" type="tns:kubernetesServiceCallServiceDiscoveryConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="language" type="tns:languageExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate the given expression using the specified language.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="loadBalance" type="tns:loadBalanceDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Balances message processing among a number of nodes
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="loadBalancerConfiguration" type="tns:serviceCallServiceLoadBalancerConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="log" type="tns:logDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Logs the defined message to the logger
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="loop" type="tns:loopDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Processes a message multiple times
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="lzf" type="tns:lzfDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Compress and decompress streams using LZF deflate algorithm.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="marshal" type="tns:marshalDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshals data into a specified format for transmission over a transport or
 component
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="method" type="tns:methodCallExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Call a method of the specified Java bean passing the Exchange, Body or specific
 headers to it.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="mime-multipart" type="tns:mimeMultipartDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal Camel messages with attachments into MIME-Multipart messages and back.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="multicast" type="tns:multicastDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Routes the same message to multiple paths either sequentially or in parallel.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="mvel" type="tns:mvelExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate an MVEL template against the Camel Exchange.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="oauth2" type="tns:restSecurityOAuth2">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest security OAuth2 definition
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="ognl" type="tns:ognlExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate an Apache Commons Object Graph Navigation Library (OGNL) expression
 against the Camel Exchange.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="onCompletion" type="tns:onCompletionDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Route to be executed when normal route processing completes
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="onException" type="tns:onExceptionDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Route to be executed when an exception is thrown
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="onFallback" type="tns:onFallbackDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Route to be executed when Hystrix EIP executes fallback
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="optimisticLockRetryPolicy" type="tns:optimisticLockRetryPolicyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To configure optimistic locking
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="otherwise" type="tns:otherwiseDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Route to be executed when all other choices evaluate to false
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="outputType" type="tns:outputTypeDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Set the expected data type of the output message. If the actual message type is
 different at runtime, camel look for a required Transformer and apply if exists.
 If validate attribute is true then camel applies Validator as well. Type name
@@ -884,1629 +1095,2164 @@ consists of two parts, 'scheme' and 'name' connected with ':'. For Java type
 it works like a wildcard. If only 'xml' is specified, all the XML message
 matches. It's handy to add only one transformer/validator for all the XML-Java
 transformation.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="packageScan" type="tns:packageScanDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Scans for Java org.apache.camel.builder.RouteBuilder classes in java packages
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="param" type="tns:restOperationParamDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To specify the rest operation parameters using Swagger. This maps to the Swagger
 Parameter Message Object.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="passThroughServiceFilter" type="tns:passThroughServiceCallServiceFilterConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="patch" type="tns:patchVerbDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest PATCH command
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="pgp" type="tns:pgpDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Encrypt and decrypt messages using Java Cryptographic Extension (JCE) and PGP.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="pipeline" type="tns:pipelineDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Routes the message to a sequence of processors.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="policy" type="tns:policyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Defines a policy the route will use
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="pollEnrich" type="tns:pollEnrichDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Enriches messages with data polled from a secondary resource
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="post" type="tns:postVerbDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest POST command
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="process" type="tns:processDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Calls a Camel processor
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="propertiesFunction" type="tns:camelPropertyPlaceholderFunctionDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Function to use with properties placeholder
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="propertiesLocation" type="tns:camelPropertyPlaceholderLocationDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Properties to use with properties placeholder
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="property" type="tns:propertyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 A key value pair
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="propertyPlaceholder" type="tns:camelPropertyPlaceholderDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Properties placeholder
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="protobuf" type="tns:protobufDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Serialize and deserialize Java objects using Google's Protocol buffers.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="proxy" type="tns:camelProxyFactoryDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To proxy a service call using a interface
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="put" type="tns:putVerbDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest PUT command
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="random" type="tns:randomLoadBalancerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Random load balancer The random load balancer selects a random endpoint for each
 exchange.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="recipientList" type="tns:recipientListDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Routes messages to a number of dynamically specified recipients (dynamic to)
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="redeliveryPolicy" type="tns:redeliveryPolicyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To configure re-delivery for error handling
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="redeliveryPolicyProfile" type="tns:camelRedeliveryPolicyFactoryBean">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configuration of redelivery policy.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="ref" type="tns:refExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Look up an expression in the Camel Registry and evaluate it.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="removeHeader" type="tns:removeHeaderDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Removes a named header from the message
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="removeHeaders" type="tns:removeHeadersDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Removes message headers whose name matches a specified pattern
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="removeProperties" type="tns:removePropertiesDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Removes message exchange properties whose name matches a specified pattern
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="removeProperty" type="tns:removePropertyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Removes a named property from the message exchange
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="resequence" type="tns:resequenceDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Resequences (re-order) messages based on an expression
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="resilience4jConfiguration" type="tns:resilience4JConfigurationDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Resilience4j Circuit Breaker EIP configuration
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="responseHeader" type="tns:restOperationResponseHeaderDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To specify the rest operation response headers using Swagger. This maps to the
 Swagger Response Header Object.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="responseMessage" type="tns:restOperationResponseMsgDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To specify the rest operation response messages using Swagger. This maps to the
 Swagger Response Message Object.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="rest" type="tns:restDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Defines a rest service using the rest-dsl
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="restBinding" type="tns:restBindingDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To configure rest binding
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="restConfiguration" type="tns:restConfigurationDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To configure rest
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="restContext" type="tns:camelRestContextFactoryBean">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configuration of REST services using rest-dsl using XML
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="restContextRef" type="tns:restContextRefDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To refer to an XML file with rest services defined using the rest-dsl
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="restProperty" type="tns:restPropertyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 A key value pair
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="rests" type="tns:restsDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 A series of rest services defined using the rest-dsl
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="ribbonLoadBalancer" type="tns:ribbonServiceCallServiceLoadBalancerConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="rollback" type="tns:rollbackDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Forces a rollback by stopping routing the message
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="roundRobin" type="tns:roundRobinLoadBalancerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Round robin load balancer The round robin load balancer will use the next
 endpoint for each message. This load balancer is not meant to work with
 failover, for that you should use the dedicated failover load balancer.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="route" type="tns:routeDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 A Camel route
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="routeBuilder" type="tns:routeBuilderDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To refer to a Java org.apache.camel.builder.RouteBuilder instance to use.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="routeContext" type="tns:camelRouteContextFactoryBean">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configuration of routes using XML
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="routeContextRef" type="tns:routeContextRefDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To refer to an XML file with routes defined using the xml-dsl
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="routeController" type="tns:camelRouteControllerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Route controller configuration.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="routeTemplate" type="tns:routeTemplateDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Defines a route template (parameterized routes)
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="routeTemplateContext" type="tns:camelRouteTemplateContextFactoryBean">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configuration of route templates using XML
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="routeTemplateContextRef" type="tns:routeTemplateContextRefDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To refer to an XML file with route templates defined using the xml-dsl
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="routeTemplates" type="tns:routeTemplatesDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 A series of route templates
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="routes" type="tns:routesDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 A series of Camel routes
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="routingSlip" type="tns:routingSlipDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Routes a message through a series of steps that are pre-determined (the slip)
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="rss" type="tns:rssDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Transform from ROME SyndFeed Java Objects to XML and vice-versa.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="saga" type="tns:sagaDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Enables sagas on the route
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="sample" type="tns:samplingDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Extract a sample of the messages passing through a route
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="script" type="tns:scriptDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Executes a script from a language which does not change the message body.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="secureRandomParameters" type="tns:secureRandomParametersFactoryBean"/>
-
+    
   <xs:element name="secureXML" type="tns:xmlSecurityDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Encrypt and decrypt XML payloads using Apache Santuario.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="security" type="tns:securityDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest security definition
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="securityDefinitions" type="tns:restSecuritiesDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To configure rest security definitions.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="serviceCall" type="tns:serviceCallDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To call remote services
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="serviceCallConfiguration" type="tns:serviceCallConfigurationDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Remote service call configuration
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="serviceChooserConfiguration" type="tns:serviceCallServiceChooserConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="serviceDiscoveryConfiguration" type="tns:serviceCallServiceDiscoveryConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="serviceExpression" type="tns:serviceCallExpressionConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="serviceFilterConfiguration" type="tns:serviceCallServiceFilterConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="setBody" type="tns:setBodyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Sets the contents of the message body
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="setExchangePattern" type="tns:setExchangePatternDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Sets the exchange pattern on the message exchange
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="setHeader" type="tns:setHeaderDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Sets the value of a message header
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="setProperty" type="tns:setPropertyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Sets a named property on the message exchange
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="simple" type="tns:simpleExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate Camel's built-in Simple language expression against the Camel Exchange.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="soapjaxb" type="tns:soapJaxbDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal Java objects to SOAP messages and back.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="sort" type="tns:sortDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Sorts the contents of the message
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="spel" type="tns:spELExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate a Spring Expression Language (SpEL) expression against the Camel
 Exchange.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="split" type="tns:splitDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Splits a single message into many sub-messages.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="sslContextParameters" type="tns:sslContextParametersFactoryBean"/>
-
+    
   <xs:element name="staticServiceDiscovery" type="tns:staticServiceCallServiceDiscoveryConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="step" type="tns:stepDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Routes the message to a sequence of processors which is grouped together as one
 logical name
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="sticky" type="tns:stickyLoadBalancerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Sticky load balancer Sticky load balancing using an Expression to calculate a
 correlation key to perform the sticky load balancing; rather like jsessionid in
 the web or JMSXGroupID in JMS.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="stop" type="tns:stopDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Stops the processing of the current message
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="stream-config" type="tns:streamResequencerConfig">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configures stream-processing resequence eip.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="streamCaching" type="tns:camelStreamCachingStrategyDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Stream caching configuration.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="syslog" type="tns:syslogDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshall SyslogMessages to RFC3164 and RFC5424 messages and back.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="tarfile" type="tns:tarFileDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Archive files into tarballs or extract files from tarballs.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="template" type="tns:camelProducerTemplateFactoryBean">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configures a ProducerTemplate
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="templateParameter" type="tns:routeTemplateParameterDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 A route template parameter
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="threadPool" type="tns:camelThreadPoolFactoryBean">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Configuration of thread pools
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="threadPoolProfile" type="tns:threadPoolProfileDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To configure thread pools
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="threads" type="tns:threadsDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Specifies that all steps after this node are processed asynchronously
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="thrift" type="tns:thriftDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Serialize and deserialize messages using Apache Thrift binary data format.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="throttle" type="tns:throttleDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Controls the rate at which messages are passed to the next node in the route
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="throwException" type="tns:throwExceptionDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Throws an exception
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="tidyMarkup" type="tns:tidyMarkupDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Parse (potentially invalid) HTML into valid HTML or DOM.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="to" type="tns:toDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Sends the message to a static endpoint
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="toD" type="tns:toDynamicDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Sends the message to a dynamic endpoint You can specify multiple languages in
 the uri separated by the plus sign, such as mock:language:xpath:/order/uri where
 mock: would be a prefix to a xpath expression. For more dynamic behavior use
 Recipient List or Dynamic Router EIP instead.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="tokenize" type="tns:tokenizerExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Tokenize text payloads using the specified delimiter patterns.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="topic" type="tns:topicLoadBalancerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Topic load balancer The topic load balancer sends to all destinations (rather
 like JMS Topics)
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="transacted" type="tns:transactedDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Enables transaction on the route
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="transform" type="tns:transformDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Transforms the message body based on an expression
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="transformers" type="tns:transformersDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To configure transformers.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="typeFilter" type="tns:yamlTypeFilterDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="univocity-csv" type="tns:uniVocityCsvDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal Java objects from and to CSV (Comma Separated Values)
 using UniVocity Parsers.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="univocity-fixed" type="tns:uniVocityFixedWidthDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal Java objects from and to fixed length records using
 UniVocity Parsers.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="univocity-header" type="tns:uniVocityHeader">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To configure headers for UniVocity data formats.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="univocity-tsv" type="tns:uniVocityTsvDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal Java objects from and to TSV (Tab-Separated Values)
 records using UniVocity Parsers.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="unmarshal" type="tns:unmarshalDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Converts the message data received from the wire into a format that Apache Camel
 processors can consume
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="validate" type="tns:validateDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Validates a message based on an expression
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="validators" type="tns:validatorsDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 To configure validators.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="verb" type="tns:verbDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Rest command
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="weighted" type="tns:weightedLoadBalancerDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Weighted load balancer The weighted load balancing policy allows you to specify
 a processing load distribution ratio for each server with respect to others. In
 addition to the weight, endpoint selection is then further refined using random
 distribution based on weight.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="when" type="tns:whenDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Triggers a route when an expression evaluates to true
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="whenSkipSendToEndpoint" type="tns:whenSkipSendToEndpointDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Predicate to determine if the message should be sent or not to the endpoint,
 when using interceptSentToEndpoint.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="wireTap" type="tns:wireTapDefinition">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Routes a copy of a message (or creates a new message) to a secondary destination
 while continue routing the original message.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="xmlrpc" type="tns:xmlRpcDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal XML RPC protocol requests or responses.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="xpath" type="tns:xPathExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate an XPath expression against an XML payload.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="xquery" type="tns:xQueryExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Evaluate an XQuery expressions against an XML payload.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="xstream" type="tns:xStreamDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal POJOs to/from XML using XStream library.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="xtokenize" type="tns:xmlTokenizerExpression">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Tokenize XML payloads using the specified path expression.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="yaml" type="tns:yamlDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Marshal and unmarshal Java objects to and from YAML.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="zipdeflater" type="tns:zipDeflaterDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Compress and decompress streams using java.util.zip.Deflater and
 java.util.zip.Inflater.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="zipfile" type="tns:zipFileDataFormat">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 Compression and decompress streams using java.util.zip.ZipStream.
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:element name="zookeeperServiceDiscovery" type="tns:zooKeeperServiceCallServiceDiscoveryConfiguration">
     <xs:annotation>
-      <xs:documentation xml:lang="en"><![CDATA[
+      <xs:documentation xml:lang="en">
+        <![CDATA[
 null
-      ]]></xs:documentation>
+      ]]>
+      </xs:documentation>
     </xs:annotation>
   </xs:element>
-
+    
   <xs:complexType abstract="true" name="abstractCamelConsumerTemplateFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractCamelFactoryBean">
+                
         <xs:sequence/>
+                
         <xs:attribute name="maximumCacheSize" type="xs:int">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets a custom maximum cache size to use in the backing cache pools.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractCamelFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+                
         <xs:attribute name="camelContextId" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Id of CamelContext to use if there are multiple CamelContexts in the same JVM.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="identifiedType">
+        
     <xs:sequence/>
+        
     <xs:attribute name="id" type="xs:ID">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 The id of this node.
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractCamelContextFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractCamelEndpointFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractCamelFactoryBean">
+                
         <xs:sequence>
+                    
           <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:property"/>
+                  
         </xs:sequence>
+                
         <xs:attribute name="uri" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the URI to use to resolve the endpoint. Notice that additional options can
 be configured using a series of property.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="propertyDefinition">
+        
     <xs:sequence/>
+        
     <xs:attribute name="key" type="xs:string" use="required">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Property key.
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+        
     <xs:attribute name="value" type="xs:string" use="required">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Property value.
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractCamelFluentProducerTemplateFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractCamelFactoryBean">
+                
         <xs:sequence/>
+                
         <xs:attribute name="defaultEndpoint" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the default endpoint URI used by default for sending message exchanges.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="maximumCacheSize" type="xs:int">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets a custom maximum cache size to use in the backing cache pools.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractCamelProducerTemplateFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractCamelFactoryBean">
+                
         <xs:sequence/>
+                
         <xs:attribute name="defaultEndpoint" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the default endpoint URI used by default for sending message exchanges.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="maximumCacheSize" type="xs:int">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets a custom maximum cache size to use in the backing cache pools.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractCamelRedeliveryPolicyFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractCamelFactoryBean">
+                
         <xs:sequence/>
+                
         <xs:attribute name="maximumRedeliveries" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the maximum number of times a message exchange will be redelivered. Setting
 a negative value will retry forever.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="redeliveryDelay" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the maximum redelivery delay. Use -1 if you wish to have no maximum.
 Default value: 1000
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="asyncDelayedRedelivery" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether asynchronous delayed redelivery is allowed. This is disabled by
 default. When enabled it allows Camel to schedule a future task for delayed
 redelivery which prevents current thread from blocking while waiting. Exchange
 which is transacted will however always use synchronous delayed redelivery
 because the transaction must execute in the same thread context. Default value:
 false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="backOffMultiplier" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the multiplier used to increase the delay between redeliveries if
 useExponentialBackOff is enabled. Default value: 2
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="useExponentialBackOff" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Enables/disables exponential backoff using the backOffMultiplier to increase the
 time between retries. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="collisionAvoidanceFactor" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the factor used for collision avoidance if enabled via
 useCollisionAvoidance. Default value: 0.15
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="useCollisionAvoidance" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Enables/disables collision avoidance which adds some randomization to the
 backoff timings to reduce contention probability. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="maximumRedeliveryDelay" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the maximum redelivery delay. Use -1 if you wish to have no maximum.
 Default value: 60000
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="retriesExhaustedLogLevel" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the logging level to use for log messages when retries have been exhausted.
 Default value: ERROR
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="retryAttemptedLogLevel" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the logging level to use for log messages when retries are attempted.
 Default value: DEBUG
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="retryAttemptedLogInterval" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the interval for log messages when retries are attempted. Default value: 0
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="logRetryAttempted" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether to log retry attempts. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="logStackTrace" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether stack traces should be logged or not. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="logRetryStackTrace" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether stack traces should be logged or not. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="logHandled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether errors should be logged even if its handled. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="logNewException" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether errors should be logged when a new exception occurred during
 handling a previous exception. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="logContinued" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether errors should be logged even if its continued. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="logExhausted" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether exhausted exceptions should be logged or not. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="logExhaustedMessageHistory" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether to log exhausted errors including message history. Default value:
 false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="logExhaustedMessageBody" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether exhausted message body/headers should be logged with message
 history included. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="disableRedelivery" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Disables redelivery by setting maximum redeliveries to 0. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="delayPattern" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets an optional delay pattern to use instead of fixed delay.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="allowRedeliveryWhileStopping" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Controls whether to allow redelivery while stopping/shutting down a route that
 uses error handling. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="exchangeFormatterRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the reference of the instance of org.apache.camel.spi.ExchangeFormatter to
 generate the log message from exchange.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractCamelThreadPoolFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractCamelFactoryBean">
+                
         <xs:sequence/>
+                
         <xs:attribute name="poolSize" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the core pool size (threads to keep minimum in pool).
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="maxPoolSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the maximum pool size.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="keepAliveTime" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the keep alive time for inactive threads.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="timeUnit" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the time unit used for keep alive time. Default value: SECONDS
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="maxQueueSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the maximum number of tasks in the work queue. Use -1 for an unbounded
 queue.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="allowCoreThreadTimeOut" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether to allow core threads to timeout.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="rejectedPolicy" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the handler for tasks which cannot be executed by the thread pool. Default
 value: CallerRuns
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="threadName" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 To use a custom thread name / pattern.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="scheduled" type="xs:boolean">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether to use a scheduled thread pool. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="camelJMXAgentDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+                
         <xs:attribute name="disabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Disable JMI (default false). Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="onlyRegisterProcessorWithCustomId" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Only register processor if a custom id was defined for it. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="mbeanServerDefaultDomain" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 MBean server default domain name (default org.apache.camel). Default value:
 org.apache.camel
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="mbeanObjectDomainName" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 MBean object domain name (default org.apache.camel). Default value:
 org.apache.camel
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="usePlatformMBeanServer" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A flag that indicates whether the platform mbean server should be used. Default
 value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="registerAlways" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A flag that indicates whether to register mbeans always. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="registerNewRoutes" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A flag that indicates whether to register mbeans when starting new routes.
 Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="statisticsLevel" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Level of granularity for performance statistics enabled. Default value: Default
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="loadStatisticsEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A flag that indicates whether Load statistics is enabled. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="endpointRuntimeStatisticsEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A flag that indicates whether endpoint runtime statistics is enabled. Default
 value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="includeHostName" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A flag that indicates whether to include hostname in JMX MBean names. Default
 value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="useHostIPAddress" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A flag that indicates whether to use hostname or IP Address in the service url.
 Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="mask" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A flag that indicates whether to remove detected sensitive information (such as
 passwords) from MBean names and attributes. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="camelPropertyPlaceholderDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence>
+                    
           <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:propertiesFunction"/>
+                    
           <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:propertiesLocation"/>
+                  
         </xs:sequence>
+                
         <xs:attribute name="location" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A list of locations to load properties. You can use comma to separate multiple
 locations. This option will override any default locations and only use the
 locations from this option.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="encoding" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Encoding to use when loading properties file from the file system or classpath.
 If no encoding has been set, then the properties files is loaded using
 ISO-8859-1 encoding (latin-1) as documented by
 java.util.Properties#load(java.io.InputStream).
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="ignoreMissingLocation" type="xs:boolean">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether to silently ignore if a location cannot be located, such as a properties
 file not found. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="propertiesParserRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Reference to a custom PropertiesParser to be used.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="defaultFallbackEnabled" type="xs:boolean">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If false, the component does not attempt to find a default for the key by
 looking after the colon separator. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="camelPropertyPlaceholderFunctionDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+                
         <xs:attribute name="ref" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Reference to the custom properties function to lookup in the registry.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="camelPropertyPlaceholderLocationDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+                
         <xs:attribute name="resolver" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The resolver to use to locate the location. Default value: classpath
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="path" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Property locations to use.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="optional" type="xs:boolean">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If the location is optional. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="camelProxyFactoryDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+                
         <xs:attribute name="serviceUrl" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The camel endpoint uri used to send the message to when calling the service from
 the interface.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="serviceInterface" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Java interfaces to use as facade for the service to be proxied.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="camelContextId" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The id of the CamelContext to use, if there is multiple CamelContext in the same
 JVM.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="camelRouteControllerDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+                
         <xs:attribute name="supervising" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 To enable using supervising route controller which allows Camel to startup and
 then the controller takes care of starting the routes in a safe manner. This can
 be used when you want to startup Camel despite a route may otherwise fail fast
@@ -2514,554 +3260,846 @@ during startup and cause Camel to fail to startup as well. By delegating the
 route startup to the supervising route controller then its manages the startup
 using a background thread. The controller allows to be configured with various
 settings to attempt to restart failing routes. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="includeRoutes" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Pattern for filtering routes to be included as supervised. The pattern is
 matching on route id, and endpoint uri for the route. Multiple patterns can be
 separated by comma. For example to include all kafka routes, you can say kafka:.
 And to include routes with specific route ids myRoute,myOtherRoute. The pattern
 supports wildcards and uses the matcher from
 org.apache.camel.support.PatternHelper#matchPattern.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="excludeRoutes" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Pattern for filtering routes to be excluded as supervised. The pattern is
 matching on route id, and endpoint uri for the route. Multiple patterns can be
 separated by comma. For example to exclude all JMS routes, you can say jms:. And
 to exclude routes with specific route ids mySpecialRoute,myOtherSpecialRoute.
 The pattern supports wildcards and uses the matcher from
 org.apache.camel.support.PatternHelper#matchPattern.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="threadPoolSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The number of threads used by the scheduled thread pool that are used for
 restarting routes. The pool uses 1 thread by default, but you can increase this
 to allow the controller to concurrently attempt to restart multiple routes in
 case more than one route has problems starting. Default value: 1
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="initialDelay" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Initial delay in milli seconds before the route controller starts, after
 CamelContext has been started.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="backOffDelay" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Backoff delay in millis when restarting a route that failed to startup. Default
 value: 2000
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="backOffMaxDelay" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Backoff maximum delay in millis when restarting a route that failed to startup.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="backOffMaxElapsedTime" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Backoff maximum elapsed time in millis, after which the backoff should be
 considered exhausted and no more attempts should be made.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="backOffMaxAttempts" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Backoff maximum number of attempts to restart a route that failed to startup.
 When this threshold has been exceeded then the controller will give up
 attempting to restart the route, and the route will remain as stopped.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="backOffMultiplier" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Backoff multiplier to use for exponential backoff. This is used to extend the
 delay between restart attempts. Default value: 1.0
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="unhealthyOnExhausted" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether to mark the route as unhealthy (down) when all restarting attempts
 (backoff) have failed and the route is not successfully started and the route
 manager is giving up. Setting this to true allows health checks to know about
 this and can report the Camel application as DOWN. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="camelServiceExporterDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+                
         <xs:attribute name="uri" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Camel endpoint uri to use a remote transport when calling the service.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="serviceRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Reference to the service name to lookup in the registry.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="method" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Name of method to invoke on service.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="serviceInterface" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Java interfaces to use as facade for the service to be exported.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="camelContextId" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The id of the CamelContext to use, if there is multiple CamelContext in the same
 JVM.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="camelStreamCachingStrategyDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+                
         <xs:attribute name="enabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether the stream caching is enabled. Notice: This cannot be changed at
 runtime. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="spoolDirectory" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the spool (temporary) directory to use for overflow and spooling to disk.
 If no spool directory has been explicit configured, then a temporary directory
 is created in the java.io.tmpdir directory.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="spoolCipher" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets a cipher name to use when spooling to disk to write with encryption. By
 default the data is not encrypted.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="spoolThreshold" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Threshold in bytes when overflow to disk is activated. The default threshold is
 org.apache.camel.StreamCache#DEFAULT_SPOOL_THRESHOLD bytes (eg 128kb). Use -1 to
 disable overflow to disk.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="spoolUsedHeapMemoryThreshold" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets a percentage (1-99) of used heap memory threshold to activate spooling to
 disk.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="spoolUsedHeapMemoryLimit" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets what the upper bounds should be when spoolUsedHeapMemoryThreshold is in
 use.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="spoolRules" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Reference to one or more custom
 org.apache.camel.spi.StreamCachingStrategy.SpoolRule to use. Multiple rules can
 be separated by comma.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="bufferSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the buffer size to use when allocating in-memory buffers used for in-memory
 stream caches. The default size is
 org.apache.camel.util.IOHelper#DEFAULT_BUFFER_SIZE.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="removeSpoolDirectoryWhenStopping" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether to remove the temporary directory when stopping. This option is default
 true. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="statisticsEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether statistics is enabled.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="anySpoolRules" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether if just any of the
 org.apache.camel.spi.StreamCachingStrategy.SpoolRule rules returns true then
 shouldSpoolCache(long) returns true. If this option is false, then all the
 org.apache.camel.spi.StreamCachingStrategy.SpoolRule must return true. The
 default value is false which means that all the rules must return true. Default
 value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="patternBasedPackageScanFilter">
+        
     <xs:sequence/>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractJsseUtilFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractCamelFactoryBean">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractKeyManagersParametersFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractJsseUtilFactoryBean">
+                
         <xs:sequence/>
+                
         <xs:attribute name="keyPassword" type="xs:string"/>
+                
         <xs:attribute name="provider" type="xs:string"/>
+                
         <xs:attribute name="algorithm" type="xs:string"/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractKeyStoreParametersFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractJsseUtilFactoryBean">
+                
         <xs:sequence/>
+                
         <xs:attribute name="type" type="xs:string"/>
+                
         <xs:attribute name="password" type="xs:string"/>
+                
         <xs:attribute name="provider" type="xs:string"/>
+                
         <xs:attribute name="resource" type="xs:string"/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractSecureRandomParametersFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractJsseUtilFactoryBean">
+                
         <xs:sequence/>
+                
         <xs:attribute name="algorithm" type="xs:string" use="required"/>
+                
         <xs:attribute name="provider" type="xs:string"/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="abstractTrustManagersParametersFactoryBean">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:abstractJsseUtilFactoryBean">
+                
         <xs:sequence/>
+                
         <xs:attribute name="provider" type="xs:string"/>
+                
         <xs:attribute name="algorithm" type="xs:string"/>
+                
         <xs:attribute name="trustManager" type="xs:string"/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="cipherSuitesParameters">
+        
     <xs:sequence>
+            
       <xs:element maxOccurs="unbounded" minOccurs="0" name="cipherSuite" nillable="true" type="xs:string"/>
+          
     </xs:sequence>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="filterParameters">
+        
     <xs:sequence>
+            
       <xs:element maxOccurs="unbounded" minOccurs="0" name="include" nillable="true" type="xs:string"/>
+            
       <xs:element maxOccurs="unbounded" minOccurs="0" name="exclude" nillable="true" type="xs:string"/>
+          
     </xs:sequence>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="sniHostNames">
+        
     <xs:sequence>
+            
       <xs:element maxOccurs="unbounded" minOccurs="0" name="sniHostName" type="xs:string"/>
+          
     </xs:sequence>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="secureSocketProtocolsParameters">
+        
     <xs:sequence>
+            
       <xs:element maxOccurs="unbounded" minOccurs="0" name="secureSocketProtocol" nillable="true" type="xs:string"/>
+          
     </xs:sequence>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="output">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:processorDefinition">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="processorDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:optionalIdentifiedDefinition">
+                
         <xs:sequence/>
+                
         <xs:attribute name="inheritErrorHandler" type="xs:boolean"/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="optionalIdentifiedDefinition">
+        
     <xs:sequence>
+            
       <xs:element minOccurs="0" ref="tns:description"/>
+          
     </xs:sequence>
+        
     <xs:attribute name="customId" type="xs:boolean"/>
+        
     <xs:attribute name="id" type="xs:string">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Sets the id of this node.
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="descriptionDefinition">
+        
     <xs:simpleContent>
+            
       <xs:extension base="xs:string">
+                
         <xs:attribute name="lang" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Language, such as en for english.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:simpleContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="aggregateDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:output">
+                
         <xs:sequence>
+                    
           <xs:element name="correlationExpression" type="tns:expressionSubElementDefinition"/>
+                    
           <xs:element minOccurs="0" name="completionPredicate" type="tns:expressionSubElementDefinition"/>
+                    
           <xs:element minOccurs="0" name="completionTimeoutExpression" type="tns:expressionSubElementDefinition"/>
+                    
           <xs:element minOccurs="0" name="completionSizeExpression" type="tns:expressionSubElementDefinition"/>
+                    
           <xs:element minOccurs="0" ref="tns:optimisticLockRetryPolicy"/>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+                
         <xs:attribute name="parallelProcessing" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 When aggregated are completed they are being send out of the aggregator. This
 option indicates whether or not Camel should use a thread pool with multiple
 threads for concurrency. If no custom thread pool has been specified then Camel
 creates a default pool with 10 concurrent threads. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="optimisticLocking" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Turns on using optimistic locking, which requires the aggregationRepository
 being used, is supporting this by implementing
 org.apache.camel.spi.OptimisticLockingAggregationRepository . Default value:
 false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="executorServiceRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If using parallelProcessing you can specify a custom thread pool to be used. In
 fact also if you are not using parallelProcessing this custom thread pool is
 used to send out aggregated exchanges as well.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="timeoutCheckerExecutorServiceRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If using either of the completionTimeout, completionTimeoutExpression, or
 completionInterval options a background thread is created to check for the
 completion for every aggregator. Set this option to provide a custom thread pool
 to be used rather than creating a new thread for every aggregator.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="aggregationRepositoryRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the custom aggregate repository to use. Will by default use
 org.apache.camel.processor.aggregate.MemoryAggregationRepository.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="strategyRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A reference to lookup the AggregationStrategy in the Registry. Configuring an
 AggregationStrategy is required, and is used to merge the incoming Exchange with
 the existing already merged exchanges. At first call the oldExchange parameter
 is null. On subsequent invocations the oldExchange contains the merged exchanges
 and newExchange is of course the new incoming Exchange.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="strategyMethodName" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 This option can be used to explicit declare the method name to use, when using
 POJOs as the AggregationStrategy.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="strategyMethodAllowNull" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If this option is false then the aggregate method is not used for the very first
 aggregation. If this option is true then null values is used as the oldExchange
 (at the very first aggregation), when using POJOs as the AggregationStrategy.
 Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="completionSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Number of messages aggregated before the aggregation is complete. This option
 can be set as either a fixed value or using an Expression which allows you to
 evaluate a size dynamically - will use Integer as result. If both are set Camel
 will fallback to use the fixed value if the Expression result was null or 0.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="completionInterval" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A repeating period in millis by which the aggregator will complete all current
 aggregated exchanges. Camel has a background task which is triggered every
 period. You cannot use this option together with completionTimeout, only one of
 them can be used.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="completionTimeout" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Time in millis that an aggregated exchange should be inactive before its
 complete (timeout). This option can be set as either a fixed value or using an
 Expression which allows you to evaluate a timeout dynamically - will use Long as
@@ -3073,98 +4111,128 @@ option to configure how frequently to run the checker. The timeout is an
 approximation and there is no guarantee that the a timeout is triggered exactly
 after the timeout value. It is not recommended to use very low timeout values or
 checker intervals.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="completionTimeoutCheckerInterval" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Interval in millis that is used by the background task that checks for timeouts
 ( org.apache.camel.TimeoutMap ). By default the timeout checker runs every
 second. The timeout is an approximation and there is no guarantee that the a
 timeout is triggered exactly after the timeout value. It is not recommended to
 use very low timeout values or checker intervals. Default value: 1s
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="completionFromBatchConsumer" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Enables the batch completion mode where we aggregate from a
 org.apache.camel.BatchConsumer and aggregate the total number of exchanges the
 org.apache.camel.BatchConsumer has reported as total by checking the exchange
 property org.apache.camel.Exchange#BATCH_COMPLETE when its complete. This option
 cannot be used together with discardOnAggregationFailure. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="completionOnNewCorrelationGroup" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Enables completion on all previous groups when a new incoming correlation group.
 This can for example be used to complete groups with same correlation keys when
 they are in consecutive order. Notice when this is enabled then only 1
 correlation group can be in progress as when a new correlation group starts,
 then the previous groups is forced completed. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="eagerCheckCompletion" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Use eager completion checking which means that the completionPredicate will use
 the incoming Exchange. As opposed to without eager completion checking the
 completionPredicate will use the aggregated Exchange. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="ignoreInvalidCorrelationKeys" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If a correlation key cannot be successfully evaluated it will be ignored by
 logging a DEBUG and then just ignore the incoming Exchange. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="closeCorrelationKeyOnCompletion" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Closes a correlation key when its complete. Any late received exchanges which
 has a correlation key that has been closed, it will be defined and a
 ClosedCorrelationKeyException is thrown.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="discardOnCompletionTimeout" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Discards the aggregated message on completion timeout. This means on timeout the
 aggregated message is dropped and not sent out of the aggregator. Default value:
 false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="discardOnAggregationFailure" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Discards the aggregated message when aggregation failed (an exception was thrown
 from AggregationStrategy . This means the partly aggregated message is dropped
 and not sent out of the aggregator. This option cannot be used together with
 completionFromBatchConsumer. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="forceCompletionOnStop" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Indicates to complete all current aggregated exchanges when the context is
 stopped. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="completeAllOnStop" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Indicates to wait to complete all current and partial (pending) aggregated
 exchanges when the context is stopped. This also means that we will wait for all
 pending exchanges which are stored in the aggregation repository to complete so
@@ -3173,144 +4241,220 @@ using the memory based aggregation repository that is memory based only, and do
 not store data on disk. When this option is enabled, then the aggregator is
 waiting to complete all those exchanges before its stopped, when stopping
 CamelContext or the route using it. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="aggregateControllerRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 To use a org.apache.camel.processor.aggregate.AggregateController to allow
 external sources to control this aggregator.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="expressionSubElementDefinition">
+        
     <xs:choice>
+            
       <xs:element ref="tns:expressionDefinition"/>
+            
       <xs:element ref="tns:csimple"/>
+            
       <xs:element ref="tns:constant"/>
+            
       <xs:element ref="tns:datasonnet"/>
+            
       <xs:element ref="tns:exchangeProperty"/>
+            
       <xs:element ref="tns:groovy"/>
+            
       <xs:element ref="tns:header"/>
+            
       <xs:element ref="tns:hl7terser"/>
+            
       <xs:element ref="tns:joor"/>
+            
       <xs:element ref="tns:jsonpath"/>
+            
       <xs:element ref="tns:language"/>
+            
       <xs:element ref="tns:method"/>
+            
       <xs:element ref="tns:mvel"/>
+            
       <xs:element ref="tns:ognl"/>
+            
       <xs:element ref="tns:ref"/>
+            
       <xs:element ref="tns:simple"/>
+            
       <xs:element ref="tns:spel"/>
+            
       <xs:element ref="tns:tokenize"/>
+            
       <xs:element ref="tns:xtokenize"/>
+            
       <xs:element ref="tns:xpath"/>
+            
       <xs:element ref="tns:xquery"/>
+          
     </xs:choice>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="expression">
+        
     <xs:simpleContent>
+            
       <xs:extension base="xs:string">
+                
         <xs:attribute name="id" type="xs:ID">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the id of this node.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="trim" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether to trim the value to remove leading and trailing whitespaces and line
 breaks. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:simpleContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="optimisticLockRetryPolicyDefinition">
+        
     <xs:sequence/>
+        
     <xs:attribute name="maximumRetries" type="xs:string">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Sets the maximum number of retries.
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+        
     <xs:attribute name="retryDelay" type="xs:string">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Sets the delay in millis between retries. Default value: 50ms
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+        
     <xs:attribute name="maximumRetryDelay" type="xs:string">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Sets the upper value of retry in millis between retries, when using exponential
 or random backoff. Default value: 1s
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+        
     <xs:attribute name="exponentialBackOff" type="xs:string">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Enable exponential backoff. Default value: true
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+        
     <xs:attribute name="randomBackOff" type="xs:string">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Enables random backoff. Default value: false
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="beanDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:noOutputDefinition">
+                
         <xs:sequence/>
+                
         <xs:attribute name="ref" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets a reference to a bean to use.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="method" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the method name on the bean to use.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="beanType" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the Class of the bean.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="cache" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Deprecated: Use singleton option instead. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="scope" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Scope of bean. When using singleton scope (default) the bean is created or
 looked up only once and reused for the lifetime of the endpoint. The bean should
 be thread-safe in case concurrent threads is calling the bean at the same time.
@@ -3324,732 +4468,1217 @@ this is delegated to the bean registry such as Spring or CDI (if in use), which
 depends on their configuration can act as either singleton or prototype scope.
 so when using prototype scope then this depends on the bean registry
 implementation. Default value: Singleton
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="noOutputDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:processorDefinition">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="catchDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:output">
+                
         <xs:sequence>
+                    
           <xs:element maxOccurs="unbounded" minOccurs="0" name="exception" type="xs:string"/>
+                    
           <xs:element minOccurs="0" name="onWhen" type="tns:whenDefinition"/>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="whenDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:processorDefinition">
+                
         <xs:sequence>
+                    
           <xs:choice>
+                        
             <xs:element ref="tns:expressionDefinition"/>
+                        
             <xs:element ref="tns:csimple"/>
+                        
             <xs:element ref="tns:constant"/>
+                        
             <xs:element ref="tns:datasonnet"/>
+                        
             <xs:element ref="tns:exchangeProperty"/>
+                        
             <xs:element ref="tns:groovy"/>
+                        
             <xs:element ref="tns:header"/>
+                        
             <xs:element ref="tns:hl7terser"/>
+                        
             <xs:element ref="tns:joor"/>
+                        
             <xs:element ref="tns:jsonpath"/>
+                        
             <xs:element ref="tns:language"/>
+                        
             <xs:element ref="tns:method"/>
+                        
             <xs:element ref="tns:mvel"/>
+                        
             <xs:element ref="tns:ognl"/>
+                        
             <xs:element ref="tns:ref"/>
+                        
             <xs:element ref="tns:simple"/>
+                        
             <xs:element ref="tns:spel"/>
+                        
             <xs:element ref="tns:tokenize"/>
+                        
             <xs:element ref="tns:xtokenize"/>
+                        
             <xs:element ref="tns:xpath"/>
+                        
             <xs:element ref="tns:xquery"/>
+                      
           </xs:choice>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="choiceDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:processorDefinition">
+                
         <xs:sequence>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                      
           </xs:choice>
+                    
           <xs:element minOccurs="0" ref="tns:otherwise"/>
+                  
         </xs:sequence>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="otherwiseDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:output">
+                
         <xs:sequence>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="circuitBreakerDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:output">
+                
         <xs:sequence>
+                    
           <xs:element minOccurs="0" ref="tns:hystrixConfiguration"/>
+                    
           <xs:element minOccurs="0" ref="tns:resilience4jConfiguration"/>
+                    
           <xs:element minOccurs="0" ref="tns:faultToleranceConfiguration"/>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+                
         <xs:attribute name="configurationRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Refers to a circuit breaker configuration (such as hystrix, resillience4j, or
 microprofile-fault-tolerance) to use for configuring the circuit breaker EIP.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="hystrixConfigurationDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:hystrixConfigurationCommon">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="hystrixConfigurationCommon">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+                
         <xs:attribute name="groupKey" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the group key to use. The default value is CamelHystrix. Default value:
 CamelHystrix
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="threadPoolKey" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the thread pool key to use. Will by default use the same value as groupKey
 has been configured to use. Default value: CamelHystrix
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="circuitBreakerEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether to use a HystrixCircuitBreaker or not. If false no circuit-breaker logic
 will be used and all requests permitted. This is similar in effect to
 circuitBreakerForceClosed() except that continues tracking metrics and knowing
 whether it should be open/closed, this property results in not even
 instantiating a circuit-breaker. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="circuitBreakerErrorThresholdPercentage" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Error percentage threshold (as whole number such as 50) at which point the
 circuit breaker will trip open and reject requests. It will stay tripped for the
 duration defined in circuitBreakerSleepWindowInMilliseconds; The error
 percentage this is compared against comes from
 HystrixCommandMetrics.getHealthCounts(). Default value: 50
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="circuitBreakerForceClosed" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If true the HystrixCircuitBreaker#allowRequest() will always return true to
 allow requests regardless of the error percentage from
 HystrixCommandMetrics.getHealthCounts(). The circuitBreakerForceOpen() property
 takes precedence so if it set to true this property does nothing. Default value:
 false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="circuitBreakerForceOpen" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If true the HystrixCircuitBreaker.allowRequest() will always return false,
 causing the circuit to be open (tripped) and reject all requests. This property
 takes precedence over circuitBreakerForceClosed();. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="circuitBreakerRequestVolumeThreshold" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Minimum number of requests in the
 metricsRollingStatisticalWindowInMilliseconds() that must exist before the
 HystrixCircuitBreaker will trip. If below this number the circuit will not trip
 regardless of error percentage. Default value: 20
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="circuitBreakerSleepWindowInMilliseconds" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The time in milliseconds after a HystrixCircuitBreaker trips open that it should
 wait before trying requests again. Default value: 5000
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="executionIsolationSemaphoreMaxConcurrentRequests" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Number of concurrent requests permitted to HystrixCommand.run(). Requests beyond
 the concurrent limit will be rejected. Applicable only when
 executionIsolationStrategy == SEMAPHORE. Default value: 20
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="executionIsolationStrategy" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 What isolation strategy HystrixCommand.run() will be executed with. If THREAD
 then it will be executed on a separate thread and concurrent requests limited by
 the number of threads in the thread-pool. If SEMAPHORE then it will be executed
 on the calling thread and concurrent requests limited by the semaphore count.
 Default value: THREAD
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="executionIsolationThreadInterruptOnTimeout" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether the execution thread should attempt an interrupt (using Future#cancel )
 when a thread times out. Applicable only when executionIsolationStrategy() ==
 THREAD. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="executionTimeoutInMilliseconds" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Time in milliseconds at which point the command will timeout and halt execution.
 If executionIsolationThreadInterruptOnTimeout == true and the command is
 thread-isolated, the executing thread will be interrupted. If the command is
 semaphore-isolated and a HystrixObservableCommand, that command will get
 unsubscribed. Default value: 1000
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="executionTimeoutEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether the timeout mechanism is enabled for this command. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="fallbackIsolationSemaphoreMaxConcurrentRequests" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Number of concurrent requests permitted to HystrixCommand.getFallback().
 Requests beyond the concurrent limit will fail-fast and not attempt retrieving a
 fallback. Default value: 10
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="fallbackEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether HystrixCommand.getFallback() should be attempted when failure occurs.
 Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="metricsHealthSnapshotIntervalInMilliseconds" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Time in milliseconds to wait between allowing health snapshots to be taken that
 calculate success and error percentages and affect
 HystrixCircuitBreaker.isOpen() status. On high-volume circuits the continual
 calculation of error percentage can become CPU intensive thus this controls how
 often it is calculated. Default value: 500
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="metricsRollingPercentileBucketSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Maximum number of values stored in each bucket of the rolling percentile. This
 is passed into HystrixRollingPercentile inside HystrixCommandMetrics. Default
 value: 10
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="metricsRollingPercentileEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether percentile metrics should be captured using HystrixRollingPercentile
 inside HystrixCommandMetrics. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="metricsRollingPercentileWindowInMilliseconds" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Duration of percentile rolling window in milliseconds. This is passed into
 HystrixRollingPercentile inside HystrixCommandMetrics. Default value: 10000
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="metricsRollingPercentileWindowBuckets" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Number of buckets the rolling percentile window is broken into. This is passed
 into HystrixRollingPercentile inside HystrixCommandMetrics. Default value: 6
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="metricsRollingStatisticalWindowInMilliseconds" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 This property sets the duration of the statistical rolling window, in
 milliseconds. This is how long metrics are kept for the thread pool. The window
 is divided into buckets and rolls by those increments. Default value: 10000
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="metricsRollingStatisticalWindowBuckets" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Number of buckets the rolling statistical window is broken into. This is passed
 into HystrixRollingNumber inside HystrixCommandMetrics. Default value: 10
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="requestLogEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether HystrixCommand execution and events should be logged to
 HystrixRequestLog. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="corePoolSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Core thread-pool size that gets passed to
 java.util.concurrent.ThreadPoolExecutor#setCorePoolSize(int). Default value: 10
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="maximumSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Maximum thread-pool size that gets passed to
 ThreadPoolExecutor#setMaximumPoolSize(int) . This is the maximum amount of
 concurrency that can be supported without starting to reject HystrixCommands.
 Please note that this setting only takes effect if you also set
 allowMaximumSizeToDivergeFromCoreSize. Default value: 10
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="keepAliveTime" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Keep-alive time in minutes that gets passed to
 ThreadPoolExecutor#setKeepAliveTime(long,TimeUnit). Default value: 1
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="maxQueueSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Max queue size that gets passed to BlockingQueue in
 HystrixConcurrencyStrategy.getBlockingQueue(int) This should only affect the
 instantiation of a threadpool - it is not eliglible to change a queue size on
 the fly. For that, use queueSizeRejectionThreshold(). Default value: -1
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="queueSizeRejectionThreshold" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Queue size rejection threshold is an artificial max size at which rejections
 will occur even if maxQueueSize has not been reached. This is done because the
 maxQueueSize of a BlockingQueue can not be dynamically changed and we want to
 support dynamically changing the queue size that affects rejections. This is
 used by HystrixCommand when queuing a thread for execution. Default value: 5
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="threadPoolRollingNumberStatisticalWindowInMilliseconds" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Duration of statistical rolling window in milliseconds. This is passed into
 HystrixRollingNumber inside each HystrixThreadPoolMetrics instance. Default
 value: 10000
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="threadPoolRollingNumberStatisticalWindowBuckets" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Number of buckets the rolling statistical window is broken into. This is passed
 into HystrixRollingNumber inside each HystrixThreadPoolMetrics instance. Default
 value: 10
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="allowMaximumSizeToDivergeFromCoreSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Allows the configuration for maximumSize to take effect. That value can then be
 equal to, or higher, than coreSize. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="resilience4JConfigurationDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:resilience4JConfigurationCommon">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="resilience4JConfigurationCommon">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence>
+                    
           <xs:element minOccurs="0" name="bulkheadEnabled" type="xs:string"/>
+                    
           <xs:element minOccurs="0" name="bulkheadMaxConcurrentCalls" type="xs:string"/>
+                    
           <xs:element minOccurs="0" name="bulkheadMaxWaitDuration" type="xs:string"/>
+                    
           <xs:element minOccurs="0" name="timeoutEnabled" type="xs:string"/>
+                    
           <xs:element minOccurs="0" name="timeoutExecutorServiceRef" type="xs:string"/>
+                    
           <xs:element minOccurs="0" name="timeoutDuration" type="xs:string"/>
+                    
           <xs:element minOccurs="0" name="timeoutCancelRunningFuture" type="xs:string"/>
+                  
         </xs:sequence>
+                
         <xs:attribute name="circuitBreakerRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Refers to an existing io.github.resilience4j.circuitbreaker.CircuitBreaker
 instance to lookup and use from the registry. When using this, then any other
 circuit breaker options are not in use.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="configRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Refers to an existing io.github.resilience4j.circuitbreaker.CircuitBreakerConfig
 instance to lookup and use from the registry.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="failureRateThreshold" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the failure rate threshold in percentage. If the failure rate is
 equal or greater than the threshold the CircuitBreaker transitions to open and
 starts short-circuiting calls. The threshold must be greater than 0 and not
 greater than 100. Default value is 50 percentage. Default value: 50
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="permittedNumberOfCallsInHalfOpenState" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the number of permitted calls when the CircuitBreaker is half open.
 The size must be greater than 0. Default size is 10. Default value: 10
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="slidingWindowSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the size of the sliding window which is used to record the outcome of
 calls when the CircuitBreaker is closed. slidingWindowSize configures the size
 of the sliding window. Sliding window can either be count-based or time-based.
@@ -4061,63 +5690,81 @@ greater than 0. If the slidingWindowType is COUNT_BASED, the
 minimumNumberOfCalls cannot be greater than slidingWindowSize . If the
 slidingWindowType is TIME_BASED, you can pick whatever you want. Default
 slidingWindowSize is 100. Default value: 100
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="slidingWindowType" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the type of the sliding window which is used to record the outcome of
 calls when the CircuitBreaker is closed. Sliding window can either be
 count-based or time-based. If slidingWindowType is COUNT_BASED, the last
 slidingWindowSize calls are recorded and aggregated. If slidingWindowType is
 TIME_BASED, the calls of the last slidingWindowSize seconds are recorded and
 aggregated. Default slidingWindowType is COUNT_BASED. Default value: COUNT_BASED
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="minimumNumberOfCalls" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the minimum number of calls which are required (per sliding window
 period) before the CircuitBreaker can calculate the error rate. For example, if
 minimumNumberOfCalls is 10, then at least 10 calls must be recorded, before the
 failure rate can be calculated. If only 9 calls have been recorded the
 CircuitBreaker will not transition to open even if all 9 calls have failed.
 Default minimumNumberOfCalls is 100. Default value: 100
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="writableStackTraceEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Enables writable stack traces. When set to false, Exception.getStackTrace
 returns a zero length array. This may be used to reduce log spam when the
 circuit breaker is open as the cause of the exceptions is already known (the
 circuit breaker is short-circuiting calls). Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="waitDurationInOpenState" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the wait duration (in seconds) which specifies how long the
 CircuitBreaker should stay open, before it switches to half open. Default value
 is 60 seconds. Default value: 60
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="automaticTransitionFromOpenToHalfOpenEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Enables automatic transition from OPEN to HALF_OPEN state once the
 waitDurationInOpenState has passed. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="slowCallRateThreshold" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures a threshold in percentage. The CircuitBreaker considers a call as
 slow when the call duration is greater than slowCallDurationThreshold Duration.
 When the percentage of slow calls is equal or greater the threshold, the
@@ -4125,171 +5772,240 @@ CircuitBreaker transitions to open and starts short-circuiting calls. The
 threshold must be greater than 0 and not greater than 100. Default value is 100
 percentage which means that all recorded calls must be slower than
 slowCallDurationThreshold. Default value: 100
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="slowCallDurationThreshold" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the duration threshold (seconds) above which calls are considered as
 slow and increase the slow calls percentage. Default value is 60 seconds.
 Default value: 60
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="faultToleranceConfigurationDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:faultToleranceConfigurationCommon">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="faultToleranceConfigurationCommon">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+                
         <xs:attribute name="circuitBreakerRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Refers to an existing
 io.smallrye.faulttolerance.core.circuit.breaker.CircuitBreaker instance to
 lookup and use from the registry. When using this, then any other circuit
 breaker options are not in use.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="delay" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Control how long the circuit breaker stays open. The default is 5 seconds.
 Default value: 5s
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="successThreshold" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Controls the number of trial calls which are allowed when the circuit breaker is
 half-open. Default value: 1
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="requestVolumeThreshold" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Controls the size of the rolling window used when the circuit breaker is closed.
 Default value: 20
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="failureRatio" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the failure rate threshold in percentage. If the failure rate is
 equal or greater than the threshold the CircuitBreaker transitions to open and
 starts short-circuiting calls. The threshold must be greater than 0 and not
 greater than 100. Default value is 50 percentage. Default value: 50
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="timeoutEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether timeout is enabled or not on the circuit breaker. Default is false.
 Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="timeoutDuration" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the thread execution timeout. Default value is 1 second. Default
 value: 1s
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="timeoutPoolSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the pool size of the thread pool when timeout is enabled. Default
 value is 10. Default value: 10
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="timeoutScheduledExecutorServiceRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 References to a custom thread pool to use when timeout is enabled.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="bulkheadEnabled" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether bulkhead is enabled or not on the circuit breaker. Default is false.
 Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="bulkheadMaxConcurrentCalls" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the max amount of concurrent calls the bulkhead will support. Default
 value: 10
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="bulkheadWaitingTaskQueue" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Configures the task queue size for holding waiting tasks to be processed by the
 bulkhead. Default value: 10
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="bulkheadExecutorServiceRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 References to a custom thread pool to use when bulkhead is enabled.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="claimCheckDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:noOutputDefinition">
+                
         <xs:sequence/>
+                
         <xs:attribute name="operation" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The claim check operation to use. The following operations is supported: Get -
 Gets (does not remove) the claim check by the given key. GetAndRemove - Gets and
 remove the claim check by the given key. Set - Sets a new (will override if key
 already exists) claim check with the given key. Push - Sets a new claim check on
 the stack (does not use key). Pop - Gets the latest claim check from the stack
 (does not use key).
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="key" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 To use a specific key for claim check id (for dynamic keys use simple language
 syntax as the key).
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="filter" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Specified a filter to control what data gets merging data back from the claim
 check repository. The following syntax is supported: body - to aggregate the
 message body attachments - to aggregate all the message attachments headers - to
@@ -4305,176 +6021,284 @@ the default mode) - - to exclude (exclude takes precedence over include) -- - to
 remove (remove takes precedence) For example to exclude a header name foo, and
 remove all headers starting with bar -header:foo,--headers:bar Note you cannot
 have both include and exclude header:pattern at the same time.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="strategyRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 To use a custom AggregationStrategy instead of the default implementation.
 Notice you cannot use both custom aggregation strategy and configure data at the
 same time.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="strategyMethodName" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 This option can be used to explicit declare the method name to use, when using
 POJOs as the AggregationStrategy.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType final="extension restriction" name="constants">
+        
     <xs:sequence/>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="contextScanDefinition">
+        
     <xs:sequence>
+            
       <xs:element maxOccurs="unbounded" minOccurs="0" name="excludes" type="xs:string"/>
+            
       <xs:element maxOccurs="unbounded" minOccurs="0" name="includes" type="xs:string"/>
+          
     </xs:sequence>
+        
     <xs:attribute name="includeNonSingletons" type="xs:string">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Whether to include non-singleton beans (prototypes) By default only singleton
 beans is included in the context scan. Default value: false
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="convertBodyDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:noOutputDefinition">
+                
         <xs:sequence/>
+                
         <xs:attribute name="type" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The java type to convert to.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="charset" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 To use a specific charset when converting.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="dataFormat">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="delayDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:processorDefinition">
+                
         <xs:choice>
+                    
           <xs:element ref="tns:expressionDefinition"/>
+                    
           <xs:element ref="tns:csimple"/>
+                    
           <xs:element ref="tns:constant"/>
+                    
           <xs:element ref="tns:datasonnet"/>
+                    
           <xs:element ref="tns:exchangeProperty"/>
+                    
           <xs:element ref="tns:groovy"/>
+                    
           <xs:element ref="tns:header"/>
+                    
           <xs:element ref="tns:hl7terser"/>
+                    
           <xs:element ref="tns:joor"/>
+                    
           <xs:element ref="tns:jsonpath"/>
+                    
           <xs:element ref="tns:language"/>
+                    
           <xs:element ref="tns:method"/>
+                    
           <xs:element ref="tns:mvel"/>
+                    
           <xs:element ref="tns:ognl"/>
+                    
           <xs:element ref="tns:ref"/>
+                    
           <xs:element ref="tns:simple"/>
+                    
           <xs:element ref="tns:spel"/>
+                    
           <xs:element ref="tns:tokenize"/>
+                    
           <xs:element ref="tns:xtokenize"/>
+                    
           <xs:element ref="tns:xpath"/>
+                    
           <xs:element ref="tns:xquery"/>
+                  
         </xs:choice>
+                
         <xs:attribute name="executorServiceRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Refers to a custom Thread Pool if asyncDelay has been enabled.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="asyncDelayed" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Enables asynchronous delay which means the thread will not block while delaying.
 Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="callerRunsWhenRejected" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether or not the caller should run the task when it was rejected by the thread
 pool. Is by default true. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="dynamicRouterDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:processorDefinition">
+                
         <xs:choice>
+                    
           <xs:element ref="tns:expressionDefinition"/>
+                    
           <xs:element ref="tns:csimple"/>
+                    
           <xs:element ref="tns:constant"/>
+                    
           <xs:element ref="tns:datasonnet"/>
+                    
           <xs:element ref="tns:exchangeProperty"/>
+                    
           <xs:element ref="tns:groovy"/>
+                    
           <xs:element ref="tns:header"/>
+                    
           <xs:element ref="tns:hl7terser"/>
+                    
           <xs:element ref="tns:joor"/>
+                    
           <xs:element ref="tns:jsonpath"/>
+                    
           <xs:element ref="tns:language"/>
+                    
           <xs:element ref="tns:method"/>
+                    
           <xs:element ref="tns:mvel"/>
+                    
           <xs:element ref="tns:ognl"/>
+                    
           <xs:element ref="tns:ref"/>
+                    
           <xs:element ref="tns:simple"/>
+                    
           <xs:element ref="tns:spel"/>
+                    
           <xs:element ref="tns:tokenize"/>
+                    
           <xs:element ref="tns:xtokenize"/>
+                    
           <xs:element ref="tns:xpath"/>
+                    
           <xs:element ref="tns:xquery"/>
+                  
         </xs:choice>
+                
         <xs:attribute name="uriDelimiter" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the uri delimiter to use. Default value: ,
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="ignoreInvalidEndpoints" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Ignore the invalidate endpoint exception when try to create a producer with that
 endpoint.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="cacheSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is
 used to cache and reuse producers when using this dynamic router, when uris are
 reused. Beware that when using dynamic endpoints then it affects how well the
@@ -4489,90 +6313,136 @@ size can be set accordingly or rely on the default size (1000). If there is a
 mix of unique and used before dynamic endpoints, then setting a reasonable cache
 size can help reduce memory usage to avoid storing too many non frequent used
 producers.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="enrichDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:processorDefinition">
+                
         <xs:choice>
+                    
           <xs:element ref="tns:expressionDefinition"/>
+                    
           <xs:element ref="tns:csimple"/>
+                    
           <xs:element ref="tns:constant"/>
+                    
           <xs:element ref="tns:datasonnet"/>
+                    
           <xs:element ref="tns:exchangeProperty"/>
+                    
           <xs:element ref="tns:groovy"/>
+                    
           <xs:element ref="tns:header"/>
+                    
           <xs:element ref="tns:hl7terser"/>
+                    
           <xs:element ref="tns:joor"/>
+                    
           <xs:element ref="tns:jsonpath"/>
+                    
           <xs:element ref="tns:language"/>
+                    
           <xs:element ref="tns:method"/>
+                    
           <xs:element ref="tns:mvel"/>
+                    
           <xs:element ref="tns:ognl"/>
+                    
           <xs:element ref="tns:ref"/>
+                    
           <xs:element ref="tns:simple"/>
+                    
           <xs:element ref="tns:spel"/>
+                    
           <xs:element ref="tns:tokenize"/>
+                    
           <xs:element ref="tns:xtokenize"/>
+                    
           <xs:element ref="tns:xpath"/>
+                    
           <xs:element ref="tns:xquery"/>
+                  
         </xs:choice>
+                
         <xs:attribute name="strategyRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Refers to an AggregationStrategy to be used to merge the reply from the external
 service, into a single outgoing message. By default Camel will use the reply
 from the external service as outgoing message.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="strategyMethodName" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 This option can be used to explicit declare the method name to use, when using
 POJOs as the AggregationStrategy.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="strategyMethodAllowNull" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 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 data to enrich), when using POJOs as the
 AggregationStrategy.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="aggregateOnException" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If this option is false then the aggregate method is not used if there was an
 exception thrown while trying to retrieve the data to enrich from the resource.
 Setting this option to true allows end users to control what to do if there was
 an exception in the aggregate method. For example to suppress the exception or
 set a custom message body etc. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="shareUnitOfWork" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Shares the org.apache.camel.spi.UnitOfWork with the parent and the resource
 exchange. Enrich will by default not share unit of work between the parent
 exchange and the resource exchange. This means the resource exchange has its own
 individual unit of work. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="cacheSize" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the maximum size used by the org.apache.camel.spi.ProducerCache which is
 used to cache and reuse producer when uris are reused. Beware that when using
 dynamic endpoints then it affects how well the cache can be utilized. If each
@@ -4586,348 +6456,649 @@ and endpoints and therefore the cache size can be set accordingly or rely on the
 default size (1000). If there is a mix of unique and used before dynamic
 endpoints, then setting a reasonable cache size can help reduce memory usage to
 avoid storing too many non frequent used producers.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="ignoreInvalidEndpoint" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Ignore the invalidate endpoint exception when try to create a producer with that
 endpoint. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="filterDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:processorDefinition">
+                
         <xs:sequence>
+                    
           <xs:choice>
+                        
             <xs:element ref="tns:expressionDefinition"/>
+                        
             <xs:element ref="tns:csimple"/>
+                        
             <xs:element ref="tns:constant"/>
+                        
             <xs:element ref="tns:datasonnet"/>
+                        
             <xs:element ref="tns:exchangeProperty"/>
+                        
             <xs:element ref="tns:groovy"/>
+                        
             <xs:element ref="tns:header"/>
+                        
             <xs:element ref="tns:hl7terser"/>
+                        
             <xs:element ref="tns:joor"/>
+                        
             <xs:element ref="tns:jsonpath"/>
+                        
             <xs:element ref="tns:language"/>
+                        
             <xs:element ref="tns:method"/>
+                        
             <xs:element ref="tns:mvel"/>
+                        
             <xs:element ref="tns:ognl"/>
+                        
             <xs:element ref="tns:ref"/>
+                        
             <xs:element ref="tns:simple"/>
+                        
             <xs:element ref="tns:spel"/>
+                        
             <xs:element ref="tns:tokenize"/>
+                        
             <xs:element ref="tns:xtokenize"/>
+                        
             <xs:element ref="tns:xpath"/>
+                        
             <xs:element ref="tns:xquery"/>
+                      
           </xs:choice>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="finallyDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:output">
+                
         <xs:sequence>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="fromDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:optionalIdentifiedDefinition">
+                
         <xs:sequence/>
+                
         <xs:attribute name="uri" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the URI of the endpoint to use.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="globalOptionDefinition">
+        
     <xs:sequence/>
+        
     <xs:attribute name="key" type="xs:string" use="required">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Global option key.
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+        
     <xs:attribute name="value" type="xs:string" use="required">
       <xs:annotation>
-        <xs:documentation xml:lang="en"><![CDATA[
+        <xs:documentation xml:lang="en">
+          <![CDATA[
 Global option value.
-        ]]></xs:documentation>
+        ]]>
+        </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="globalOptionsDefinition">
+        
     <xs:sequence>
+            
       <xs:element maxOccurs="unbounded" minOccurs="0" ref="tns:globalOption"/>
+          
     </xs:sequence>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="idempotentConsumerDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:processorDefinition">
+                
         <xs:sequence>
+                    
           <xs:choice>
+                        
             <xs:element ref="tns:expressionDefinition"/>
+                        
             <xs:element ref="tns:csimple"/>
+                        
             <xs:element ref="tns:constant"/>
+                        
             <xs:element ref="tns:datasonnet"/>
+                        
             <xs:element ref="tns:exchangeProperty"/>
+                        
             <xs:element ref="tns:groovy"/>
+                        
             <xs:element ref="tns:header"/>
+                        
             <xs:element ref="tns:hl7terser"/>
+                        
             <xs:element ref="tns:joor"/>
+                        
             <xs:element ref="tns:jsonpath"/>
+                        
             <xs:element ref="tns:language"/>
+                        
             <xs:element ref="tns:method"/>
+                        
             <xs:element ref="tns:mvel"/>
+                        
             <xs:element ref="tns:ognl"/>
+                        
             <xs:element ref="tns:ref"/>
+                        
             <xs:element ref="tns:simple"/>
+                        
             <xs:element ref="tns:spel"/>
+                        
             <xs:element ref="tns:tokenize"/>
+                        
             <xs:element ref="tns:xtokenize"/>
+                        
             <xs:element ref="tns:xpath"/>
+                        
             <xs:element ref="tns:xquery"/>
+                      
           </xs:choice>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+                
         <xs:attribute name="messageIdRepositoryRef" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the reference name of the message id repository.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="eager" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether to eagerly add the key to the idempotent repository or wait until
 the exchange is complete. Eager is default enabled. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="completionEager" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether to complete the idempotent consumer eager or when the exchange is
 done. If this option is true to complete eager, then the idempotent consumer
 will trigger its completion when the exchange reached the end of the block of
@@ -4938,369 +7109,668 @@ will complete when the exchange is done being routed. So if the exchange is
 continued routed after the block ends, then whatever happens there also affect
 the state. For example if the exchange failed due to an exception, then the
 state of the idempotent consumer will be a rollback.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="skipDuplicate" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether to skip duplicates or not. The default behavior is to skip
 duplicates. A duplicate message would have the Exchange property
 org.apache.camel.Exchange#DUPLICATE_MESSAGE set to a Boolean#TRUE value. A none
 duplicate message will not have this property set. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="removeOnFailure" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets whether to remove or keep the key on failure. The default behavior is to
 remove the key on failure. Default value: true
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="inOnlyDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:sendDefinition">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType abstract="true" name="sendDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:noOutputDefinition">
+                
         <xs:sequence/>
+                
         <xs:attribute name="uri" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the uri of the endpoint to send to.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="inOutDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:sendDefinition">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="inputTypeDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:optionalIdentifiedDefinition">
+                
         <xs:sequence/>
+                
         <xs:attribute name="urn" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Set input type URN.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="validate" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Set if validation is required for this input type. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="interceptDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:output">
+                
         <xs:sequence>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="interceptFromDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:interceptDefinition">
+                
         <xs:sequence/>
+                
         <xs:attribute name="uri" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Intercept incoming messages from the uri or uri pattern. If this option is not
 configured, then all incoming messages is intercepted.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="interceptSendToEndpointDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:output">
+                
         <xs:sequence>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+                
         <xs:attribute name="uri" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Intercept sending to the uri or uri pattern.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="skipSendToOriginalEndpoint" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If set to true then the message is not sent to the original endpoint. By default
 (false) the message is both intercepted and then sent to the original endpoint.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="afterUri" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 After sending to the endpoint then send the message to this uri which allows to
 process its result.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="loadBalanceDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:output">
+                
         <xs:sequence>
+                    
           <xs:choice minOccurs="0">
+                        
             <xs:element ref="tns:failover"/>
+                        
             <xs:element ref="tns:random"/>
+                        
             <xs:element ref="tns:customLoadBalancer"/>
+                        
             <xs:element ref="tns:roundRobin"/>
+                        
             <xs:element ref="tns:sticky"/>
+                        
             <xs:element ref="tns:topic"/>
+                        
             <xs:element ref="tns:weighted"/>
+                      
           </xs:choice>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="failoverLoadBalancerDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:loadBalancer">
+                
         <xs:sequence>
+                    
           <xs:element maxOccurs="unbounded" minOccurs="0" name="exception" type="xs:string"/>
+                  
         </xs:sequence>
+                
         <xs:attribute name="roundRobin" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether or not the failover load balancer should operate in round robin mode or
 not. If not, then it will always start from the first endpoint when a new
 message is to be processed. In other words it restart from the top for every
@@ -5309,12 +7779,15 @@ the next endpoint in a round robin fashion. You can also enable sticky mode
 together with round robin, if so then it will pick the last known good endpoint
 to use when starting the load balancing (instead of using the next when
 starting).
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="sticky" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Whether or not the failover load balancer should operate in sticky mode or not.
 If not, then it will always start from the first endpoint when a new message is
 to be processed. In other words it restart from the top for every message. If
@@ -5322,1045 +7795,1598 @@ sticky is enabled, then it keeps state and will continue with the last known
 good endpoint. You can also enable sticky mode together with round robin, if so
 then it will pick the last known good endpoint to use when starting the load
 balancing (instead of using the next when starting).
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="maximumFailoverAttempts" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 A value to indicate after X failover attempts we should exhaust (give up). Use
 -1 to indicate never give up and continuously try to failover. Use 0 to never
 failover. And use e.g. 3 to failover at most 3 times before giving up. his
 option can be used whether or not roundRobin is enabled or not. Default value:
 -1
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="loadBalancer">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:identifiedType">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="randomLoadBalancerDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:loadBalancer">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="customLoadBalancerDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:loadBalancer">
+                
         <xs:sequence/>
+                
         <xs:attribute name="ref" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Refers to the custom load balancer to lookup from the registry.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="roundRobinLoadBalancerDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:loadBalancer">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="stickyLoadBalancerDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:loadBalancer">
+                
         <xs:sequence>
+                    
           <xs:element name="correlationExpression" type="tns:expressionSubElementDefinition"/>
+                  
         </xs:sequence>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="topicLoadBalancerDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:loadBalancer">
+                
         <xs:sequence/>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="weightedLoadBalancerDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:loadBalancer">
+                
         <xs:sequence/>
+                
         <xs:attribute name="roundRobin" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 To enable round robin mode. By default the weighted distribution mode is used.
 The default value is false.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="distributionRatio" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The distribution ratio is a delimited String consisting on integer weights
 separated by delimiters for example 2,3,5. The distributionRatio must match the
 number of endpoints and/or processors specified in the load balancer list.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="distributionRatioDelimiter" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Delimiter used to specify the distribution ratio. The default value is ,
 (comma). Default value: ,
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="logDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:noOutputDefinition">
+                
         <xs:sequence/>
+                
         <xs:attribute name="message" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the log message (uses simple language).
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="loggingLevel" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the logging level. The default value is INFO. Default value: INFO
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="logName" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Sets the name of the logger.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="marker" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 To use slf4j marker.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="loggerRef" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 To refer to a custom logger instance to lookup from the registry.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="loopDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:processorDefinition">
+                
         <xs:sequence>
+                    
           <xs:choice>
+                        
             <xs:element ref="tns:expressionDefinition"/>
+                        
             <xs:element ref="tns:csimple"/>
+                        
             <xs:element ref="tns:constant"/>
+                        
             <xs:element ref="tns:datasonnet"/>
+                        
             <xs:element ref="tns:exchangeProperty"/>
+                        
             <xs:element ref="tns:groovy"/>
+                        
             <xs:element ref="tns:header"/>
+                        
             <xs:element ref="tns:hl7terser"/>
+                        
             <xs:element ref="tns:joor"/>
+                        
             <xs:element ref="tns:jsonpath"/>
+                        
             <xs:element ref="tns:language"/>
+                        
             <xs:element ref="tns:method"/>
+                        
             <xs:element ref="tns:mvel"/>
+                        
             <xs:element ref="tns:ognl"/>
+                        
             <xs:element ref="tns:ref"/>
+                        
             <xs:element ref="tns:simple"/>
+                        
             <xs:element ref="tns:spel"/>
+                        
             <xs:element ref="tns:tokenize"/>
+                        
             <xs:element ref="tns:xtokenize"/>
+                        
             <xs:element ref="tns:xpath"/>
+                        
             <xs:element ref="tns:xquery"/>
+                      
           </xs:choice>
+                    
           <xs:choice maxOccurs="unbounded" minOccurs="0">
+                        
             <xs:element ref="tns:aggregate"/>
+                        
             <xs:element ref="tns:bean"/>
+                        
             <xs:element ref="tns:doCatch"/>
+                        
             <xs:element ref="tns:when"/>
+                        
             <xs:element ref="tns:choice"/>
+                        
             <xs:element ref="tns:otherwise"/>
+                        
             <xs:element ref="tns:circuitBreaker"/>
+                        
             <xs:element ref="tns:claimCheck"/>
+                        
             <xs:element ref="tns:convertBodyTo"/>
+                        
             <xs:element ref="tns:delay"/>
+                        
             <xs:element ref="tns:dynamicRouter"/>
+                        
             <xs:element ref="tns:enrich"/>
+                        
             <xs:element ref="tns:filter"/>
+                        
             <xs:element ref="tns:doFinally"/>
+                        
             <xs:element ref="tns:idempotentConsumer"/>
+                        
             <xs:element ref="tns:inOnly"/>
+                        
             <xs:element ref="tns:inOut"/>
+                        
             <xs:element ref="tns:intercept"/>
+                        
             <xs:element ref="tns:interceptFrom"/>
+                        
             <xs:element ref="tns:interceptSendToEndpoint"/>
+                        
             <xs:element ref="tns:loadBalance"/>
+                        
             <xs:element ref="tns:log"/>
+                        
             <xs:element ref="tns:loop"/>
+                        
             <xs:element ref="tns:marshal"/>
+                        
             <xs:element ref="tns:multicast"/>
+                        
             <xs:element ref="tns:onCompletion"/>
+                        
             <xs:element ref="tns:onException"/>
+                        
             <xs:element ref="tns:onFallback"/>
+                        
             <xs:element ref="tns:pipeline"/>
+                        
             <xs:element ref="tns:policy"/>
+                        
             <xs:element ref="tns:pollEnrich"/>
+                        
             <xs:element ref="tns:process"/>
+                        
             <xs:element ref="tns:recipientList"/>
+                        
             <xs:element ref="tns:removeHeader"/>
+                        
             <xs:element ref="tns:removeHeaders"/>
+                        
             <xs:element ref="tns:removeProperties"/>
+                        
             <xs:element ref="tns:removeProperty"/>
+                        
             <xs:element ref="tns:resequence"/>
+                        
             <xs:element ref="tns:rollback"/>
+                        
             <xs:element ref="tns:route"/>
+                        
             <xs:element ref="tns:routingSlip"/>
+                        
             <xs:element ref="tns:saga"/>
+                        
             <xs:element ref="tns:sample"/>
+                        
             <xs:element ref="tns:script"/>
+                        
             <xs:element ref="tns:setBody"/>
+                        
             <xs:element ref="tns:setExchangePattern"/>
+                        
             <xs:element ref="tns:setHeader"/>
+                        
             <xs:element ref="tns:setProperty"/>
+                        
             <xs:element ref="tns:sort"/>
+                        
             <xs:element ref="tns:split"/>
+                        
             <xs:element ref="tns:step"/>
+                        
             <xs:element ref="tns:stop"/>
+                        
             <xs:element ref="tns:threads"/>
+                        
             <xs:element ref="tns:throttle"/>
+                        
             <xs:element ref="tns:throwException"/>
+                        
             <xs:element ref="tns:to"/>
+                        
             <xs:element ref="tns:toD"/>
+                        
             <xs:element ref="tns:transacted"/>
+                        
             <xs:element ref="tns:transform"/>
+                        
             <xs:element ref="tns:doTry"/>
+                        
             <xs:element ref="tns:unmarshal"/>
+                        
             <xs:element ref="tns:validate"/>
+                        
             <xs:element ref="tns:whenSkipSendToEndpoint"/>
+                        
             <xs:element ref="tns:wireTap"/>
+                        
             <xs:element ref="tns:serviceCall"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+                
         <xs:attribute name="copy" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If the copy attribute is true, a copy of the input Exchange is used for each
 iteration. That means each iteration will start from a copy of the same message.
 By default loop will loop the same exchange all over, so each iteration may have
 different message content. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="doWhile" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Enables the while loop that loops until the predicate evaluates to false or
 null. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="breakOnShutdown" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If the breakOnShutdown attribute is true, then the loop will not iterate until
 it reaches the end when Camel is shut down. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="marshalDefinition">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:noOutputDefinition">
+                
         <xs:sequence>
+                    
           <xs:choice minOccurs="0">
+                        
             <xs:element ref="tns:any23"/>
+                        
             <xs:element ref="tns:asn1"/>
+                        
             <xs:element ref="tns:avro"/>
+                        
             <xs:element ref="tns:barcode"/>
+                        
             <xs:element ref="tns:base64"/>
+                        
             <xs:element ref="tns:beanio"/>
+                        
             <xs:element ref="tns:bindy"/>
+                        
             <xs:element ref="tns:cbor"/>
+                        
             <xs:element ref="tns:crypto"/>
+                        
             <xs:element ref="tns:csv"/>
+                        
             <xs:element name="custom" type="tns:customDataFormat"/>
+                        
             <xs:element ref="tns:fhirJson"/>
+                        
             <xs:element ref="tns:fhirXml"/>
+                        
             <xs:element ref="tns:flatpack"/>
+                        
             <xs:element ref="tns:grok"/>
+                        
             <xs:element name="gzip" type="tns:gzipDataFormat"/>
+                        
             <xs:element ref="tns:hl7"/>
+                        
             <xs:element ref="tns:ical"/>
+                        
             <xs:element ref="tns:jacksonxml"/>
+                        
             <xs:element ref="tns:jaxb"/>
+                        
             <xs:element ref="tns:json"/>
+                        
             <xs:element ref="tns:jsonApi"/>
+                        
             <xs:element ref="tns:lzf"/>
+                        
             <xs:element name="mimeMultipart" type="tns:mimeMultipartDataFormat"/>
+                        
             <xs:element ref="tns:protobuf"/>
+                        
             <xs:element ref="tns:rss"/>
+                        
             <xs:element ref="tns:secureXML"/>
+                        
             <xs:element ref="tns:soapjaxb"/>
+                        
             <xs:element ref="tns:syslog"/>
+                        
             <xs:element ref="tns:tarfile"/>
+                        
             <xs:element ref="tns:thrift"/>
+                        
             <xs:element ref="tns:tidyMarkup"/>
+                        
             <xs:element ref="tns:univocity-csv"/>
+                        
             <xs:element ref="tns:univocity-fixed"/>
+                        
             <xs:element ref="tns:univocity-tsv"/>
+                        
             <xs:element ref="tns:xmlrpc"/>
+                        
             <xs:element ref="tns:xstream"/>
+                        
             <xs:element ref="tns:pgp"/>
+                        
             <xs:element ref="tns:yaml"/>
+                        
             <xs:element name="zip" type="tns:zipDeflaterDataFormat"/>
+                        
             <xs:element ref="tns:zipfile"/>
+                      
           </xs:choice>
+                  
         </xs:sequence>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="any23DataFormat">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:dataFormat">
+                
         <xs:sequence>
+                    
           <xs:element maxOccurs="unbounded" minOccurs="0" name="configuration" type="tns:propertyDefinition"/>
+                    
           <xs:element maxOccurs="unbounded" minOccurs="0" name="extractors" type="xs:string"/>
+                  
         </xs:sequence>
+                
         <xs:attribute name="outputFormat" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 What RDF syntax to unmarshal as, can be: NTRIPLES, TURTLE, NQUADS, RDFXML,
 JSONLD, RDFJSON, RDF4JMODEL. It is by default: RDF4JMODEL. Default value:
 RDF4JMODEL
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="baseURI" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The URI to use as base for building RDF entities if only relative paths are
 provided.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="asn1DataFormat">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:dataFormat">
+                
         <xs:sequence/>
+                
         <xs:attribute name="usingIterator" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 If the asn1 file has more then one entry, the setting this option to true,
 allows to work with the splitter EIP, to split the data using an iterator in a
 streaming mode. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="clazzName" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Name of class to use when unmarshalling.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="avroDataFormat">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:dataFormat">
+                
         <xs:sequence/>
+                
         <xs:attribute name="instanceClassName" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Class name to use for marshal and unmarshalling.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="barcodeDataFormat">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:dataFormat">
+                
         <xs:sequence/>
+                
         <xs:attribute name="width" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Width of the barcode.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="height" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Height of the barcode.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="imageType" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Image type of the barcode such as png.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="barcodeFormat" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Barcode format such as QR-Code.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="base64DataFormat">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:dataFormat">
+                
         <xs:sequence/>
+                
         <xs:attribute name="lineLength" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 To specific a maximum line length for the encoded data. By default 76 is used.
 Default value: 76
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="lineSeparator" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The line separators to use. Uses new line characters (CRLF) by default.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+                
         <xs:attribute name="urlSafe" type="xs:string">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 Instead of emitting '' and '/' we emit '-' and '_' respectively. urlSafe is only
 applied to encode operations. Decoding seamlessly handles both modes. Is by
 default false. Default value: false
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
         </xs:attribute>
+              
       </xs:extension>
+          
     </xs:complexContent>
+      
   </xs:complexType>
-
+    
   <xs:complexType name="beanioDataFormat">
+        
     <xs:complexContent>
+            
       <xs:extension base="tns:dataFormat">
+                
         <xs:sequence/>
+                
         <xs:attribute name="mapping" type="xs:string" use="required">
           <xs:annotation>
-            <xs:documentation xml:lang="en"><![CDATA[
+            <xs:documentation xml:lang="en">
+              <![CDATA[
 The BeanIO mapping file. Is by default loaded from the classpath. You can prefix
 with file:, http:, or classpath: to denote from where to load the mapping file.
-            ]]></xs:documentation>
+            ]]>
+            </xs:documentation>
           </xs:annotation>
... 15667 lines suppressed ...


[camel] 06/06: CAMEL-16056: Added camel-jfr for java flight recorder integration

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

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

commit 8860d830acaf3a303c5e972db683c4bff15268e6
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Jan 20 12:19:40 2021 +0100

    CAMEL-16056: Added camel-jfr for java flight recorder integration
---
 .../apache/camel/catalog/main/camel-main-configuration-metadata.json  | 4 ++++
 docs/components/modules/others/pages/main.adoc                        | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
index 9429f05..640fe32 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/camel-main-configuration-metadata.json
@@ -72,7 +72,11 @@
     { "name": "camel.main.shutdownSuppressLoggingOnTimeout", "description": "Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors\/warnings et all in the logs as a side-effect of the forced timeout. Notice the suppress is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control. This option is defa [...]
     { "name": "camel.main.shutdownTimeout", "description": "Timeout in seconds to graceful shutdown Camel.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int", "defaultValue": 45 },
     { "name": "camel.main.startupRecorder", "description": "To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false, logging, java-flight-recorder The default is false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.main.startupRecorderDir", "description": "Directory to store the recording. By default the user home directory will be used. Use false to turn off saving recording to disk.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.main.startupRecorderDuration", "description": "How long time to run the startup recorder. Use 0 (default) to stop the recorder after Camel has been started. Use -1 to keep the recorder running until Camel is being stopped. A positive value is to run the recorder for N seconds. When the recorder is stopped then the recording is auto saved to disk", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "long" },
     { "name": "camel.main.startupRecorderMaxDepth", "description": "To filter our sub steps at a maximum depth. Use -1 for no maximum. Use 0 for no sub steps. Use 1 for max 1 sub step, and so forth. The default is -1.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int", "defaultValue": -1 },
+    { "name": "camel.main.startupRecorderProfile", "description": "To use a specific Java Flight Recorder profile configuration, such as default or profile. The default is default.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "default" },
+    { "name": "camel.main.startupRecorderRecording", "description": "To enable Java Flight Recorder to start a recording and automatic dump the recording to disk after startup is complete. This requires that camel-jfr is on the classpath. The default is true.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
     { "name": "camel.main.streamCachingAnySpoolRules", "description": "Sets whether if just any of the org.apache.camel.spi.StreamCachingStrategy.SpoolRule rules returns true then shouldSpoolCache(long) returns true, to allow spooling to disk. If this option is false, then all the org.apache.camel.spi.StreamCachingStrategy.SpoolRule must return true. The default value is false which means that all the rules must return true.", "sourceType": "org.apache.camel.main.DefaultConfigurationProp [...]
     { "name": "camel.main.streamCachingBufferSize", "description": "Sets the stream caching buffer size to use when allocating in-memory buffers used for in-memory stream caches. The default size is 4096.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int" },
     { "name": "camel.main.streamCachingEnabled", "description": "Sets whether stream caching is enabled or not. Default is false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean" },
diff --git a/docs/components/modules/others/pages/main.adoc b/docs/components/modules/others/pages/main.adoc
index 41abefd..cce2203 100644
--- a/docs/components/modules/others/pages/main.adoc
+++ b/docs/components/modules/others/pages/main.adoc
@@ -86,7 +86,11 @@ The following table lists all the options:
 | *camel.main.shutdownSuppress{zwsp}LoggingOnTimeout* | Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors/warnings et all in the logs as a side-effect of the forced timeout. Notice the suppress is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control. This option is default false. |  | boolean
 | *camel.main.shutdownTimeout* | Timeout in seconds to graceful shutdown Camel. | 45 | int
 | *camel.main.startupRecorder* | To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false, logging, java-flight-recorder The default is false. |  | String
+| *camel.main.startupRecorderDir* | Directory to store the recording. By default the user home directory will be used. Use false to turn off saving recording to disk. |  | String
+| *camel.main.startupRecorder{zwsp}Duration* | How long time to run the startup recorder. Use 0 (default) to stop the recorder after Camel has been started. Use -1 to keep the recorder running until Camel is being stopped. A positive value is to run the recorder for N seconds. When the recorder is stopped then the recording is auto saved to disk |  | long
 | *camel.main.startupRecorderMax{zwsp}Depth* | To filter our sub steps at a maximum depth. Use -1 for no maximum. Use 0 for no sub steps. Use 1 for max 1 sub step, and so forth. The default is -1. | -1 | int
+| *camel.main.startupRecorder{zwsp}Profile* | To use a specific Java Flight Recorder profile configuration, such as default or profile. The default is default. | default | String
+| *camel.main.startupRecorder{zwsp}Recording* | To enable Java Flight Recorder to start a recording and automatic dump the recording to disk after startup is complete. This requires that camel-jfr is on the classpath. The default is true. | true | boolean
 | *camel.main.streamCachingAny{zwsp}SpoolRules* | Sets whether if just any of the org.apache.camel.spi.StreamCachingStrategy.SpoolRule rules returns true then shouldSpoolCache(long) returns true, to allow spooling to disk. If this option is false, then all the org.apache.camel.spi.StreamCachingStrategy.SpoolRule must return true. The default value is false which means that all the rules must return true. |  | boolean
 | *camel.main.streamCachingBuffer{zwsp}Size* | Sets the stream caching buffer size to use when allocating in-memory buffers used for in-memory stream caches. The default size is 4096. |  | int
 | *camel.main.streamCaching{zwsp}Enabled* | Sets whether stream caching is enabled or not. Default is false. |  | boolean


[camel] 01/06: CAMEL-16056: Added StartupStep to diagnose startup exeuction times for various steps. To be integated with JFR later.

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

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

commit b9c19ecf28b2daf2dc1ff3bff72faaf5700e00ac
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jan 19 18:22:21 2021 +0100

    CAMEL-16056: Added StartupStep to diagnose startup exeuction times for various steps. To be integated with JFR later.
---
 .../org/apache/camel/ExtendedCamelContext.java     |  11 ++
 .../main/java/org/apache/camel/StartupStep.java    |  72 ++++++++
 .../org/apache/camel/spi/StartupStepRecorder.java  |  76 +++++++++
 .../camel/impl/engine/AbstractCamelContext.java    |  69 +++++++-
 .../impl/engine/InternalRouteStartupManager.java   |   9 +
 .../camel/impl/ExtendedCamelContextConfigurer.java |   6 +
 .../camel/impl/lw/LightweightCamelContext.java     |  11 ++
 .../impl/lw/LightweightRuntimeCamelContext.java    |  11 ++
 .../apache/camel/impl/StartupStepLoggingTest.java  |  46 +++++
 .../apache/camel/support/DefaultStartupStep.java   |  85 +++++++++
 .../camel/support/DefaultStartupStepRecorder.java  | 189 +++++++++++++++++++++
 11 files changed, 581 insertions(+), 4 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
index bcbb4e4..6a392ad 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
@@ -59,6 +59,7 @@ import org.apache.camel.spi.RestBindingJaxbDataFormatFactory;
 import org.apache.camel.spi.RouteController;
 import org.apache.camel.spi.RouteFactory;
 import org.apache.camel.spi.RouteStartupOrder;
+import org.apache.camel.spi.StartupStepRecorder;
 import org.apache.camel.spi.UnitOfWorkFactory;
 import org.apache.camel.spi.UriFactoryResolver;
 import org.apache.camel.spi.XMLRoutesDefinitionLoader;
@@ -663,6 +664,16 @@ public interface ExtendedCamelContext extends CamelContext {
     EndpointUriFactory getEndpointUriFactory(String scheme);
 
     /**
+     * Gets the {@link StartupStepRecorder} to use.
+     */
+    StartupStepRecorder getStartupStepRecorder();
+
+    /**
+     * Sets the {@link StartupStepRecorder} to use.
+     */
+    void setStartupStepRecorder(StartupStepRecorder startupStepRecorder);
+
+    /**
      * Internal API for adding routes. Do not use this as end user.
      */
     void addRoute(Route route);
diff --git a/core/camel-api/src/main/java/org/apache/camel/StartupStep.java b/core/camel-api/src/main/java/org/apache/camel/StartupStep.java
new file mode 100644
index 0000000..18f23cd
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/StartupStep.java
@@ -0,0 +1,72 @@
+/*
+ * 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;
+
+/**
+ * Recording state of steps during startup to capture execution time, and being able to emit events to diagnostic tools
+ * such as Java Flight Recorder.
+ */
+public interface StartupStep {
+
+    /**
+     * The source class type of the step
+     */
+    String getType();
+
+    /**
+     * Name of the step
+     */
+    String getName();
+
+    /**
+     * Description of the step
+     */
+    String getDescription();
+
+    /**
+     * The id of the step
+     */
+    int getId();
+
+    /**
+     * The id of the parent step
+     */
+    int getParentId();
+
+    /**
+     * The step level (sub step of previous steps)
+     */
+    int getLevel();
+
+    /**
+     * Ends the step.
+     */
+    void end();
+
+    /**
+     * Gets the begin time (optional).
+     */
+    long getBeginTime();
+
+    /**
+     * Add metadata.
+     *
+     * @param key   the key
+     * @param value the value
+     */
+    void addTag(String key, String value);
+}
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java b/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java
new file mode 100644
index 0000000..60df638
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java
@@ -0,0 +1,76 @@
+/*
+ * 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.spi;
+
+import org.apache.camel.StartupStep;
+import org.apache.camel.StaticService;
+
+/**
+ * To record {@link StartupStep} during startup to allow to capture diagnostic information to help troubleshoot Camel
+ * applications via various tooling such as Java Flight Recorder.
+ */
+public interface StartupStepRecorder extends StaticService {
+
+    /**
+     * Whether recording is enabled
+     */
+    boolean isEnabled();
+
+    /**
+     * Whether recording is enabled
+     */
+    void setEnabled(boolean enabled);
+
+    /**
+     * Whether to automatic disable this recorder after Camel has been started.
+     * This is done by default to remove any overhead after the startup process is done.
+     */
+    boolean isDisableAfterStarted();
+
+    /**
+     * Whether to automatic disable this recorder after Camel has been started.
+     * This is done by default to remove any overhead after the startup process is done.
+     */
+    void setDisableAfterStarted(boolean disableAfterStarted);
+
+    /**
+     * To filter our sub steps at a maximum depth
+     */
+    void setMaxDepth(int level);
+
+    /**
+     * To filter our sub steps at a maximum depth
+     */
+    int getMaxDepth();
+
+    /**
+     * Beings a new step.
+     *
+     * Important must call {@link #endStep(StartupStep)} to end the step.
+     *
+     * @param type        the source
+     * @param name        name of the step
+     * @param description description of the step
+     */
+    StartupStep beginStep(Class<?> type, String name, String description);
+
+    /**
+     * Ends the step
+     */
+    void endStep(StartupStep step);
+
+}
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index ca96cce..b4ccabd 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -69,6 +69,7 @@ import org.apache.camel.ServiceStatus;
 import org.apache.camel.ShutdownRoute;
 import org.apache.camel.ShutdownRunningTask;
 import org.apache.camel.StartupListener;
+import org.apache.camel.StartupStep;
 import org.apache.camel.Suspendable;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.TypeConverter;
@@ -140,6 +141,7 @@ import org.apache.camel.spi.RouteStartupOrder;
 import org.apache.camel.spi.RouteTemplateParameterSource;
 import org.apache.camel.spi.RuntimeEndpointRegistry;
 import org.apache.camel.spi.ShutdownStrategy;
+import org.apache.camel.spi.StartupStepRecorder;
 import org.apache.camel.spi.StreamCachingStrategy;
 import org.apache.camel.spi.Tracer;
 import org.apache.camel.spi.Transformer;
@@ -152,6 +154,7 @@ import org.apache.camel.spi.Validator;
 import org.apache.camel.spi.ValidatorRegistry;
 import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.DefaultStartupStepRecorder;
 import org.apache.camel.support.EndpointHelper;
 import org.apache.camel.support.EventHelper;
 import org.apache.camel.support.LRUCacheFactory;
@@ -305,12 +308,14 @@ public abstract class AbstractCamelContext extends BaseService
     private volatile boolean eventNotificationApplicable;
     private volatile TransformerRegistry<TransformerKey> transformerRegistry;
     private volatile ValidatorRegistry<ValidatorKey> validatorRegistry;
+    private volatile StartupStepRecorder startupStepRecorder = new DefaultStartupStepRecorder();
     private EndpointRegistry<EndpointKey> endpoints;
     private RuntimeEndpointRegistry runtimeEndpointRegistry;
     private ShutdownRoute shutdownRoute = ShutdownRoute.Default;
     private ShutdownRunningTask shutdownRunningTask = ShutdownRunningTask.CompleteCurrentTaskOnly;
     private Debugger debugger;
     private long startDate;
+    private long bootDate;
 
     private SSLContextParameters sslContextParameters;
 
@@ -576,7 +581,9 @@ public abstract class AbstractCamelContext extends BaseService
             if (component != null && created.get() && autoStart && (isStarted() || isStarting())) {
                 // If the component is looked up after the context is started,
                 // lets start it up.
+                StartupStep step = startupStepRecorder.beginStep(Component.class, name, "Starting component");
                 startService(component);
+                startupStepRecorder.endStep(step);
             }
 
             return component;
@@ -594,6 +601,7 @@ public abstract class AbstractCamelContext extends BaseService
     private Component initComponent(String name, boolean autoCreateComponents) {
         Component component = null;
         if (autoCreateComponents) {
+            StartupStep step = startupStepRecorder.beginStep(Component.class, name, "Resolving component");
             try {
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("Using ComponentResolver: {} to resolve component with name: {}", getComponentResolver(), name);
@@ -647,6 +655,7 @@ public abstract class AbstractCamelContext extends BaseService
             } catch (Exception e) {
                 throw new RuntimeCamelException("Cannot auto create component: " + name, e);
             }
+            startupStepRecorder.endStep(step);
         }
         return component;
     }
@@ -794,7 +803,17 @@ public abstract class AbstractCamelContext extends BaseService
 
     @Override
     public Endpoint getEndpoint(String uri) {
-        return doGetEndpoint(uri, null, false, false);
+        StartupStep step = null;
+        // only record startup step during startup (not started)
+        if (!isStarted() && startupStepRecorder.isEnabled()) {
+            String u = URISupport.sanitizeUri(uri);
+            step = startupStepRecorder.beginStep(Endpoint.class, u, "Getting endpoint");
+        }
+        Endpoint answer = doGetEndpoint(uri, null, false, false);
+        if (step != null) {
+            startupStepRecorder.endStep(step);
+        }
+        return answer;
     }
 
     @Override
@@ -2507,25 +2526,35 @@ public abstract class AbstractCamelContext extends BaseService
 
     @Override
     public void doBuild() throws Exception {
+        bootDate = System.currentTimeMillis();
+        startupStepRecorder.start();
+        StartupStep step = startupStepRecorder.beginStep(CamelContext.class, null, "Building context");
+
         // Initialize LRUCacheFactory as eager as possible,
         // to let it warm up concurrently while Camel is startup up
         if (initialization != Initialization.Lazy) {
+            StartupStep step2 = startupStepRecorder.beginStep(CamelContext.class, null, "Setting up LRUCacheFactory");
             LRUCacheFactory.init();
+            startupStepRecorder.endStep(step2);
         }
 
         // Setup management first since end users may use it to add event
         // notifiers using the management strategy before the CamelContext has been started
+        StartupStep step3 = startupStepRecorder.beginStep(CamelContext.class, null, "Setting up Management");
         setupManagement(null);
+        startupStepRecorder.endStep(step3);
 
         // setup health-check registry as its needed this early phase for 3rd party to register custom repositories
         HealthCheckRegistry hcr = getExtension(HealthCheckRegistry.class);
         if (hcr == null) {
+            StartupStep step4 = startupStepRecorder.beginStep(CamelContext.class, null, "Setting up HealthCheckRegistry");
             hcr = createHealthCheckRegistry();
             if (hcr != null) {
                 // install health-check registry if it was discovered from classpath (camel-health)
                 hcr.setCamelContext(this);
                 setExtension(HealthCheckRegistry.class, hcr);
             }
+            startupStepRecorder.endStep(step4);
         }
 
         // Call all registered trackers with this context
@@ -2534,15 +2563,20 @@ public abstract class AbstractCamelContext extends BaseService
 
         // Setup type converter eager as its highly in use and should not be lazy initialized
         if (eagerCreateTypeConverter()) {
+            StartupStep step5 = startupStepRecorder.beginStep(CamelContext.class, null, "Setting up TypeConverter");
             getOrCreateTypeConverter();
+            startupStepRecorder.endStep(step5);
         }
+
+        startupStepRecorder.endStep(step);
     }
 
     @Override
     public void doInit() throws Exception {
-        // start the route controller
+        StartupStep step = startupStepRecorder.beginStep(CamelContext.class, null, "Initializing context");
+
+        // init the route controller
         this.routeController = getRouteController();
-        ServiceHelper.initService(this.routeController);
 
         // optimize - before starting routes lets check if event notifications is possible
         eventNotificationApplicable = EventHelper.eventsApplicable(this);
@@ -2655,7 +2689,9 @@ public abstract class AbstractCamelContext extends BaseService
         }
 
         // start the route definitions before the routes is started
+        StartupStep step2 = startupStepRecorder.beginStep(CamelContext.class, getName(), "Initializing routes");
         startRouteDefinitions();
+        startupStepRecorder.endStep(step2);
 
         for (LifecycleStrategy strategy : lifecycleStrategies) {
             try {
@@ -2673,10 +2709,14 @@ public abstract class AbstractCamelContext extends BaseService
         }
 
         EventHelper.notifyCamelContextInitialized(this);
+
+        startupStepRecorder.endStep(step);
     }
 
     @Override
     protected void doStart() throws Exception {
+        StartupStep step = startupStepRecorder.beginStep(CamelContext.class, getName(), "Starting context");
+
         try {
             doStartContext();
         } catch (Exception e) {
@@ -2685,6 +2725,12 @@ public abstract class AbstractCamelContext extends BaseService
             // rethrow cause
             throw e;
         }
+
+        startupStepRecorder.endStep(step);
+
+        if (startupStepRecorder.isDisableAfterStarted()) {
+            startupStepRecorder.stop();
+        }
     }
 
     protected void doStartContext() throws Exception {
@@ -2797,7 +2843,9 @@ public abstract class AbstractCamelContext extends BaseService
             }
         }
 
-        LOG.info("Apache Camel {} ({}) started in {}", getVersion(), getName(), TimeUtils.printDuration(stopWatch.taken()));
+        String start = TimeUtils.printDuration(stopWatch.taken());
+        String boot = TimeUtils.printDuration(new StopWatch(bootDate).taken());
+        LOG.info("Apache Camel {} ({}) started in {} (incl boot {})", getVersion(), getName(), start, boot);
     }
 
     protected void doStartCamel() throws Exception {
@@ -2935,9 +2983,11 @@ public abstract class AbstractCamelContext extends BaseService
         }
 
         // invoke this logic to warmup the routes and if possible also start the routes
+        StartupStep step2 = startupStepRecorder.beginStep(CamelContext.class, getName(), "Starting routes");
         EventHelper.notifyCamelContextRoutesStarting(this);
         internalRouteStartupManager.doStartOrResumeRoutes(routeServices, true, !doNotStartRoutesOnFirstStart, false, true);
         EventHelper.notifyCamelContextRoutesStarted(this);
+        startupStepRecorder.endStep(step2);
 
         long cacheCounter = beanIntrospection != null ? beanIntrospection.getCachedClassesCounter() : 0;
         if (cacheCounter > 0) {
@@ -3082,6 +3132,7 @@ public abstract class AbstractCamelContext extends BaseService
 
         // and clear start date
         startDate = 0;
+        bootDate = 0;
 
         // Call all registered trackers with this context
         // Note, this may use a partially constructed object
@@ -4499,6 +4550,16 @@ public abstract class AbstractCamelContext extends BaseService
         return getUriFactoryResolver().resolveFactory(scheme, this);
     }
 
+    @Override
+    public StartupStepRecorder getStartupStepRecorder() {
+        return startupStepRecorder;
+    }
+
+    @Override
+    public void setStartupStepRecorder(StartupStepRecorder startupStepRecorder) {
+        this.startupStepRecorder = startupStepRecorder;
+    }
+
     @Deprecated
     public enum Initialization {
         Eager,
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/InternalRouteStartupManager.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/InternalRouteStartupManager.java
index f8ee94d..4427fda 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/InternalRouteStartupManager.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/InternalRouteStartupManager.java
@@ -32,6 +32,7 @@ import org.apache.camel.MultipleConsumersSupport;
 import org.apache.camel.Route;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.StartupListener;
+import org.apache.camel.StartupStep;
 import org.apache.camel.StatefulService;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.spi.CamelLogger;
@@ -264,12 +265,15 @@ class InternalRouteStartupManager {
             // will then be prepared in time before we start inputs which will
             // consume messages to be routed
             RouteService routeService = entry.getValue().getRouteService();
+            StartupStep step = abstractCamelContext.getStartupStepRecorder().beginStep(Route.class, routeService.getId(),
+                    "Warming up route");
             try {
                 LOG.debug("Warming up route id: {} having autoStartup={}", routeService.getId(), autoStartup);
                 setupRoute.set(routeService.getRoute());
                 routeService.warmUp();
             } finally {
                 setupRoute.remove();
+                abstractCamelContext.getStartupStepRecorder().endStep(step);
             }
         }
     }
@@ -306,6 +310,9 @@ class InternalRouteStartupManager {
                 continue;
             }
 
+            StartupStep step = abstractCamelContext.getStartupStepRecorder().beginStep(Route.class, route.getRouteId(),
+                    "Starting route");
+
             // start the service
             for (Consumer consumer : routeService.getInputs().values()) {
                 Endpoint endpoint = consumer.getEndpoint();
@@ -404,6 +411,8 @@ class InternalRouteStartupManager {
                     throw e;
                 }
             }
+
+            abstractCamelContext.getStartupStepRecorder().endStep(step);
         }
     }
 
diff --git a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java
index b45c5b5..43a721e 100644
--- a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java
+++ b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java
@@ -147,6 +147,8 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com
         case "ShutdownRunningTask": target.setShutdownRunningTask(property(camelContext, org.apache.camel.ShutdownRunningTask.class, value)); return true;
         case "shutdownstrategy":
         case "ShutdownStrategy": target.setShutdownStrategy(property(camelContext, org.apache.camel.spi.ShutdownStrategy.class, value)); return true;
+        case "startupsteprecorder":
+        case "StartupStepRecorder": target.setStartupStepRecorder(property(camelContext, org.apache.camel.spi.StartupStepRecorder.class, value)); return true;
         case "streamcaching":
         case "StreamCaching": target.setStreamCaching(property(camelContext, java.lang.Boolean.class, value)); return true;
         case "streamcachingstrategy":
@@ -308,6 +310,8 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com
         case "ShutdownRunningTask": return org.apache.camel.ShutdownRunningTask.class;
         case "shutdownstrategy":
         case "ShutdownStrategy": return org.apache.camel.spi.ShutdownStrategy.class;
+        case "startupsteprecorder":
+        case "StartupStepRecorder": return org.apache.camel.spi.StartupStepRecorder.class;
         case "streamcaching":
         case "StreamCaching": return java.lang.Boolean.class;
         case "streamcachingstrategy":
@@ -470,6 +474,8 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com
         case "ShutdownRunningTask": return target.getShutdownRunningTask();
         case "shutdownstrategy":
         case "ShutdownStrategy": return target.getShutdownStrategy();
+        case "startupsteprecorder":
+        case "StartupStepRecorder": return target.getStartupStepRecorder();
         case "streamcaching":
         case "StreamCaching": return target.isStreamCaching();
         case "streamcachingstrategy":
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
index d44f0a9..59e8480 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContext.java
@@ -124,6 +124,7 @@ import org.apache.camel.spi.RoutePolicyFactory;
 import org.apache.camel.spi.RouteStartupOrder;
 import org.apache.camel.spi.RuntimeEndpointRegistry;
 import org.apache.camel.spi.ShutdownStrategy;
+import org.apache.camel.spi.StartupStepRecorder;
 import org.apache.camel.spi.StreamCachingStrategy;
 import org.apache.camel.spi.Tracer;
 import org.apache.camel.spi.Transformer;
@@ -1537,6 +1538,16 @@ public class LightweightCamelContext implements ExtendedCamelContext, CatalogCam
         return getExtendedCamelContext().isLightweight();
     }
 
+    @Override
+    public StartupStepRecorder getStartupStepRecorder() {
+        return getExtendedCamelContext().getStartupStepRecorder();
+    }
+
+    @Override
+    public void setStartupStepRecorder(StartupStepRecorder startupStepRecorder) {
+        getExtendedCamelContext().setStartupStepRecorder(startupStepRecorder);
+    }
+
     //
     // CatalogCamelContext
     //
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
index 6abd435..c99f0c8 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightRuntimeCamelContext.java
@@ -121,6 +121,7 @@ import org.apache.camel.spi.RoutePolicyFactory;
 import org.apache.camel.spi.RouteStartupOrder;
 import org.apache.camel.spi.RuntimeEndpointRegistry;
 import org.apache.camel.spi.ShutdownStrategy;
+import org.apache.camel.spi.StartupStepRecorder;
 import org.apache.camel.spi.StreamCachingStrategy;
 import org.apache.camel.spi.SupervisingRouteController;
 import org.apache.camel.spi.Tracer;
@@ -1963,6 +1964,16 @@ public class LightweightRuntimeCamelContext implements ExtendedCamelContext, Cat
         throw new UnsupportedOperationException();
     }
 
+    @Override
+    public StartupStepRecorder getStartupStepRecorder() {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void setStartupStepRecorder(StartupStepRecorder startupStepRecorder) {
+        throw new UnsupportedOperationException();
+    }
+
     private void startService(Service service) throws Exception {
         // and register startup aware so they can be notified when
         // camel context has been started
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/StartupStepLoggingTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/StartupStepLoggingTest.java
new file mode 100644
index 0000000..291421a
--- /dev/null
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/StartupStepLoggingTest.java
@@ -0,0 +1,46 @@
+package org.apache.camel.impl;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class StartupStepLoggingTest extends ContextTestSupport {
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = new DefaultCamelContext(false);
+        context.adapt(ExtendedCamelContext.class).getStartupStepRecorder().setEnabled(true);
+        // you can restrict the sub steps to a max depth level
+        // context.adapt(ExtendedCamelContext.class).getStartupStepRecorder().setMaxDepth(1);
+        context.setLoadTypeConverters(true);
+        return context;
+    }
+
+    @Test
+    public void testLog() throws Exception {
+        assertEquals(1, context.getRoutesSize());
+
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("log:foo").to("log:bar").to("mock:result");
+            }
+        };
+    }
+
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStep.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStep.java
new file mode 100644
index 0000000..c8e9e46
--- /dev/null
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStep.java
@@ -0,0 +1,85 @@
+/*
+ * 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.support;
+
+import org.apache.camel.StartupStep;
+
+public class DefaultStartupStep implements StartupStep {
+
+    private final String type;
+    private final String name;
+    private final String description;
+    private final int id;
+    private final int parentId;
+    private final int level;
+    private final long time;
+
+    public DefaultStartupStep(String type, String name, String description, int id, int parentId, int level, long time) {
+        this.type = type;
+        this.name = name;
+        this.description = description;
+        this.id = id;
+        this.parentId = parentId;
+        this.level = level;
+        this.time = time;
+    }
+
+    @Override
+    public String getType() {
+        return type;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public int getId() {
+        return id;
+    }
+
+    @Override
+    public int getParentId() {
+        return parentId;
+    }
+
+    @Override
+    public int getLevel() {
+        return level;
+    }
+
+    @Override
+    public long getBeginTime() {
+        return time;
+    }
+
+    @Override
+    public void end() {
+        // noop
+    }
+
+    @Override
+    public void addTag(String key, String value) {
+
+    }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStepRecorder.java b/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStepRecorder.java
new file mode 100644
index 0000000..e07e1ce
--- /dev/null
+++ b/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStepRecorder.java
@@ -0,0 +1,189 @@
+/*
+ * 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.support;
+
+import java.util.ArrayDeque;
+import java.util.Arrays;
+import java.util.Deque;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.camel.StartupStep;
+import org.apache.camel.spi.StartupStepRecorder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Default {@link StartupStepRecorder} that outputs to log.
+ */
+public class DefaultStartupStepRecorder implements StartupStepRecorder {
+
+    private static final Logger LOG = LoggerFactory.getLogger(StartupStepRecorder.class);
+
+    // TODO: jfr implementation
+    // TODO: spring-boot implementation
+
+    private final AtomicInteger stepCounter = new AtomicInteger();
+    private final Deque<Integer> currentSteps = new ArrayDeque<>();
+
+    private static final StartupStep DISABLED_STEP = new StartupStep() {
+        @Override
+        public String getType() {
+            return null;
+        }
+
+        @Override
+        public String getName() {
+            return null;
+        }
+
+        @Override
+        public String getDescription() {
+            return null;
+        }
+
+        @Override
+        public int getId() {
+            return 0;
+        }
+
+        @Override
+        public int getParentId() {
+            return 0;
+        }
+
+        @Override
+        public int getLevel() {
+            return 0;
+        }
+
+        @Override
+        public void end() {
+            // noop
+        }
+
+        @Override
+        public long getBeginTime() {
+            return 0;
+        }
+
+        @Override
+        public void addTag(String key, String value) {
+            // noop
+        }
+    };
+
+    public DefaultStartupStepRecorder() {
+    }
+
+    private boolean enabled;
+    private boolean disableAfterStarted = true;
+    private int maxDepth = -1;
+
+    public boolean isEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    @Override
+    public boolean isDisableAfterStarted() {
+        return disableAfterStarted;
+    }
+
+    public void setDisableAfterStarted(boolean disableAfterStarted) {
+        this.disableAfterStarted = disableAfterStarted;
+    }
+
+    @Override
+    public int getMaxDepth() {
+        return maxDepth;
+    }
+
+    public void setMaxDepth(int maxDepth) {
+        this.maxDepth = maxDepth;
+    }
+
+    @Override
+    public void start() {
+        currentSteps.offerFirst(0);
+    }
+
+    @Override
+    public void stop() {
+        enabled = false;
+        currentSteps.clear();
+    }
+
+    public StartupStep beginStep(Class<?> type, String name, String description) {
+        if (enabled) {
+            int level = currentSteps.size() - 1;
+            if (maxDepth != -1 && level >= maxDepth) {
+                return DISABLED_STEP;
+            }
+            int id = stepCounter.incrementAndGet();
+            Integer parent = currentSteps.peekFirst();
+            int pid = parent != null ? parent : 0;
+            StartupStep step = createStartupStep(type.getSimpleName(), name, description, id, pid, level);
+            onBeginStep(step);
+            currentSteps.offerFirst(id);
+            return step;
+        } else {
+            return DISABLED_STEP;
+        }
+    }
+
+    public void endStep(StartupStep step) {
+        if (step != DISABLED_STEP) {
+            currentSteps.pollFirst();
+            step.end();
+            onEndStep(step);
+        }
+    }
+
+    public StartupStep createStartupStep(String type, String name, String description, int id, int parentId, int level) {
+        return new DefaultStartupStep(type, name, description, id, parentId, level, System.currentTimeMillis());
+    }
+
+    protected void onBeginStep(StartupStep step) {
+        // noop
+    }
+
+    protected void onEndStep(StartupStep step) {
+        if (LOG.isInfoEnabled()) {
+            long delta = System.currentTimeMillis() - step.getBeginTime();
+            String pad = padString(step.getLevel());
+            String out = String.format("%s", pad + step.getType());
+            String out2 = String.format("%6s ms", delta);
+            String out3 = String.format("%s(%s)", step.getDescription(), step.getName());
+            LOG.info("{} : {} - {}", out2, out, out3);
+        }
+    }
+
+    public static String padString(int level) {
+        if (level == 0) {
+            return "";
+        } else {
+            byte[] arr = new byte[level * 2];
+            byte space = ' ';
+            Arrays.fill(arr, space);
+            return new String(arr);
+        }
+    }
+
+}


[camel] 04/06: CAMEL-16056: Added StartupStep to diagnose startup exeuction times for various steps.

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

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

commit 4f8a08b7dfa28d1338f63426dba21b89edfc1781
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Jan 20 07:15:20 2021 +0100

    CAMEL-16056: Added StartupStep to diagnose startup exeuction times for various steps.
---
 .../main/java/org/apache/camel/reifier/ChoiceReifier.java   |  1 -
 .../java/org/apache/camel/reifier/ProcessorReifier.java     | 10 ++++++++--
 .../main/java/org/apache/camel/reifier/RouteReifier.java    | 13 ++++++++++++-
 .../java/org/apache/camel/impl/CustomIdFactoryTest.java     | 10 ++--------
 4 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ChoiceReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ChoiceReifier.java
index 54e5780..dc99340 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ChoiceReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ChoiceReifier.java
@@ -63,7 +63,6 @@ public class ChoiceReifier extends ProcessorReifier<ChoiceDefinition> {
                         whenClause.setExpression((ExpressionDefinition) model);
                     }
                 }
-                exp = whenClause.getExpression();
             }
 
             FilterProcessor filter = (FilterProcessor) createProcessor(whenClause);
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
index 202fc8a..5805116 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/ProcessorReifier.java
@@ -31,6 +31,7 @@ import org.apache.camel.ErrorHandlerFactory;
 import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
+import org.apache.camel.StartupStep;
 import org.apache.camel.model.AggregateDefinition;
 import org.apache.camel.model.BeanDefinition;
 import org.apache.camel.model.CatchDefinition;
@@ -797,16 +798,21 @@ public abstract class ProcessorReifier<T extends ProcessorDefinition<?>> extends
     }
 
     protected Processor createProcessor(ProcessorDefinition<?> output) throws Exception {
+        // ensure node has id assigned
+        String outputId = output.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
+        StartupStep step = camelContext.adapt(ExtendedCamelContext.class).getStartupStepRecorder().beginStep(ProcessorReifier.class, outputId, "Create processor");
+
         Processor processor = null;
         // at first use custom factory
         if (camelContext.adapt(ExtendedCamelContext.class).getProcessorFactory() != null) {
             processor = camelContext.adapt(ExtendedCamelContext.class).getProcessorFactory().createProcessor(route, output);
         }
-        // fallback to default implementation if factory did not create the
-        // processor
+        // fallback to default implementation if factory did not create the processor
         if (processor == null) {
             processor = reifier(route, output).createProcessor();
         }
+
+        camelContext.adapt(ExtendedCamelContext.class).getStartupStepRecorder().endStep(step);
         return processor;
     }
 
diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java
index 7d5e068..deb98a2 100644
--- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java
+++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/RouteReifier.java
@@ -33,6 +33,7 @@ import org.apache.camel.Route;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.ShutdownRoute;
 import org.apache.camel.ShutdownRunningTask;
+import org.apache.camel.StartupStep;
 import org.apache.camel.model.ModelCamelContext;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.PropertyDefinition;
@@ -224,7 +225,17 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> {
         List<ProcessorDefinition<?>> list = new ArrayList<>(definition.getOutputs());
         for (ProcessorDefinition<?> output : list) {
             try {
-                ProcessorReifier.reifier(route, output).addRoutes();
+                ProcessorReifier reifier = ProcessorReifier.reifier(route, output);
+
+                // ensure node has id assigned
+                String outputId = output.idOrCreate(camelContext.adapt(ExtendedCamelContext.class).getNodeIdFactory());
+                String eip = reifier.getClass().getSimpleName().replace("Reifier", "");
+                StartupStep step = camelContext.adapt(ExtendedCamelContext.class).getStartupStepRecorder()
+                        .beginStep(Processor.class, outputId, "Creating " + eip + " processor");
+
+                reifier.addRoutes();
+
+                camelContext.adapt(ExtendedCamelContext.class).getStartupStepRecorder().endStep(step);
             } catch (Exception e) {
                 throw new FailedToCreateRouteException(definition.getId(), definition.toString(), output.toString(), e);
             }
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java
index d60a4b3..6fbb55a 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/CustomIdFactoryTest.java
@@ -23,7 +23,6 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.NamedNode;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.model.OptionalIdentifiedDefinition;
 import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.NodeIdFactory;
 import org.apache.camel.support.processor.DelegateProcessor;
@@ -90,7 +89,7 @@ public class CustomIdFactoryTest extends ContextTestSupport {
         assertMockEndpointsSatisfied();
 
         // this should take the when path (first to)
-        assertEquals("#choice7##to2#", ids);
+        assertEquals("#choice2##to4#", ids);
     }
 
     /**
@@ -105,7 +104,7 @@ public class CustomIdFactoryTest extends ContextTestSupport {
         assertMockEndpointsSatisfied();
 
         // this should take the otherwise path
-        assertEquals("#choice7##log4##to6#", ids);
+        assertEquals("#choice2##log6##to7#", ids);
     }
 
     private static class MyDebuggerCheckingId implements InterceptStrategy {
@@ -115,11 +114,6 @@ public class CustomIdFactoryTest extends ContextTestSupport {
                 final CamelContext context, final NamedNode definition, Processor target, Processor nextTarget)
                 throws Exception {
 
-            // MUST DO THIS
-            // force id creation as sub nodes have lazy assigned ids
-            ((OptionalIdentifiedDefinition<?>) definition)
-                    .idOrCreate(context.adapt(ExtendedCamelContext.class).getNodeIdFactory());
-
             return new DelegateProcessor(target) {
                 @Override
                 protected void processNext(Exchange exchange) throws Exception {


[camel] 05/06: CAMEL-16056: Added camel-jfr for java flight recorder integration

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

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

commit 3b112be98d34a06bd37112992625a878c9d198d7
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Jan 20 11:29:15 2021 +0100

    CAMEL-16056: Added camel-jfr for java flight recorder integration
---
 .../org/apache/camel/catalog/docs/jfr.adoc         |  14 +--
 components/camel-jfr/src/main/docs/jfr.adoc        |  14 +--
 .../jfr/FlightRecorderStartupStepRecorder.java     |  88 ++++++++++++++++++
 .../org/apache/camel/spi/StartupStepRecorder.java  |  42 +++++++--
 .../camel/impl/engine/AbstractCamelContext.java    |   9 +-
 .../MainConfigurationPropertiesConfigurer.java     |  24 +++++
 .../camel-main-configuration-metadata.json         |   4 +
 core/camel-main/src/main/docs/main.adoc            |   4 +
 .../org/apache/camel/main/BaseMainSupport.java     |  73 ++++++++++++++-
 .../camel/main/DefaultConfigurationConfigurer.java |   8 +-
 .../camel/main/DefaultConfigurationProperties.java | 103 +++++++++++++++++++++
 .../src/main/java/org/apache/camel/main/Main.java  |  11 +--
 .../startup/DefaultStartupStepRecorder.java        |  55 ++++++++---
 docs/components/modules/others/pages/jfr.adoc      |  14 +--
 14 files changed, 393 insertions(+), 70 deletions(-)

diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jfr.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jfr.adoc
index 3a8fa2e..0b66da7 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jfr.adoc
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/jfr.adoc
@@ -17,20 +17,8 @@ The camel-jfr component emits lifecycle events for startup to JFR.
 This can for example be used to pin-point which Camel routes may be slow to startup.
 
 [[jfr-Options]]
-== Options
-
-[width="100%",cols="10%,10%,80%",options="header",]
-|===
-|Option
-|Default
-|Description
-
-|enabled
-|true
-|Whether Camel flight recorder is enabled globally
-
-|===
 
+See the __startupRecorder__ options from xref:components:others:main.adoc[Camel Main]
 
 [[jfr-Example]]
 == Example
diff --git a/components/camel-jfr/src/main/docs/jfr.adoc b/components/camel-jfr/src/main/docs/jfr.adoc
index 3a8fa2e..0b66da7 100644
--- a/components/camel-jfr/src/main/docs/jfr.adoc
+++ b/components/camel-jfr/src/main/docs/jfr.adoc
@@ -17,20 +17,8 @@ The camel-jfr component emits lifecycle events for startup to JFR.
 This can for example be used to pin-point which Camel routes may be slow to startup.
 
 [[jfr-Options]]
-== Options
-
-[width="100%",cols="10%,10%,80%",options="header",]
-|===
-|Option
-|Default
-|Description
-
-|enabled
-|true
-|Whether Camel flight recorder is enabled globally
-
-|===
 
+See the __startupRecorder__ options from xref:components:others:main.adoc[Camel Main]
 
 [[jfr-Example]]
 == Example
diff --git a/components/camel-jfr/src/main/java/org/apache/camel/startup/jfr/FlightRecorderStartupStepRecorder.java b/components/camel-jfr/src/main/java/org/apache/camel/startup/jfr/FlightRecorderStartupStepRecorder.java
index 6c706a5..e9e4ac0 100644
--- a/components/camel-jfr/src/main/java/org/apache/camel/startup/jfr/FlightRecorderStartupStepRecorder.java
+++ b/components/camel-jfr/src/main/java/org/apache/camel/startup/jfr/FlightRecorderStartupStepRecorder.java
@@ -16,10 +16,22 @@
  */
 package org.apache.camel.startup.jfr;
 
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.time.Duration;
+
+import jdk.jfr.Configuration;
+import jdk.jfr.FlightRecorder;
+import jdk.jfr.FlightRecorderListener;
+import jdk.jfr.Recording;
+import jdk.jfr.RecordingState;
 import org.apache.camel.StartupStep;
 import org.apache.camel.spi.StartupStepRecorder;
 import org.apache.camel.spi.annotations.JdkService;
 import org.apache.camel.support.startup.DefaultStartupStepRecorder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * To capture startup steps to be emitted to Java Flight Recorder.
@@ -27,8 +39,84 @@ import org.apache.camel.support.startup.DefaultStartupStepRecorder;
 @JdkService(StartupStepRecorder.FACTORY)
 public class FlightRecorderStartupStepRecorder extends DefaultStartupStepRecorder {
 
+    private static final Logger LOG = LoggerFactory.getLogger(FlightRecorderStartupStepRecorder.class);
+
+    private Recording rec;
+    private FlightRecorderListener frl;
+
+    @Override
+    public void doStart() throws Exception {
+        super.doStart();
+
+        if (isRecording()) {
+            FlightRecorder.register(FlightRecorderStartupStep.class);
+            Configuration config = Configuration.getConfiguration(getRecordingProfile());
+            rec = new Recording(config);
+            rec.setName("Camel Recording");
+            if (getStartupRecorderDuration() > 0) {
+                rec.setDuration(Duration.ofSeconds(getStartupRecorderDuration()));
+                LOG.info("Starting Java flight recorder with profile: {} and duration: {} seconds", getRecordingProfile(),
+                        getStartupRecorderDuration());
+
+                // add listener to trigger auto-save when duration is hit
+                frl = new FlightRecorderListener() {
+                    @Override
+                    public void recordingStateChanged(Recording recording) {
+                        if (recording == rec && recording.getState().equals(RecordingState.STOPPED)) {
+                            LOG.info("Stopping Java flight recorder after {} seconds elapsed", getStartupRecorderDuration());
+                            dumpRecording();
+                        }
+                    }
+                };
+                FlightRecorder.addListener(frl);
+            } else {
+                LOG.info("Starting Java flight recorder with profile: {}", getRecordingProfile());
+            }
+            rec.start();
+        }
+    }
+
+    @Override
+    public void doStop() throws Exception {
+        super.doStop();
+
+        if (rec != null) {
+            dumpRecording();
+        }
+    }
+
+    protected void dumpRecording() {
+        if (!"false".equals(getRecordingDir())) {
+            try {
+                Path dir = getRecordingDir() != null ? Paths.get(getRecordingDir()) : Paths.get(System.getenv().get("HOME"));
+                Path file = Files.createTempFile(dir, "camel-recording", ".jfr");
+                if (rec.getState().equals(RecordingState.RUNNING)) {
+                    // need to do GC to capture details to the recording (specially when its short running)
+                    LOG.info("Stopping Java flight recorder");
+                    System.gc();
+                    rec.stop();
+                }
+                if (rec.getState().equals(RecordingState.STOPPED)) {
+                    rec.dump(file);
+                    LOG.info("Java flight recorder saved to file: {}", file);
+                }
+            } catch (Exception e) {
+                LOG.warn("Error saving Java flight recorder recording to file", e);
+            }
+        }
+        FlightRecorder.unregister(FlightRecorderStartupStep.class);
+        if (frl != null) {
+            FlightRecorder.removeListener(frl);
+        }
+
+        rec = null;
+        frl = null;
+    }
+
     public FlightRecorderStartupStepRecorder() {
         setEnabled(true);
+        // pre-empty enable recording so we have as early as possible recording started
+        setRecording(true);
     }
 
     @Override
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java b/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java
index f0e3918..be3f68a 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java
@@ -41,16 +41,36 @@ public interface StartupStepRecorder extends StaticService {
     void setEnabled(boolean enabled);
 
     /**
-     * Whether to automatic disable this recorder after Camel has been started. This is done by default to remove any
-     * overhead after the startup process is done.
+     * How long time to run the startup recorder.
+     *
+     * Use 0 (default) to stop the recorder after Camel has been started. Use -1 to keep the recorder running until
+     * Camel is being stopped. A positive value is to run the recorder for N seconds.
      */
-    boolean isDisableAfterStarted();
+    long getStartupRecorderDuration();
 
     /**
-     * Whether to automatic disable this recorder after Camel has been started. This is done by default to remove any
-     * overhead after the startup process is done.
+     * How long time to run the startup recorder.
+     *
+     * Use 0 (default) to stop the recorder after Camel has been started. Use -1 to keep the recorder running until
+     * Camel is being stopped. A positive value is to run the recorder for N seconds.
      */
-    void setDisableAfterStarted(boolean disableAfterStarted);
+    void setStartupRecorderDuration(long startupRecorderDuration);
+
+    String getRecordingDir();
+
+    /**
+     * Directory to store the recording. By default the user home directory will be used.
+     */
+    void setRecordingDir(String recordingDir);
+
+    String getRecordingProfile();
+
+    /**
+     * To use a specific Java Flight Recorder profile configuration, such as default or profile.
+     *
+     * The default is default.
+     */
+    void setRecordingProfile(String profile);
 
     /**
      * To filter our sub steps at a maximum depth
@@ -63,6 +83,16 @@ public interface StartupStepRecorder extends StaticService {
     int getMaxDepth();
 
     /**
+     * Whether to start flight recorder recording. This is only in use if camel-jfr is being used.
+     */
+    void setRecording(boolean recording);
+
+    /**
+     * Whether to start flight recorder recording. This is only in use if camel-jfr is being used.
+     */
+    boolean isRecording();
+
+    /**
      * Beings a new step.
      * <p>
      * Important must call {@link #endStep(StartupStep)} to end the step.
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 646bca5..91a1b36 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -2528,8 +2528,8 @@ public abstract class AbstractCamelContext extends BaseService
     public void doBuild() throws Exception {
         bootDate = System.currentTimeMillis();
 
-        // auto-detect step recorder from classpath if not explicit configured
-        if (startupStepRecorder instanceof DefaultStartupStepRecorder) {
+        // auto-detect step recorder from classpath if none has been explicit configured
+        if (startupStepRecorder.getClass().getSimpleName().equals("DefaultStartupStepRecorder")) {
             StartupStepRecorder fr = getBootstrapFactoryFinder()
                     .newInstance(StartupStepRecorder.FACTORY, StartupStepRecorder.class).orElse(null);
             if (fr != null) {
@@ -2742,7 +2742,7 @@ public abstract class AbstractCamelContext extends BaseService
 
         startupStepRecorder.endStep(step);
 
-        if (startupStepRecorder.isDisableAfterStarted()) {
+        if (startupStepRecorder.getStartupRecorderDuration() == 0) {
             startupStepRecorder.stop();
         }
     }
@@ -3144,6 +3144,9 @@ public abstract class AbstractCamelContext extends BaseService
                     TimeUtils.printDuration(stopWatch.taken()));
         }
 
+        // ensure any recorder is stopped in case it was kept running
+        startupStepRecorder.stop();
+
         // and clear start date
         startDate = 0;
         bootDate = 0;
diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
index 0ec603e..63940e0 100644
--- a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
+++ b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
@@ -145,8 +145,16 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "ShutdownTimeout": target.setShutdownTimeout(property(camelContext, int.class, value)); return true;
         case "startuprecorder":
         case "StartupRecorder": target.setStartupRecorder(property(camelContext, java.lang.String.class, value)); return true;
+        case "startuprecorderdir":
+        case "StartupRecorderDir": target.setStartupRecorderDir(property(camelContext, java.lang.String.class, value)); return true;
+        case "startuprecorderduration":
+        case "StartupRecorderDuration": target.setStartupRecorderDuration(property(camelContext, long.class, value)); return true;
         case "startuprecordermaxdepth":
         case "StartupRecorderMaxDepth": target.setStartupRecorderMaxDepth(property(camelContext, int.class, value)); return true;
+        case "startuprecorderprofile":
+        case "StartupRecorderProfile": target.setStartupRecorderProfile(property(camelContext, java.lang.String.class, value)); return true;
+        case "startuprecorderrecording":
+        case "StartupRecorderRecording": target.setStartupRecorderRecording(property(camelContext, boolean.class, value)); return true;
         case "streamcachinganyspoolrules":
         case "StreamCachingAnySpoolRules": target.setStreamCachingAnySpoolRules(property(camelContext, boolean.class, value)); return true;
         case "streamcachingbuffersize":
@@ -316,8 +324,16 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "ShutdownTimeout": return int.class;
         case "startuprecorder":
         case "StartupRecorder": return java.lang.String.class;
+        case "startuprecorderdir":
+        case "StartupRecorderDir": return java.lang.String.class;
+        case "startuprecorderduration":
+        case "StartupRecorderDuration": return long.class;
         case "startuprecordermaxdepth":
         case "StartupRecorderMaxDepth": return int.class;
+        case "startuprecorderprofile":
+        case "StartupRecorderProfile": return java.lang.String.class;
+        case "startuprecorderrecording":
+        case "StartupRecorderRecording": return boolean.class;
         case "streamcachinganyspoolrules":
         case "StreamCachingAnySpoolRules": return boolean.class;
         case "streamcachingbuffersize":
@@ -488,8 +504,16 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "ShutdownTimeout": return target.getShutdownTimeout();
         case "startuprecorder":
         case "StartupRecorder": return target.getStartupRecorder();
+        case "startuprecorderdir":
+        case "StartupRecorderDir": return target.getStartupRecorderDir();
+        case "startuprecorderduration":
+        case "StartupRecorderDuration": return target.getStartupRecorderDuration();
         case "startuprecordermaxdepth":
         case "StartupRecorderMaxDepth": return target.getStartupRecorderMaxDepth();
+        case "startuprecorderprofile":
+        case "StartupRecorderProfile": return target.getStartupRecorderProfile();
+        case "startuprecorderrecording":
+        case "StartupRecorderRecording": return target.isStartupRecorderRecording();
         case "streamcachinganyspoolrules":
         case "StreamCachingAnySpoolRules": return target.isStreamCachingAnySpoolRules();
         case "streamcachingbuffersize":
diff --git a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index 9429f05..640fe32 100644
--- a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -72,7 +72,11 @@
     { "name": "camel.main.shutdownSuppressLoggingOnTimeout", "description": "Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors\/warnings et all in the logs as a side-effect of the forced timeout. Notice the suppress is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control. This option is defa [...]
     { "name": "camel.main.shutdownTimeout", "description": "Timeout in seconds to graceful shutdown Camel.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int", "defaultValue": 45 },
     { "name": "camel.main.startupRecorder", "description": "To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false, logging, java-flight-recorder The default is false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.main.startupRecorderDir", "description": "Directory to store the recording. By default the user home directory will be used. Use false to turn off saving recording to disk.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.main.startupRecorderDuration", "description": "How long time to run the startup recorder. Use 0 (default) to stop the recorder after Camel has been started. Use -1 to keep the recorder running until Camel is being stopped. A positive value is to run the recorder for N seconds. When the recorder is stopped then the recording is auto saved to disk", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "long" },
     { "name": "camel.main.startupRecorderMaxDepth", "description": "To filter our sub steps at a maximum depth. Use -1 for no maximum. Use 0 for no sub steps. Use 1 for max 1 sub step, and so forth. The default is -1.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int", "defaultValue": -1 },
+    { "name": "camel.main.startupRecorderProfile", "description": "To use a specific Java Flight Recorder profile configuration, such as default or profile. The default is default.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String", "defaultValue": "default" },
+    { "name": "camel.main.startupRecorderRecording", "description": "To enable Java Flight Recorder to start a recording and automatic dump the recording to disk after startup is complete. This requires that camel-jfr is on the classpath. The default is true.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
     { "name": "camel.main.streamCachingAnySpoolRules", "description": "Sets whether if just any of the org.apache.camel.spi.StreamCachingStrategy.SpoolRule rules returns true then shouldSpoolCache(long) returns true, to allow spooling to disk. If this option is false, then all the org.apache.camel.spi.StreamCachingStrategy.SpoolRule must return true. The default value is false which means that all the rules must return true.", "sourceType": "org.apache.camel.main.DefaultConfigurationProp [...]
     { "name": "camel.main.streamCachingBufferSize", "description": "Sets the stream caching buffer size to use when allocating in-memory buffers used for in-memory stream caches. The default size is 4096.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int" },
     { "name": "camel.main.streamCachingEnabled", "description": "Sets whether stream caching is enabled or not. Default is false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean" },
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index 7c60056..f00aef5 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -84,7 +84,11 @@ The following table lists all the options:
 | *camel.main.shutdownSuppress{zwsp}LoggingOnTimeout* | Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors/warnings et all in the logs as a side-effect of the forced timeout. Notice the suppress is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control. This option is default false. |  | boolean
 | *camel.main.shutdownTimeout* | Timeout in seconds to graceful shutdown Camel. | 45 | int
 | *camel.main.startupRecorder* | To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false, logging, java-flight-recorder The default is false. |  | String
+| *camel.main.startupRecorderDir* | Directory to store the recording. By default the user home directory will be used. Use false to turn off saving recording to disk. |  | String
+| *camel.main.startupRecorder{zwsp}Duration* | How long time to run the startup recorder. Use 0 (default) to stop the recorder after Camel has been started. Use -1 to keep the recorder running until Camel is being stopped. A positive value is to run the recorder for N seconds. When the recorder is stopped then the recording is auto saved to disk |  | long
 | *camel.main.startupRecorderMax{zwsp}Depth* | To filter our sub steps at a maximum depth. Use -1 for no maximum. Use 0 for no sub steps. Use 1 for max 1 sub step, and so forth. The default is -1. | -1 | int
+| *camel.main.startupRecorder{zwsp}Profile* | To use a specific Java Flight Recorder profile configuration, such as default or profile. The default is default. | default | String
+| *camel.main.startupRecorder{zwsp}Recording* | To enable Java Flight Recorder to start a recording and automatic dump the recording to disk after startup is complete. This requires that camel-jfr is on the classpath. The default is true. | true | boolean
 | *camel.main.streamCachingAny{zwsp}SpoolRules* | Sets whether if just any of the org.apache.camel.spi.StreamCachingStrategy.SpoolRule rules returns true then shouldSpoolCache(long) returns true, to allow spooling to disk. If this option is false, then all the org.apache.camel.spi.StreamCachingStrategy.SpoolRule must return true. The default value is false which means that all the rules must return true. |  | boolean
 | *camel.main.streamCachingBuffer{zwsp}Size* | Sets the stream caching buffer size to use when allocating in-memory buffers used for in-memory stream caches. The default size is 4096. |  | int
 | *camel.main.streamCaching{zwsp}Enabled* | Sets whether stream caching is enabled or not. Default is false. |  | boolean
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
index 1eb9f1d..c3ea133 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java
@@ -51,11 +51,13 @@ import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.RouteTemplateParameterSource;
+import org.apache.camel.spi.StartupStepRecorder;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.LifecycleStrategySupport;
 import org.apache.camel.support.PropertyBindingSupport;
 import org.apache.camel.support.ResourceHelper;
 import org.apache.camel.support.service.BaseService;
+import org.apache.camel.support.startup.LoggingStartupStepRecorder;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
@@ -440,6 +442,70 @@ public abstract class BaseMainSupport extends BaseService {
         }
     }
 
+    protected void configureStartupRecorder(CamelContext camelContext) {
+        // we need to load these configurations early as they control the startup recorder when using camel-jfr
+        // and we want to start jfr recording as early as possible to also capture details during bootstrapping Camel
+
+        // load properties
+        Properties prop = camelContext.getPropertiesComponent().loadProperties(name -> name.startsWith("camel."));
+
+        Object value = prop.remove("camel.main.startupRecorder");
+        if (value == null) {
+            value = prop.remove("camel.main.startup-recorder");
+            if (value != null) {
+                mainConfigurationProperties.setStartupRecorder(value.toString());
+            }
+        }
+        value = prop.remove("camel.main.startupRecorderRecording");
+        if (value == null) {
+            value = prop.remove("camel.main.startup-recorder-recording");
+            if (value != null) {
+                mainConfigurationProperties.setStartupRecorderRecording("true".equalsIgnoreCase(value.toString()));
+            }
+        }
+        value = prop.remove("camel.main.startupRecorderProfile");
+        if (value == null) {
+            value = prop.remove("camel.main.startup-recorder-profile");
+            if (value != null) {
+                mainConfigurationProperties.setStartupRecorderProfile(
+                        CamelContextHelper.parseText(camelContext, value.toString()));
+            }
+        }
+        value = prop.remove("camel.main.startupRecorderDuration");
+        if (value == null) {
+            value = prop.remove("camel.main.startup-recorder-duration");
+            if (value != null) {
+                mainConfigurationProperties.setStartupRecorderDuration(Long.parseLong(value.toString()));
+            }
+        }
+        value = prop.remove("camel.main.startupRecorderMaxDepth");
+        if (value == null) {
+            value = prop.remove("camel.main.startup-recorder-max-depth");
+            if (value != null) {
+                mainConfigurationProperties.setStartupRecorderMaxDepth(Integer.parseInt(value.toString()));
+            }
+        }
+
+        if ("false".equals(mainConfigurationProperties.getStartupRecorder())) {
+            camelContext.adapt(ExtendedCamelContext.class).getStartupStepRecorder().setEnabled(false);
+        } else if ("logging".equals(mainConfigurationProperties.getStartupRecorder())) {
+            camelContext.adapt(ExtendedCamelContext.class).setStartupStepRecorder(new LoggingStartupStepRecorder());
+        } else if ("java-flight-recorder".equals(mainConfigurationProperties.getStartupRecorder())
+                || mainConfigurationProperties.getStartupRecorder() == null) {
+            // try to auto discover camel-jfr to use
+            StartupStepRecorder fr = camelContext.adapt(ExtendedCamelContext.class).getBootstrapFactoryFinder()
+                    .newInstance(StartupStepRecorder.FACTORY, StartupStepRecorder.class).orElse(null);
+            if (fr != null) {
+                LOG.debug("Discovered startup recorder: {} from classpath", fr);
+                fr.setRecording(mainConfigurationProperties.isStartupRecorderRecording());
+                fr.setStartupRecorderDuration(mainConfigurationProperties.getStartupRecorderDuration());
+                fr.setRecordingProfile(mainConfigurationProperties.getStartupRecorderProfile());
+                fr.setMaxDepth(mainConfigurationProperties.getStartupRecorderMaxDepth());
+                camelContext.adapt(ExtendedCamelContext.class).setStartupStepRecorder(fr);
+            }
+        }
+    }
+
     protected void configureRoutes(CamelContext camelContext) throws Exception {
         // try to load the route builders
         loadRouteBuilders(camelContext);
@@ -450,6 +516,11 @@ public abstract class BaseMainSupport extends BaseService {
     }
 
     protected void postProcessCamelContext(CamelContext camelContext) throws Exception {
+        // setup properties
+        configurePropertiesService(camelContext);
+        // setup startup recorder before building context
+        configureStartupRecorder(camelContext);
+
         // ensure camel is initialized
         camelContext.build();
 
@@ -457,8 +528,6 @@ public abstract class BaseMainSupport extends BaseService {
             listener.beforeInitialize(this);
         }
 
-        configurePropertiesService(camelContext);
-
         // allow to do configuration before its started
         for (MainListener listener : listeners) {
             listener.beforeConfigure(this);
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
index 13ae341..d2481db 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
@@ -96,7 +96,9 @@ public final class DefaultConfigurationConfigurer {
             if ("false".equals(config.getStartupRecorder())) {
                 ecc.getStartupStepRecorder().setEnabled(false);
             } else if ("logging".equals(config.getStartupRecorder())) {
-                ecc.setStartupStepRecorder(new LoggingStartupStepRecorder());
+                if (!(ecc.getStartupStepRecorder() instanceof LoggingStartupStepRecorder)) {
+                    ecc.setStartupStepRecorder(new LoggingStartupStepRecorder());
+                }
             } else if ("java-flight-recorder".equals(config.getStartupRecorder())) {
                 if (!ecc.getStartupStepRecorder().getClass().getName().startsWith("org.apache.camel.startup.jfr"))
                     throw new IllegalArgumentException(
@@ -104,6 +106,10 @@ public final class DefaultConfigurationConfigurer {
             }
         }
         ecc.getStartupStepRecorder().setMaxDepth(config.getStartupRecorderMaxDepth());
+        ecc.getStartupStepRecorder().setRecording(config.isStartupRecorderRecording());
+        ecc.getStartupStepRecorder().setStartupRecorderDuration(config.getStartupRecorderDuration());
+        ecc.getStartupStepRecorder().setRecordingDir(config.getStartupRecorderDir());
+        ecc.getStartupStepRecorder().setRecordingProfile(config.getStartupRecorderProfile());
 
         ecc.setLightweight(config.isLightweight());
         ecc.getBeanPostProcessor().setEnabled(config.isBeanPostProcessorEnabled());
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
index 8b71105..070b9f9 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
@@ -102,6 +102,10 @@ public abstract class DefaultConfigurationProperties<T> {
     private boolean routeControllerUnhealthyOnExhausted;
     private String startupRecorder;
     private int startupRecorderMaxDepth = -1;
+    private boolean startupRecorderRecording = true;
+    private String startupRecorderProfile = "default";
+    private long startupRecorderDuration;
+    private String startupRecorderDir;
 
     // getter and setters
     // --------------------------------------------------------------
@@ -1127,6 +1131,63 @@ public abstract class DefaultConfigurationProperties<T> {
         this.startupRecorderMaxDepth = startupRecorderMaxDepth;
     }
 
+    public boolean isStartupRecorderRecording() {
+        return startupRecorderRecording;
+    }
+
+    /**
+     * To enable Java Flight Recorder to start a recording and automatic dump the recording to disk after startup is
+     * complete.
+     *
+     * This requires that camel-jfr is on the classpath.
+     *
+     * The default is true.
+     */
+    public void setStartupRecorderRecording(boolean startupRecorderRecording) {
+        this.startupRecorderRecording = startupRecorderRecording;
+    }
+
+    public String getStartupRecorderProfile() {
+        return startupRecorderProfile;
+    }
+
+    /**
+     * To use a specific Java Flight Recorder profile configuration, such as default or profile.
+     *
+     * The default is default.
+     */
+    public void setStartupRecorderProfile(String startupRecorderProfile) {
+        this.startupRecorderProfile = startupRecorderProfile;
+    }
+
+    public long getStartupRecorderDuration() {
+        return startupRecorderDuration;
+    }
+
+    /**
+     * How long time to run the startup recorder.
+     *
+     * Use 0 (default) to stop the recorder after Camel has been started. Use -1 to keep the recorder running until
+     * Camel is being stopped. A positive value is to run the recorder for N seconds.
+     *
+     * When the recorder is stopped then the recording is auto saved to disk
+     */
+    public void setStartupRecorderDuration(long startupRecorderDuration) {
+        this.startupRecorderDuration = startupRecorderDuration;
+    }
+
+    public String getStartupRecorderDir() {
+        return startupRecorderDir;
+    }
+
+    /**
+     * Directory to store the recording. By default the user home directory will be used. Use false to turn off saving
+     * recording to disk.
+     */
+    public void setStartupRecorderDir(String startupRecorderDir) {
+        this.startupRecorderDir = startupRecorderDir;
+    }
+
     // fluent builders
     // --------------------------------------------------------------
 
@@ -1901,4 +1962,46 @@ public abstract class DefaultConfigurationProperties<T> {
         return (T) this;
     }
 
+    /**
+     * To enable Java Flight Recorder to start a recording and automatic dump the recording to disk after startup is
+     * complete.
+     *
+     * This requires that camel-jfr is in use.
+     *
+     * The default is false.
+     */
+    public T withStartupRecorderRecording(boolean startupRecorderRecording) {
+        this.startupRecorderRecording = startupRecorderRecording;
+        return (T) this;
+    }
+
+    /**
+     * To use a specific Java Flight Recorder profile configuration, such as default or profile.
+     *
+     * The default is default.
+     */
+    public T withStartupRecorderProfile(String startupRecorderProfile) {
+        this.startupRecorderProfile = startupRecorderProfile;
+        return (T) this;
+    }
+
+    /**
+     * How long time to run the startup recorder.
+     *
+     * Use 0 (default) to stop the recorder after Camel has been started. Use -1 to keep the recorder running until
+     * Camel is being stopped. A positive value is to run the recorder for N seconds.
+     */
+    public T withStartupRecorderDuration(long startupRecorderDuration) {
+        this.startupRecorderDuration = startupRecorderDuration;
+        return (T) this;
+    }
+
+    /**
+     * Directory to store the recording. By default the user home directory will be used.
+     */
+    public T withStartupRecorderDir(String startupRecorderDir) {
+        this.startupRecorderDir = startupRecorderDir;
+        return (T) this;
+    }
+
 }
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/Main.java b/core/camel-main/src/main/java/org/apache/camel/main/Main.java
index af29695..fcc4633 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/Main.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/Main.java
@@ -139,13 +139,10 @@ public class Main extends MainCommandLineSupport {
 
     @Override
     protected CamelContext createCamelContext() {
-        return new DefaultCamelContext(registry);
-        // TODO: LightweightCamelContext is not ready yet
-        //if (mainConfigurationProperties.isLightweight()) {
-        //    return new LightweightCamelContext(registry);
-        //} else {
-        //    return new DefaultCamelContext(registry);
-        //}
+        // do not build/init camel context yet
+        DefaultCamelContext answer = new DefaultCamelContext(false);
+        answer.setRegistry(registry);
+        return answer;
     }
 
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStepRecorder.java b/core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStepRecorder.java
index 67a8bff..d2e3b9b 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStepRecorder.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStepRecorder.java
@@ -22,11 +22,12 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.camel.StartupStep;
 import org.apache.camel.spi.StartupStepRecorder;
+import org.apache.camel.support.service.ServiceSupport;
 
 /**
  * Default {@link StartupStepRecorder} that is always disabled.
  */
-public class DefaultStartupStepRecorder implements StartupStepRecorder {
+public class DefaultStartupStepRecorder extends ServiceSupport implements StartupStepRecorder {
 
     private final AtomicInteger stepCounter = new AtomicInteger();
     private final Deque<Integer> currentSteps = new ArrayDeque<>();
@@ -74,13 +75,12 @@ public class DefaultStartupStepRecorder implements StartupStepRecorder {
 
     };
 
-    public DefaultStartupStepRecorder() {
-        currentSteps.offerFirst(0);
-    }
-
     private boolean enabled;
-    private boolean disableAfterStarted = true;
     private int maxDepth = -1;
+    private long startupRecorderDuration;
+    private boolean recording;
+    private String recordingDir;
+    private String recordingProfile = "default";
 
     public boolean isEnabled() {
         return enabled;
@@ -91,12 +91,13 @@ public class DefaultStartupStepRecorder implements StartupStepRecorder {
     }
 
     @Override
-    public boolean isDisableAfterStarted() {
-        return disableAfterStarted;
+    public long getStartupRecorderDuration() {
+        return startupRecorderDuration;
     }
 
-    public void setDisableAfterStarted(boolean disableAfterStarted) {
-        this.disableAfterStarted = disableAfterStarted;
+    @Override
+    public void setStartupRecorderDuration(long startupRecorderDuration) {
+        this.startupRecorderDuration = startupRecorderDuration;
     }
 
     @Override
@@ -109,12 +110,42 @@ public class DefaultStartupStepRecorder implements StartupStepRecorder {
     }
 
     @Override
-    public void start() {
+    public boolean isRecording() {
+        return recording;
+    }
+
+    @Override
+    public void setRecording(boolean recording) {
+        this.recording = recording;
+    }
+
+    @Override
+    public String getRecordingDir() {
+        return recordingDir;
+    }
+
+    @Override
+    public void setRecordingDir(String recordingDir) {
+        this.recordingDir = recordingDir;
+    }
+
+    @Override
+    public String getRecordingProfile() {
+        return recordingProfile;
+    }
+
+    @Override
+    public void setRecordingProfile(String recordingProfile) {
+        this.recordingProfile = recordingProfile;
+    }
+
+    @Override
+    protected void doStart() throws Exception {
         currentSteps.offerFirst(0);
     }
 
     @Override
-    public void stop() {
+    public void doStop() throws Exception {
         enabled = false;
         currentSteps.clear();
     }
diff --git a/docs/components/modules/others/pages/jfr.adoc b/docs/components/modules/others/pages/jfr.adoc
index f9f2af7..45f5abb 100644
--- a/docs/components/modules/others/pages/jfr.adoc
+++ b/docs/components/modules/others/pages/jfr.adoc
@@ -19,20 +19,8 @@ The camel-jfr component emits lifecycle events for startup to JFR.
 This can for example be used to pin-point which Camel routes may be slow to startup.
 
 [[jfr-Options]]
-== Options
-
-[width="100%",cols="10%,10%,80%",options="header",]
-|===
-|Option
-|Default
-|Description
-
-|enabled
-|true
-|Whether Camel flight recorder is enabled globally
-
-|===
 
+See the __startupRecorder__ options from xref:components:others:main.adoc[Camel Main]
 
 [[jfr-Example]]
 == Example


[camel] 02/06: CAMEL-16056: Added StartupStep to diagnose startup exeuction times for various steps.

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

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

commit 2dc16e182384438498781f94ea2580a32ca05ca0
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Jan 19 19:49:19 2021 +0100

    CAMEL-16056: Added StartupStep to diagnose startup exeuction times for various steps.
---
 .../main/java/org/apache/camel/StartupStep.java    |  7 ---
 .../org/apache/camel/spi/StartupStepRecorder.java  |  8 +--
 .../camel/impl/engine/AbstractCamelContext.java    |  8 ++-
 .../org/apache/camel/impl/DefaultCamelContext.java |  8 +++
 .../MainConfigurationPropertiesConfigurer.java     | 12 ++++
 .../camel-main-configuration-metadata.json         |  2 +
 core/camel-main/src/main/docs/main.adoc            |  2 +
 .../camel/main/DefaultConfigurationConfigurer.java | 17 ++++++
 .../camel/main/DefaultConfigurationProperties.java | 54 ++++++++++++++++++
 .../support/{ => startup}/DefaultStartupStep.java  |  6 +-
 .../{ => startup}/DefaultStartupStepRecorder.java  | 37 ++-----------
 .../startup/LoggingStartupStepRecorder.java        | 62 +++++++++++++++++++++
 .../jfr/FlightRecorderStartupStep.java}            | 64 ++++++++++++----------
 .../jfr/FlightRecorderStartupStepRecorder.java     | 40 ++++++++++++++
 14 files changed, 247 insertions(+), 80 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/StartupStep.java b/core/camel-api/src/main/java/org/apache/camel/StartupStep.java
index 18f23cd..58d7114 100644
--- a/core/camel-api/src/main/java/org/apache/camel/StartupStep.java
+++ b/core/camel-api/src/main/java/org/apache/camel/StartupStep.java
@@ -62,11 +62,4 @@ public interface StartupStep {
      */
     long getBeginTime();
 
-    /**
-     * Add metadata.
-     *
-     * @param key   the key
-     * @param value the value
-     */
-    void addTag(String key, String value);
 }
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java b/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java
index 60df638..91296d6 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/StartupStepRecorder.java
@@ -36,14 +36,14 @@ public interface StartupStepRecorder extends StaticService {
     void setEnabled(boolean enabled);
 
     /**
-     * Whether to automatic disable this recorder after Camel has been started.
-     * This is done by default to remove any overhead after the startup process is done.
+     * Whether to automatic disable this recorder after Camel has been started. This is done by default to remove any
+     * overhead after the startup process is done.
      */
     boolean isDisableAfterStarted();
 
     /**
-     * Whether to automatic disable this recorder after Camel has been started.
-     * This is done by default to remove any overhead after the startup process is done.
+     * Whether to automatic disable this recorder after Camel has been started. This is done by default to remove any
+     * overhead after the startup process is done.
      */
     void setDisableAfterStarted(boolean disableAfterStarted);
 
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index b4ccabd..8640bd7 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -154,7 +154,6 @@ import org.apache.camel.spi.Validator;
 import org.apache.camel.spi.ValidatorRegistry;
 import org.apache.camel.spi.XMLRoutesDefinitionLoader;
 import org.apache.camel.support.CamelContextHelper;
-import org.apache.camel.support.DefaultStartupStepRecorder;
 import org.apache.camel.support.EndpointHelper;
 import org.apache.camel.support.EventHelper;
 import org.apache.camel.support.LRUCacheFactory;
@@ -165,6 +164,7 @@ import org.apache.camel.support.ResolverHelper;
 import org.apache.camel.support.jsse.SSLContextParameters;
 import org.apache.camel.support.service.BaseService;
 import org.apache.camel.support.service.ServiceHelper;
+import org.apache.camel.support.startup.DefaultStartupStepRecorder;
 import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.StopWatch;
@@ -2527,6 +2527,9 @@ public abstract class AbstractCamelContext extends BaseService
     @Override
     public void doBuild() throws Exception {
         bootDate = System.currentTimeMillis();
+        if (!(startupStepRecorder instanceof DefaultStartupStepRecorder)) {
+            LOG.info("Using startup recorder: {}", startupStepRecorder);
+        }
         startupStepRecorder.start();
         StartupStep step = startupStepRecorder.beginStep(CamelContext.class, null, "Building context");
 
@@ -3249,6 +3252,8 @@ public abstract class AbstractCamelContext extends BaseService
                 // start the route service
                 routeServices.put(routeService.getId(), routeService);
                 if (shouldStartRoutes()) {
+                    StartupStep step
+                            = startupStepRecorder.beginStep(Route.class, routeService.getId(), "Starting route services");
                     // this method will log the routes being started
                     internalRouteStartupManager.safelyStartRouteServices(true, true, true, false, addingRoutes, routeService);
                     // start route services if it was configured to auto startup
@@ -3259,6 +3264,7 @@ public abstract class AbstractCamelContext extends BaseService
                         // starting a route (not adding new routes)
                         routeService.start();
                     }
+                    startupStepRecorder.endStep(step);
                 }
             }
         } finally {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index 43e4941..71ff083 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -24,10 +24,12 @@ import java.util.function.Function;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Expression;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.FailedToStartRouteException;
 import org.apache.camel.Predicate;
 import org.apache.camel.Processor;
 import org.apache.camel.Route;
+import org.apache.camel.StartupStep;
 import org.apache.camel.ValueHolder;
 import org.apache.camel.builder.AdviceWith;
 import org.apache.camel.builder.AdviceWithRouteBuilder;
@@ -60,6 +62,7 @@ import org.apache.camel.spi.ExecutorServiceManager;
 import org.apache.camel.spi.ModelReifierFactory;
 import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.Registry;
+import org.apache.camel.spi.StartupStepRecorder;
 import org.apache.camel.spi.Transformer;
 import org.apache.camel.spi.Validator;
 import org.apache.camel.support.CamelContextHelper;
@@ -600,7 +603,12 @@ public class DefaultCamelContext extends SimpleCamelContext implements ModelCame
                     routeDefinition.markPrepared();
                 }
 
+                StartupStepRecorder recorder
+                        = getCamelContextReference().adapt(ExtendedCamelContext.class).getStartupStepRecorder();
+                StartupStep step = recorder.beginStep(Route.class, routeDefinition.getRouteId(), "Creating route");
                 Route route = model.getModelReifierFactory().createRoute(this, routeDefinition);
+                recorder.endStep(step);
+
                 RouteService routeService = new RouteService(route);
                 startRouteService(routeService, true);
 
diff --git a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
index 28ced68..0ec603e 100644
--- a/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
+++ b/core/camel-main/src/generated/java/org/apache/camel/main/MainConfigurationPropertiesConfigurer.java
@@ -143,6 +143,10 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "ShutdownSuppressLoggingOnTimeout": target.setShutdownSuppressLoggingOnTimeout(property(camelContext, boolean.class, value)); return true;
         case "shutdowntimeout":
         case "ShutdownTimeout": target.setShutdownTimeout(property(camelContext, int.class, value)); return true;
+        case "startuprecorder":
+        case "StartupRecorder": target.setStartupRecorder(property(camelContext, java.lang.String.class, value)); return true;
+        case "startuprecordermaxdepth":
+        case "StartupRecorderMaxDepth": target.setStartupRecorderMaxDepth(property(camelContext, int.class, value)); return true;
         case "streamcachinganyspoolrules":
         case "StreamCachingAnySpoolRules": target.setStreamCachingAnySpoolRules(property(camelContext, boolean.class, value)); return true;
         case "streamcachingbuffersize":
@@ -310,6 +314,10 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "ShutdownSuppressLoggingOnTimeout": return boolean.class;
         case "shutdowntimeout":
         case "ShutdownTimeout": return int.class;
+        case "startuprecorder":
+        case "StartupRecorder": return java.lang.String.class;
+        case "startuprecordermaxdepth":
+        case "StartupRecorderMaxDepth": return int.class;
         case "streamcachinganyspoolrules":
         case "StreamCachingAnySpoolRules": return boolean.class;
         case "streamcachingbuffersize":
@@ -478,6 +486,10 @@ public class MainConfigurationPropertiesConfigurer extends org.apache.camel.supp
         case "ShutdownSuppressLoggingOnTimeout": return target.isShutdownSuppressLoggingOnTimeout();
         case "shutdowntimeout":
         case "ShutdownTimeout": return target.getShutdownTimeout();
+        case "startuprecorder":
+        case "StartupRecorder": return target.getStartupRecorder();
+        case "startuprecordermaxdepth":
+        case "StartupRecorderMaxDepth": return target.getStartupRecorderMaxDepth();
         case "streamcachinganyspoolrules":
         case "StreamCachingAnySpoolRules": return target.isStreamCachingAnySpoolRules();
         case "streamcachingbuffersize":
diff --git a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
index 7a249fd..9429f05 100644
--- a/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
+++ b/core/camel-main/src/generated/resources/META-INF/camel-main-configuration-metadata.json
@@ -71,6 +71,8 @@
     { "name": "camel.main.shutdownRoutesInReverseOrder", "description": "Sets whether routes should be shutdown in reverse or the same order as they were started.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean", "defaultValue": true },
     { "name": "camel.main.shutdownSuppressLoggingOnTimeout", "description": "Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors\/warnings et all in the logs as a side-effect of the forced timeout. Notice the suppress is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control. This option is defa [...]
     { "name": "camel.main.shutdownTimeout", "description": "Timeout in seconds to graceful shutdown Camel.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int", "defaultValue": 45 },
+    { "name": "camel.main.startupRecorder", "description": "To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false, logging, java-flight-recorder The default is false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "string", "javaType": "java.lang.String" },
+    { "name": "camel.main.startupRecorderMaxDepth", "description": "To filter our sub steps at a maximum depth. Use -1 for no maximum. Use 0 for no sub steps. Use 1 for max 1 sub step, and so forth. The default is -1.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int", "defaultValue": -1 },
     { "name": "camel.main.streamCachingAnySpoolRules", "description": "Sets whether if just any of the org.apache.camel.spi.StreamCachingStrategy.SpoolRule rules returns true then shouldSpoolCache(long) returns true, to allow spooling to disk. If this option is false, then all the org.apache.camel.spi.StreamCachingStrategy.SpoolRule must return true. The default value is false which means that all the rules must return true.", "sourceType": "org.apache.camel.main.DefaultConfigurationProp [...]
     { "name": "camel.main.streamCachingBufferSize", "description": "Sets the stream caching buffer size to use when allocating in-memory buffers used for in-memory stream caches. The default size is 4096.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "integer", "javaType": "int" },
     { "name": "camel.main.streamCachingEnabled", "description": "Sets whether stream caching is enabled or not. Default is false.", "sourceType": "org.apache.camel.main.DefaultConfigurationProperties", "type": "boolean", "javaType": "boolean" },
diff --git a/core/camel-main/src/main/docs/main.adoc b/core/camel-main/src/main/docs/main.adoc
index 32177f1..7c60056 100644
--- a/core/camel-main/src/main/docs/main.adoc
+++ b/core/camel-main/src/main/docs/main.adoc
@@ -83,6 +83,8 @@ The following table lists all the options:
 | *camel.main.shutdownRoutesIn{zwsp}ReverseOrder* | Sets whether routes should be shutdown in reverse or the same order as they were started. | true | boolean
 | *camel.main.shutdownSuppress{zwsp}LoggingOnTimeout* | Whether Camel should try to suppress logging during shutdown and timeout was triggered, meaning forced shutdown is happening. And during forced shutdown we want to avoid logging errors/warnings et all in the logs as a side-effect of the forced timeout. Notice the suppress is a best effort as there may still be some logs coming from 3rd party libraries and whatnot, which Camel cannot control. This option is default false. |  | boolean
 | *camel.main.shutdownTimeout* | Timeout in seconds to graceful shutdown Camel. | 45 | int
+| *camel.main.startupRecorder* | To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false, logging, java-flight-recorder The default is false. |  | String
+| *camel.main.startupRecorderMax{zwsp}Depth* | To filter our sub steps at a maximum depth. Use -1 for no maximum. Use 0 for no sub steps. Use 1 for max 1 sub step, and so forth. The default is -1. | -1 | int
 | *camel.main.streamCachingAny{zwsp}SpoolRules* | Sets whether if just any of the org.apache.camel.spi.StreamCachingStrategy.SpoolRule rules returns true then shouldSpoolCache(long) returns true, to allow spooling to disk. If this option is false, then all the org.apache.camel.spi.StreamCachingStrategy.SpoolRule must return true. The default value is false which means that all the rules must return true. |  | boolean
 | *camel.main.streamCachingBuffer{zwsp}Size* | Sets the stream caching buffer size to use when allocating in-memory buffers used for in-memory stream caches. The default size is 4096. |  | int
 | *camel.main.streamCaching{zwsp}Enabled* | Sets whether stream caching is enabled or not. Default is false. |  | boolean
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
index 51c200f..e8a2757 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
@@ -59,6 +59,7 @@ import org.apache.camel.spi.RouteController;
 import org.apache.camel.spi.RoutePolicyFactory;
 import org.apache.camel.spi.RuntimeEndpointRegistry;
 import org.apache.camel.spi.ShutdownStrategy;
+import org.apache.camel.spi.StartupStepRecorder;
 import org.apache.camel.spi.StreamCachingStrategy;
 import org.apache.camel.spi.SupervisingRouteController;
 import org.apache.camel.spi.ThreadPoolFactory;
@@ -66,6 +67,8 @@ import org.apache.camel.spi.ThreadPoolProfile;
 import org.apache.camel.spi.UnitOfWorkFactory;
 import org.apache.camel.spi.UuidGenerator;
 import org.apache.camel.support.jsse.GlobalSSLContextParametersSupplier;
+import org.apache.camel.support.startup.LoggingStartupStepRecorder;
+import org.apache.camel.support.startup.jfr.FlightRecorderStartupStepRecorder;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -89,6 +92,16 @@ public final class DefaultConfigurationConfigurer {
      */
     public static void configure(CamelContext camelContext, DefaultConfigurationProperties config) throws Exception {
         ExtendedCamelContext ecc = camelContext.adapt(ExtendedCamelContext.class);
+
+        if (config.getStartupRecorder() != null && !"false".equals(config.getStartupRecorder())) {
+            if ("logging".equals(config.getStartupRecorder())) {
+                ecc.setStartupStepRecorder(new LoggingStartupStepRecorder());
+            } else if ("java-flight-recorder".equals(config.getStartupRecorder())) {
+                ecc.setStartupStepRecorder(new FlightRecorderStartupStepRecorder());
+            }
+        }
+        ecc.getStartupStepRecorder().setMaxDepth(config.getStartupRecorderMaxDepth());
+
         ecc.setLightweight(config.isLightweight());
         ecc.getBeanPostProcessor().setEnabled(config.isBeanPostProcessorEnabled());
         ecc.getBeanIntrospection().setExtendedStatistics(config.isBeanIntrospectionExtendedStatistics());
@@ -239,6 +252,10 @@ public final class DefaultConfigurationConfigurer {
         final ManagementStrategy managementStrategy = camelContext.getManagementStrategy();
         final ExtendedCamelContext ecc = camelContext.adapt(ExtendedCamelContext.class);
 
+        StartupStepRecorder ssr = getSingleBeanOfType(registry, StartupStepRecorder.class);
+        if (ssr != null) {
+            ecc.setStartupStepRecorder(ssr);
+        }
         PropertiesComponent pc = getSingleBeanOfType(registry, PropertiesComponent.class);
         if (pc != null) {
             ecc.setPropertiesComponent(pc);
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
index 44de80a..8b71105 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationProperties.java
@@ -100,6 +100,8 @@ public abstract class DefaultConfigurationProperties<T> {
     private long routeControllerBackOffMaxAttempts;
     private double routeControllerBackOffMultiplier;
     private boolean routeControllerUnhealthyOnExhausted;
+    private String startupRecorder;
+    private int startupRecorderMaxDepth = -1;
 
     // getter and setters
     // --------------------------------------------------------------
@@ -1096,6 +1098,35 @@ public abstract class DefaultConfigurationProperties<T> {
         this.routeControllerUnhealthyOnExhausted = routeControllerUnhealthyOnExhausted;
     }
 
+    public String getStartupRecorder() {
+        return startupRecorder;
+    }
+
+    /**
+     * To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false,
+     * logging, java-flight-recorder
+     *
+     * The default is false.
+     */
+    public void setStartupRecorder(String startupRecorder) {
+        this.startupRecorder = startupRecorder;
+    }
+
+    public int getStartupRecorderMaxDepth() {
+        return startupRecorderMaxDepth;
+    }
+
+    /**
+     * To filter our sub steps at a maximum depth.
+     *
+     * Use -1 for no maximum. Use 0 for no sub steps. Use 1 for max 1 sub step, and so forth.
+     *
+     * The default is -1.
+     */
+    public void setStartupRecorderMaxDepth(int startupRecorderMaxDepth) {
+        this.startupRecorderMaxDepth = startupRecorderMaxDepth;
+    }
+
     // fluent builders
     // --------------------------------------------------------------
 
@@ -1847,4 +1878,27 @@ public abstract class DefaultConfigurationProperties<T> {
         return (T) this;
     }
 
+    /**
+     * To use startup recorder for capturing execution time during starting Camel. The recorder can be one of: false,
+     * logging, java-flight-recorder
+     *
+     * The default is false.
+     */
+    public T withStartupRecorder(String startupRecorder) {
+        this.startupRecorder = startupRecorder;
+        return (T) this;
+    }
+
+    /**
+     * To filter our sub steps at a maximum depth.
+     *
+     * Use -1 for no maximum. Use 0 for no sub steps. Use 1 for max 1 sub step, and so forth.
+     *
+     * The default is -1.
+     */
+    public T withStartupRecorderMaxDepth(int startupRecorderMaxDepth) {
+        this.startupRecorderMaxDepth = startupRecorderMaxDepth;
+        return (T) this;
+    }
+
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStep.java b/core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStep.java
similarity index 95%
copy from core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStep.java
copy to core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStep.java
index c8e9e46..d604743 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStep.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStep.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.support;
+package org.apache.camel.support.startup;
 
 import org.apache.camel.StartupStep;
 
@@ -78,8 +78,4 @@ public class DefaultStartupStep implements StartupStep {
         // noop
     }
 
-    @Override
-    public void addTag(String key, String value) {
-
-    }
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStepRecorder.java b/core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStepRecorder.java
similarity index 77%
rename from core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStepRecorder.java
rename to core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStepRecorder.java
index e07e1ce..0fab31e 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStepRecorder.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/startup/DefaultStartupStepRecorder.java
@@ -14,28 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.support;
+package org.apache.camel.support.startup;
 
 import java.util.ArrayDeque;
-import java.util.Arrays;
 import java.util.Deque;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.camel.StartupStep;
 import org.apache.camel.spi.StartupStepRecorder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
- * Default {@link StartupStepRecorder} that outputs to log.
+ * Default {@link StartupStepRecorder} that is always disabled.
  */
 public class DefaultStartupStepRecorder implements StartupStepRecorder {
 
-    private static final Logger LOG = LoggerFactory.getLogger(StartupStepRecorder.class);
-
-    // TODO: jfr implementation
-    // TODO: spring-boot implementation
-
     private final AtomicInteger stepCounter = new AtomicInteger();
     private final Deque<Integer> currentSteps = new ArrayDeque<>();
 
@@ -80,13 +72,10 @@ public class DefaultStartupStepRecorder implements StartupStepRecorder {
             return 0;
         }
 
-        @Override
-        public void addTag(String key, String value) {
-            // noop
-        }
     };
 
     public DefaultStartupStepRecorder() {
+        currentSteps.offerFirst(0);
     }
 
     private boolean enabled;
@@ -165,25 +154,7 @@ public class DefaultStartupStepRecorder implements StartupStepRecorder {
     }
 
     protected void onEndStep(StartupStep step) {
-        if (LOG.isInfoEnabled()) {
-            long delta = System.currentTimeMillis() - step.getBeginTime();
-            String pad = padString(step.getLevel());
-            String out = String.format("%s", pad + step.getType());
-            String out2 = String.format("%6s ms", delta);
-            String out3 = String.format("%s(%s)", step.getDescription(), step.getName());
-            LOG.info("{} : {} - {}", out2, out, out3);
-        }
-    }
-
-    public static String padString(int level) {
-        if (level == 0) {
-            return "";
-        } else {
-            byte[] arr = new byte[level * 2];
-            byte space = ' ';
-            Arrays.fill(arr, space);
-            return new String(arr);
-        }
+        // noop
     }
 
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/startup/LoggingStartupStepRecorder.java b/core/camel-support/src/main/java/org/apache/camel/support/startup/LoggingStartupStepRecorder.java
new file mode 100644
index 0000000..3c73db0
--- /dev/null
+++ b/core/camel-support/src/main/java/org/apache/camel/support/startup/LoggingStartupStepRecorder.java
@@ -0,0 +1,62 @@
+/*
+ * 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.support.startup;
+
+import java.util.Arrays;
+
+import org.apache.camel.StartupStep;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Logging {@link org.apache.camel.spi.StartupStepRecorder} that outputs to log.
+ */
+public class LoggingStartupStepRecorder extends DefaultStartupStepRecorder {
+
+    private static final Logger LOG = LoggerFactory.getLogger(LoggingStartupStepRecorder.class);
+
+    public LoggingStartupStepRecorder() {
+        setEnabled(true);
+    }
+
+    protected void onEndStep(StartupStep step) {
+        if (LOG.isInfoEnabled()) {
+            long delta = System.currentTimeMillis() - step.getBeginTime();
+            String pad = padString(step.getLevel());
+            String out = String.format("%s", pad + step.getType());
+            String out2 = String.format("%6s ms", delta);
+            String out3 = String.format("%s(%s)", step.getDescription(), step.getName());
+            LOG.info("{} : {} - {}", out2, out, out3);
+        }
+    }
+
+    public static String padString(int level) {
+        if (level == 0) {
+            return "";
+        } else {
+            byte[] arr = new byte[level * 2];
+            byte space = ' ';
+            Arrays.fill(arr, space);
+            return new String(arr);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "logging";
+    }
+}
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStep.java b/core/camel-support/src/main/java/org/apache/camel/support/startup/jfr/FlightRecorderStartupStep.java
similarity index 60%
rename from core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStep.java
rename to core/camel-support/src/main/java/org/apache/camel/support/startup/jfr/FlightRecorderStartupStep.java
index c8e9e46..f07b712 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/DefaultStartupStep.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/startup/jfr/FlightRecorderStartupStep.java
@@ -14,33 +14,40 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.support;
+package org.apache.camel.support.startup.jfr;
 
+import jdk.jfr.Category;
+import jdk.jfr.Description;
+import jdk.jfr.Event;
+import jdk.jfr.Label;
+import jdk.jfr.Name;
+import jdk.jfr.StackTrace;
 import org.apache.camel.StartupStep;
 
-public class DefaultStartupStep implements StartupStep {
+@Name(FlightRecorderStartupStep.NAME)
+@Category("Camel Application")
+@Label("Startup Step")
+@Description("Camel Application Startup")
+@StackTrace(false)
+public class FlightRecorderStartupStep extends Event implements StartupStep {
 
-    private final String type;
-    private final String name;
-    private final String description;
-    private final int id;
-    private final int parentId;
-    private final int level;
-    private final long time;
+    public static final String NAME = "org.apache.camel.spi.CamelEvent";
 
-    public DefaultStartupStep(String type, String name, String description, int id, int parentId, int level, long time) {
-        this.type = type;
+    @Label("Event Name")
+    public final String name;
+    @Label("Event Id")
+    public final int id;
+    @Label("Event Parent Id")
+    public final int parentId;
+    @Label("Event Type")
+    public String type;
+    @Label("Event Description")
+    public String description;
+
+    public FlightRecorderStartupStep(String name, int id, int parentId) {
         this.name = name;
-        this.description = description;
         this.id = id;
         this.parentId = parentId;
-        this.level = level;
-        this.time = time;
-    }
-
-    @Override
-    public String getType() {
-        return type;
     }
 
     @Override
@@ -49,11 +56,6 @@ public class DefaultStartupStep implements StartupStep {
     }
 
     @Override
-    public String getDescription() {
-        return description;
-    }
-
-    @Override
     public int getId() {
         return id;
     }
@@ -65,21 +67,23 @@ public class DefaultStartupStep implements StartupStep {
 
     @Override
     public int getLevel() {
-        return level;
+        // not used by jfr
+        return 0;
     }
 
     @Override
     public long getBeginTime() {
-        return time;
+        // not used by jfr
+        return 0;
     }
 
     @Override
-    public void end() {
-        // noop
+    public String getType() {
+        return type;
     }
 
     @Override
-    public void addTag(String key, String value) {
-
+    public String getDescription() {
+        return description;
     }
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/startup/jfr/FlightRecorderStartupStepRecorder.java b/core/camel-support/src/main/java/org/apache/camel/support/startup/jfr/FlightRecorderStartupStepRecorder.java
new file mode 100644
index 0000000..7c216ac
--- /dev/null
+++ b/core/camel-support/src/main/java/org/apache/camel/support/startup/jfr/FlightRecorderStartupStepRecorder.java
@@ -0,0 +1,40 @@
+/*
+ * 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.support.startup.jfr;
+
+import org.apache.camel.StartupStep;
+import org.apache.camel.support.startup.DefaultStartupStepRecorder;
+
+/**
+ * To capture startup steps to be emitted to Java Flight Recorder.
+ */
+public class FlightRecorderStartupStepRecorder extends DefaultStartupStepRecorder {
+
+    public FlightRecorderStartupStepRecorder() {
+        setEnabled(true);
+    }
+
+    @Override
+    public StartupStep createStartupStep(String type, String name, String description, int id, int parentId, int level) {
+        return new FlightRecorderStartupStep(name, id, parentId);
+    }
+
+    @Override
+    public String toString() {
+        return "java-flight-recorder";
+    }
+}