You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by df...@apache.org on 2021/04/20 18:31:28 UTC

[camel-performance-tests] branch main created (now be76098)

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

dfoulks pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git.


      at be76098  Update profile test

This branch includes the following new commits:

     new 4d788c3  Initial camel performance
     new 3361fb1  Initial camel performance
     new 991ff0b  Initial camel performance
     new aed9c5e  Remove files added by mistake
     new f6a9bad  Add a Kafka to AWS2-S3 example with JFR
     new 91ae935  Kafka-S3 Example: Renamed the docker image
     new 03e8fe8  Kafka to S3: Fixed title
     new 42b1442  CAMEL-16251 - Move Performance and jmh itests in a separated repository
     new a3595b8  CAMEL-16251 - Move Performance and jmh itests in a separated repository
     new bd8fbbb  CAMEL-16251 - Move Performance and jmh itests in a separated repository
     new f585f68  CAMEL-16251 - Move Performance and jmh itests in a separated repository
     new 1d31f97  CAMEL-16251 - Move Performance and jmh itests in a separated repository
     new 88cd709  CAMEL-16251 - Move Performance and jmh itests in a separated repository
     new 6027bb8  CAMEL-16337: Add short uuid generator that uses 50% the size as the default.
     new 72f547f  Add http profiling demo
     new be76098  Update profile test

The 16 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.


[camel-performance-tests] 05/16: Add a Kafka to AWS2-S3 example with JFR

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit f6a9bad2af225f576cb2deb91a82c23076beb324
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Mar 10 15:28:48 2021 +0100

    Add a Kafka to AWS2-S3 example with JFR
---
 .gitignore                                         |   1 +
 .../.mvn/wrapper/MavenWrapperDownloader.java       | 117 +++
 profiling/kafka-s3/.mvn/wrapper/maven-wrapper.jar  | Bin 0 -> 50710 bytes
 .../kafka-s3/.mvn/wrapper/maven-wrapper.properties |   2 +
 profiling/kafka-s3/README.md                       |  48 +
 profiling/kafka-s3/data/application.properties     |  42 +
 profiling/kafka-s3/data/payload/msg.txt            |   1 +
 profiling/kafka-s3/data/sink/routes-sink.yaml      |  23 +
 profiling/kafka-s3/data/sink/s3.yaml               |  22 +
 profiling/kafka-s3/data/sources/k-sink.yaml        |  24 +
 profiling/kafka-s3/data/sources/k-source.yaml      |  24 +
 profiling/kafka-s3/data/sources/routes.yaml        |  29 +
 profiling/kafka-s3/jfr/settings_for_heap.jfc       | 965 +++++++++++++++++++++
 profiling/kafka-s3/mvnw                            | 310 +++++++
 profiling/kafka-s3/mvnw.cmd                        | 182 ++++
 profiling/kafka-s3/pom.xml                         | 177 ++++
 .../src/main/resources/application.properties      |  30 +
 profiling/pom.xml                                  |   1 +
 18 files changed, 1998 insertions(+)

diff --git a/.gitignore b/.gitignore
index 5d69a55..7da6bc6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,3 +25,4 @@ components/camel-cxf/activemq-data
 *.swp
 .flattened-pom.xml
 .java-version
+.jfr
diff --git a/profiling/kafka-s3/.mvn/wrapper/MavenWrapperDownloader.java b/profiling/kafka-s3/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000..b901097
--- /dev/null
+++ b/profiling/kafka-s3/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed 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.
+ */
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    private static final String WRAPPER_VERSION = "0.5.6";
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+        + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if(mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if(mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if(!outputFile.getParentFile().exists()) {
+            if(!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+            String username = System.getenv("MVNW_USERNAME");
+            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
+                @Override
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
+                }
+            });
+        }
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}
diff --git a/profiling/kafka-s3/.mvn/wrapper/maven-wrapper.jar b/profiling/kafka-s3/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..2cc7d4a
Binary files /dev/null and b/profiling/kafka-s3/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/profiling/kafka-s3/.mvn/wrapper/maven-wrapper.properties b/profiling/kafka-s3/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..642d572
--- /dev/null
+++ b/profiling/kafka-s3/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/profiling/kafka-s3/README.md b/profiling/kafka-s3/README.md
new file mode 100644
index 0000000..29026c8
--- /dev/null
+++ b/profiling/kafka-s3/README.md
@@ -0,0 +1,48 @@
+# camel-k-runtime-example-kafka-s3
+
+build:
+```shell script
+./mvnw package
+```
+
+docker:
+```shell script
+docker run --rm -ti \
+    -v $PWD/data:/etc/camel:Z \
+    -e CAMEL_K_CONF=/etc/camel/application.properties \
+    -e AWS_ACCESS_KEY=<access_key> \
+    -e AWS_SECRET_KEY=<secret_key> \
+    --network="host" \
+    quay.io/oscerd/camel-k-runtime-example-kafka-s3:1.6.0-jvm
+```
+
+You'll need a running Kafka broker locally on your host.
+
+## Enabling JFR 
+
+docker:
+```shell script
+docker run --rm -ti \
+    -v $PWD/data:/etc/camel:Z \
+    -v $PWD/jfr:/work/jfr:Z \
+    -e CAMEL_K_CONF=/etc/camel/application.properties \
+    -e AWS_ACCESS_KEY=<access_key> \
+    -e AWS_SECRET_KEY=<secret_key> \
+    --network="host" \
+    quay.io/oscerd/camel-k-runtime-example-kafka-s3:1.6.0-jvm
+```
+
+You'll need a running Kafka broker locally on your host.
+
+Now you can start JFR with the following command
+
+```
+docker exec -it <container_id> jcmd 1 JFR.start name=Test settings=jfr/settings_for_heap.jfc duration=5m filename=jfr/output.jfr
+```
+
+and check the status
+
+```
+docker exec -it <container_id> jcmd 1 JFR.check
+```
+
diff --git a/profiling/kafka-s3/data/application.properties b/profiling/kafka-s3/data/application.properties
new file mode 100644
index 0000000..5ce6c6e
--- /dev/null
+++ b/profiling/kafka-s3/data/application.properties
@@ -0,0 +1,42 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+#
+# camel - main
+#
+camel.main.name = camel-k-runtime-examples-yaml
+camel.main.stream-caching-enabled = true
+camel.main.stream-caching-spool-directory = ${java.io.tmpdir}/camel-q
+
+#
+# camel-k - sources (templates)
+#
+camel.k.sources[0].location = file:/etc/camel/sources/k-source.yaml
+camel.k.sources[0].type     = template
+camel.k.sources[1].location = file:/etc/camel/sources/k-sink.yaml
+camel.k.sources[1].type     = template
+
+#
+# camel-k - sources (routes)
+#
+camel.k.sources[2].location = file:/etc/camel/sources/routes.yaml
+camel.k.sources[2].type     = source
+
+camel.component.aws2-s3.access-key=${AWS_ACCESS_KEY}
+camel.component.aws2-s3.secret-key=${AWS_SECRET_KEY}
+camel.component.aws2-s3.region=${AWS_REGION:eu-west-1}
+
diff --git a/profiling/kafka-s3/data/payload/msg.txt b/profiling/kafka-s3/data/payload/msg.txt
new file mode 100644
index 0000000..44e6c85
--- /dev/null
+++ b/profiling/kafka-s3/data/payload/msg.txt
@@ -0,0 +1 @@
+Hello from profiling app
diff --git a/profiling/kafka-s3/data/sink/routes-sink.yaml b/profiling/kafka-s3/data/sink/routes-sink.yaml
new file mode 100644
index 0000000..824f96a
--- /dev/null
+++ b/profiling/kafka-s3/data/sink/routes-sink.yaml
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+
+- from:
+    uri: "kamelet:sink"
+    steps:
+      - log: "${body}"
+      - to: "aws2-s3:camel-kafka-connector?keyName=test.txt"
+
diff --git a/profiling/kafka-s3/data/sink/s3.yaml b/profiling/kafka-s3/data/sink/s3.yaml
new file mode 100644
index 0000000..e14f470
--- /dev/null
+++ b/profiling/kafka-s3/data/sink/s3.yaml
@@ -0,0 +1,22 @@
+#
+# 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.
+#
+
+- from:
+    uri: "kamelet:sink"
+    steps:
+      - log: "${body}"
+      - to: "aws2-s3:camel-kafka-connector?keyName=daje.txt"
diff --git a/profiling/kafka-s3/data/sources/k-sink.yaml b/profiling/kafka-s3/data/sources/k-sink.yaml
new file mode 100644
index 0000000..d883aa9
--- /dev/null
+++ b/profiling/kafka-s3/data/sources/k-sink.yaml
@@ -0,0 +1,24 @@
+#
+# 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.
+#
+
+- from:
+    uri: kamelet:source
+    steps:
+      - to: 
+          uri: "aws2-s3:{{bucketName}}"
+          parameters:
+            keyName: "{{keyName}}"
diff --git a/profiling/kafka-s3/data/sources/k-source.yaml b/profiling/kafka-s3/data/sources/k-source.yaml
new file mode 100644
index 0000000..928e392
--- /dev/null
+++ b/profiling/kafka-s3/data/sources/k-source.yaml
@@ -0,0 +1,24 @@
+#
+# 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.
+#
+
+- from:
+    uri: kafka:testtopic
+    parameters:
+      brokers: "{{brokers}}"
+    steps:
+      - log: "${body}"
+      - to: "kamelet:sink"
diff --git a/profiling/kafka-s3/data/sources/routes.yaml b/profiling/kafka-s3/data/sources/routes.yaml
new file mode 100644
index 0000000..5846f24
--- /dev/null
+++ b/profiling/kafka-s3/data/sources/routes.yaml
@@ -0,0 +1,29 @@
+#
+# 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.
+#
+
+- route:
+    from: 
+      uri: "kamelet:k-source"
+      parameters:
+        brokers: "localhost:9092"
+    steps:
+      - tod: 
+          uri: "kamelet:k-sink"
+          parameters:
+            bucketName: "camel-kafka-connector"
+            keyName: "${date:now:yyyyMMdd-HHmmssSSS}-${exchangeId}"
+
diff --git a/profiling/kafka-s3/jfr/settings_for_heap.jfc b/profiling/kafka-s3/jfr/settings_for_heap.jfc
new file mode 100644
index 0000000..fff6f0a
--- /dev/null
+++ b/profiling/kafka-s3/jfr/settings_for_heap.jfc
@@ -0,0 +1,965 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration version="2.0" label="Settings for &apos;My Recording&apos;" description="none" provider="Oracle">
+
+  <control>
+
+    <selection name="gc-level" default="detailed" label="Garbage Collector">
+      <option label="Off" name="off">off</option>
+      <option label="Normal" name="detailed">normal</option>
+      <option label="All" name="all">all</option>
+    </selection>
+
+    <condition name="gc-enabled-normal" true="true" false="false">
+      <or>
+        <test name="gc-level" operator="equal" value="normal"/>
+        <test name="gc-level" operator="equal" value="all"/>
+      </or>
+    </condition>
+
+    <condition name="gc-enabled-all" true="true" false="false">
+      <test name="gc-level" operator="equal" value="all"/>
+    </condition>
+
+    <selection name="memory-profiling" default="medium" label="Memory Profiling">
+      <option label="Off" name="off">off</option>
+      <option label="Object Allocation and Promotion" name="medium">medium</option>
+      <option label="All, including Heap Statistics (May cause long full GCs)" name="all">all</option>
+    </selection>
+
+    <condition name="memory-profiling-enabled-medium" true="true" false="false">
+      <or>
+        <test name="memory-profiling" operator="equal" value="medium"/>
+        <test name="memory-profiling" operator="equal" value="all"/>
+      </or>
+    </condition>
+
+    <condition name="memory-profiling-enabled-all" true="true" false="false">
+      <test name="memory-profiling" operator="equal" value="all"/>
+    </condition>
+
+    <selection name="compiler-level" default="detailed" label="Compiler">
+      <option label="Off" name="off">off</option>
+      <option label="Normal" name="normal">normal</option>
+      <option label="Detailed" name="detailed">detailed</option>
+      <option label="All" name="all">all</option>
+    </selection>
+
+    <condition name="compiler-enabled" true="false" false="true">
+      <test name="compiler-level" operator="equal" value="off"/>
+    </condition>
+
+    <condition name="compiler-enabled-failure" true="true" false="false">
+      <or>
+        <test name="compiler-level" operator="equal" value="detailed"/>
+        <test name="compiler-level" operator="equal" value="all"/>
+      </or>
+    </condition>
+
+    <condition name="compiler-sweeper-threshold" true="0 ms" false="100 ms">
+      <test name="compiler-level" operator="equal" value="all"/>
+    </condition>
+
+    <condition name="compiler-compilation-threshold" true="1000 ms">
+      <test name="compiler-level" operator="equal" value="normal"/>
+    </condition>
+
+    <condition name="compiler-compilation-threshold" true="100 ms">
+      <test name="compiler-level" operator="equal" value="detailed"/>
+    </condition>
+
+    <condition name="compiler-compilation-threshold" true="0 ms">
+      <test name="compiler-level" operator="equal" value="all"/>
+    </condition>
+
+    <condition name="compiler-phase-threshold" true="60 s">
+      <test name="compiler-level" operator="equal" value="normal"/>
+    </condition>
+
+    <condition name="compiler-phase-threshold" true="10 s">
+      <test name="compiler-level" operator="equal" value="detailed"/>
+    </condition>
+
+    <condition name="compiler-phase-threshold" true="0 s">
+      <test name="compiler-level" operator="equal" value="all"/>
+    </condition>
+
+    <selection name="method-sampling-interval" default="normal" label="Method Sampling">
+      <option label="Off" name="off">off</option>
+      <option label="Normal" name="normal">normal</option>
+      <option label="High" name="high">high</option>
+      <option label="Ludicrous (High Overhead)" name="ludicrous">ludicrous</option>
+    </selection>
+
+    <condition name="method-sampling-java-interval" true="999 d">
+      <test name="method-sampling-interval" operator="equal" value="off"/>
+    </condition>
+
+    <condition name="method-sampling-java-interval" true="20 ms">
+      <test name="method-sampling-interval" operator="equal" value="normal"/>
+    </condition>
+
+    <condition name="method-sampling-java-interval" true="10 ms">
+      <test name="method-sampling-interval" operator="equal" value="high"/>
+    </condition>
+
+    <condition name="method-sampling-java-interval" true="1 ms">
+      <test name="method-sampling-interval" operator="equal" value="ludicrous"/>
+    </condition>
+
+    <condition name="method-sampling-native-interval" true="999 d">
+      <test name="method-sampling-interval" operator="equal" value="off"/>
+    </condition>
+
+    <condition name="method-sampling-native-interval" true="20 ms">
+      <or>
+        <test name="method-sampling-interval" operator="equal" value="normal"/>
+        <test name="method-sampling-interval" operator="equal" value="high"/>
+        <test name="method-sampling-interval" operator="equal" value="ludicrous"/>
+      </or>
+    </condition>
+
+    <condition name="method-sampling-enabled" true="false" false="true">
+      <test name="method-sampling-interval" operator="equal" value="off"/>
+    </condition>
+
+    <selection name="thread-dump-interval" default="everyMinute" label="Thread Dump">
+      <option label="Off" name="off">999 d</option>
+      <option label="At least Once" name="normal">everyChunk</option>
+      <option label="Every 60 s" name="everyMinute">60 s</option>
+      <option label="Every 10 s" name="everyTenSecond">10 s</option>
+      <option label="Every 1 s" name="everySecond">1 s</option>
+    </selection>
+
+    <condition name="thread-dump-enabled" true="false" false="true">
+      <test name="thread-dump-interval" operator="equal" value="999 d"/>
+    </condition>
+
+    <selection name="exception-level" default="errors" label="Exceptions">
+      <option label="Off" name="off">off</option>
+      <option label="Errors Only" name="errors">errors</option>
+      <option label="All Exceptions, including Errors" name="all">all</option>
+    </selection>
+
+    <condition name="enable-errors" true="true" false="false">
+      <or>
+        <test name="exception-level" operator="equal" value="errors"/>
+        <test name="exception-level" operator="equal" value="all"/>
+      </or>
+    </condition>
+
+    <condition name="enable-exceptions" true="true" false="false">
+      <test name="exception-level" operator="equal" value="all"/>
+    </condition>
+
+    <selection name="memory-leak-detection" default="medium" label="Memory Leak Detection">
+      <option label="Off" name="off">off</option>
+      <option label="Object Types" name="minimal">minimal</option>
+      <option label="Object Types + Allocation Stack Traces" name="medium">medium</option>
+      <option label="Object Types + Allocation Stack Traces + Path to GC Root" name="full">full</option>
+    </selection>
+
+    <condition name="memory-leak-detection-enabled" true="false" false="true">
+      <test name="memory-leak-detection" operator="equal" value="off"/>
+    </condition>
+
+    <condition name="memory-leak-detection-stack-trace" true="true" false="false">
+      <or>
+        <test name="memory-leak-detection" operator="equal" value="medium"/>
+        <test name="memory-leak-detection" operator="equal" value="full"/>
+      </or>
+    </condition>
+
+    <condition name="memory-leak-detection-cutoff" true="1 h" false="0 ns">
+      <test name="memory-leak-detection" operator="equal" value="full"/>
+    </condition>
+
+    <text name="synchronization-threshold" label="Synchronization Threshold" contentType="timespan" minimum="0 s">10 ms</text>
+
+    <text name="file-io-threshold" label="File I/O Threshold" contentType="timespan" minimum="0 s">10 ms</text>
+
+    <text name="socket-io-threshold" label="Socket I/O Threshold" contentType="timespan" minimum="0 s">10 ms</text>
+
+    <flag name="class-loading-enabled" label="Class Loading">false</flag>
+
+  </control>
+
+  <category label="Java Virtual Machine">
+
+    <category label="GC">
+
+      <category label="Detailed">
+
+        <event name="jdk.ObjectCountAfterGC" label="Object Count after GC">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+        </event>
+
+        <event name="jdk.G1HeapRegionTypeChange" label="G1 Heap Region Type Change" description="Information about a G1 heap region type change">
+          <setting name="enabled" control="gc-enabled-all" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+        </event>
+
+        <event name="jdk.AllocationRequiringGC" label="Allocation Requiring GC">
+          <setting name="enabled" control="gc-enabled-all" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.EvacuationInformation" label="Evacuation Information">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.G1BasicIHOP" label="G1 Basic IHOP Statistics" description="Basic statistics related to current IHOP calculation">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.ZStatisticsSampler" label="Z Statistics Sampler">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+        </event>
+
+        <event name="jdk.ZStatisticsCounter" label="Z Statistics Counter">
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.ZPageAllocation" label="ZPage Allocation" description="Allocation of a ZPage">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+        </event>
+
+        <event name="jdk.ObjectCount" label="Object Count">
+          <setting name="enabled" control="memory-profiling-enabled-all" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+        </event>
+
+        <event name="jdk.G1EvacuationOldStatistics" label="G1 Evacuation Memory Statistics for Old" description="Memory related evacuation statistics during GC for the old generation">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.ConcurrentModeFailure" label="Concurrent Mode Failure" description="Concurrent Mode failed">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.ZThreadPhase" label="ZGC Thread Phase">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.PromoteObjectInNewPLAB" label="Promotion in new PLAB" description="Object survived scavenge and was copied to a new Promotion Local Allocation Buffer (PLAB). Supported GCs are Parallel Scavange, G1 and CMS with Parallel New. Due to promotion being done in parallel an object might be reported multiple times as the GC threads race to copy all objects.">
+          <setting name="enabled" control="memory-profiling-enabled-medium" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.G1HeapRegionInformation" label="G1 Heap Region Information" description="Information about a specific heap region in the G1 GC">
+          <setting name="enabled" control="gc-enabled-all" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+        </event>
+
+        <event name="jdk.PromoteObjectOutsidePLAB" label="Promotion outside PLAB" description="Object survived scavenge and was copied directly to the heap. Supported GCs are Parallel Scavange, G1 and CMS with Parallel New. Due to promotion being done in parallel an object might be reported multiple times as the GC threads race to copy all objects.">
+          <setting name="enabled" control="memory-profiling-enabled-medium" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.PromotionFailed" label="Promotion Failed" description="Promotion of an object failed">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.G1AdaptiveIHOP" label="G1 Adaptive IHOP Statistics" description="Statistics related to current adaptive IHOP calculation">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.G1EvacuationYoungStatistics" label="G1 Evacuation Statistics for Young" description="Memory related evacuation statistics during GC for the young generation">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.TenuringDistribution" label="Tenuring Distribution">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.G1MMU" label="G1 MMU Information">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.EvacuationFailed" label="Evacuation Failed" description="Evacuation of an object failed">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+      </category>
+
+      <category label="Collector">
+
+        <event name="jdk.GarbageCollection" label="Garbage Collection" description="Garbage collection performed by the JVM">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.G1GarbageCollection" label="G1 Garbage Collection" description="Extra information specific to G1 Garbage Collections">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.OldGarbageCollection" label="Old Garbage Collection" description="Extra information specific to Old Garbage Collections">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.YoungGarbageCollection" label="Young Garbage Collection" description="Extra information specific to Young Garbage Collections">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.ParallelOldGarbageCollection" label="Parallel Old Garbage Collection" description="Extra information specific to Parallel Old Garbage Collections">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+      </category>
+
+      <category label="Heap">
+
+        <event name="jdk.GCHeapSummary" label="Heap Summary">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.G1HeapSummary" label="G1 Heap Summary">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.MetaspaceSummary" label="Metaspace Summary">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.PSHeapSummary" label="Parallel Scavenge Heap Summary">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+      </category>
+
+      <category label="Configuration">
+
+        <event name="jdk.YoungGenerationConfiguration" label="Young Generation Configuration" description="The configuration of the young generation of the garbage collected heap">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+        </event>
+
+        <event name="jdk.GCSurvivorConfiguration" label="GC Survivor Configuration" description="The configuration of the survivors of garbage collection">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+        </event>
+
+        <event name="jdk.GCHeapConfiguration" label="GC Heap Configuration" description="The configuration of the garbage collected heap">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+        </event>
+
+        <event name="jdk.GCTLABConfiguration" label="TLAB Configuration" description="The configuration of the Thread Local Allocation Buffers (TLABs)">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+        </event>
+
+        <event name="jdk.GCConfiguration" label="GC Configuration" description="The configuration of the garbage collector">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+        </event>
+
+      </category>
+
+      <category label="Metaspace">
+
+        <event name="jdk.MetaspaceOOM" label="Metaspace Out of Memory">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.MetaspaceAllocationFailure" label="Metaspace Allocation Failure">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.MetaspaceChunkFreeListSummary" label="Metaspace Chunk Free List Summary">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+        <event name="jdk.MetaspaceGCThreshold" label="Metaspace GC Threshold">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+      </category>
+
+      <category label="Phases">
+
+        <event name="jdk.GCPhasePause" label="GC Phase Pause">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.GCPhaseConcurrent" label="GC Phase Concurrent">
+          <setting name="enabled" control="gc-enabled-all" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.GCPhasePauseLevel4" label="GC Phase Pause Level 4">
+          <setting name="enabled" control="gc-enabled-all" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.GCPhasePauseLevel1" label="GC Phase Pause Level 1">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.GCPhasePauseLevel3" label="GC Phase Pause Level 3">
+          <setting name="enabled" control="gc-enabled-all" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.GCPhasePauseLevel2" label="GC Phase Pause Level 2">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+      </category>
+
+      <category label="Reference">
+
+        <event name="jdk.GCReferenceStatistics" label="GC Reference Statistics" description="Total count of processed references during GC">
+          <setting name="enabled" control="gc-enabled-normal" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+      </category>
+
+    </category>
+
+    <category label="Flag">
+
+      <event name="jdk.DoubleFlag" label="Double Flag">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+      <event name="jdk.IntFlag" label="Int Flag">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+      <event name="jdk.LongFlag" label="Long Flag">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+      <event name="jdk.BooleanFlagChanged" label="Boolean Flag Changed">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <event name="jdk.DoubleFlagChanged" label="Double Flag Changed">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <event name="jdk.StringFlagChanged" label="String Flag Changed">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <event name="jdk.UnsignedIntFlagChanged" label="Unsigned Int Flag Changed">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <event name="jdk.BooleanFlag" label="Boolean Flag">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+      <event name="jdk.UnsignedLongFlagChanged" label="Unsigned Long Flag Changed">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <event name="jdk.UnsignedIntFlag" label="Unsigned Int Flag">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+      <event name="jdk.StringFlag" label="String Flag">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+      <event name="jdk.LongFlagChanged" label="Long Flag Changed">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <event name="jdk.UnsignedLongFlag" label="Unsigned Long Flag">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+      <event name="jdk.IntFlagChanged" label="Int Flag Changed">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+    </category>
+
+    <category label="Code Cache">
+
+      <event name="jdk.CodeCacheConfiguration" label="Code Cache Configuration">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+      <event name="jdk.CodeCacheFull" label="Code Cache Full">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <event name="jdk.CodeCacheStatistics" label="Code Cache Statistics">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+      </event>
+
+    </category>
+
+    <category label="Runtime">
+
+      <category label="Safepoint">
+
+        <event name="jdk.SafepointBegin" label="Safepoint Begin" description="Safepointing begin">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.SafepointStateSynchronization" label="Safepoint State Synchronization" description="Synchronize run state of threads">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.SafepointEnd" label="Safepoint End" description="Safepointing end">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.SafepointCleanup" label="Safepoint Cleanup" description="Safepointing begin running cleanup tasks">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.SafepointWaitBlocked" label="Safepoint Wait Blocked" description="Safepointing begin waiting on running threads to block">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+        <event name="jdk.SafepointCleanupTask" label="Safepoint Cleanup Task" description="Safepointing begin running cleanup tasks">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+        </event>
+
+      </category>
+
+      <event name="jdk.ThreadDump" label="Thread Dump">
+        <setting name="enabled" control="thread-dump-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" control="thread-dump-interval" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">60 s</setting>
+      </event>
+
+      <event name="jdk.BiasedLockClassRevocation" label="Biased Lock Class Revocation" description="Revoked biases for all instances of a class">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+      </event>
+
+      <event name="jdk.ReservedStackActivation" label="Reserved Stack Activation" description="Activation of Reserved Stack Area caused by stack overflow with ReservedStackAccess annotated method in call stack">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <event name="jdk.NativeLibrary" label="Native Library">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+      </event>
+
+      <event name="jdk.ExecuteVMOperation" label="VM Operation" description="Execution of a VM Operation">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+      </event>
+
+      <event name="jdk.BiasedLockRevocation" label="Biased Lock Revocation" description="Revoked bias of object">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+      </event>
+
+      <event name="jdk.BiasedLockSelfRevocation" label="Biased Lock Self Revocation" description="Revoked bias of object biased towards own thread">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+      </event>
+
+      <event name="jdk.Shutdown" label="JVM Shutdown" description="JVM shutting down">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <category label="Modules">
+
+        <event name="jdk.ModuleRequire" label="Module Require" description="A directed edge representing a dependency">
+          <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+        </event>
+
+        <event name="jdk.ModuleExport" label="Module Export">
+          <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+          <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+        </event>
+
+      </category>
+
+    </category>
+
+    <category label="Code Sweeper">
+
+      <event name="jdk.CodeSweeperConfiguration" label="Code Sweeper Configuration">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+      <event name="jdk.CodeSweeperStatistics" label="Code Sweeper Statistics">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+      </event>
+
+      <event name="jdk.SweepCodeCache" label="Sweep Code Cache">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="threshold" control="compiler-sweeper-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">100 ms</setting>
+      </event>
+
+    </category>
+
+    <category label="Class Loading">
+
+      <event name="jdk.ClassLoad" label="Class Load">
+        <setting name="enabled" control="class-loading-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ms</setting>
+      </event>
+
+      <event name="jdk.ClassDefine" label="Class Define">
+        <setting name="enabled" control="class-loading-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <event name="jdk.ClassUnload" label="Class Unload">
+        <setting name="enabled" control="class-loading-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+      </event>
+
+    </category>
+
+    <category label="Compiler">
+
+      <event name="jdk.Compilation" label="Compilation">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="threshold" control="compiler-compilation-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">100 ms</setting>
+      </event>
+
+      <event name="jdk.CompilerStatistics" label="Compiler Statistics">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">1000 ms</setting>
+      </event>
+
+      <event name="jdk.CompilationFailure" label="Compilation Failure">
+        <setting name="enabled" control="compiler-enabled-failure" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      </event>
+
+      <category label="Optimization">
+
+        <event name="jdk.CompilerInlining" label="Method Inlining">
+          <setting name="enabled" control="compiler-enabled-failure" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        </event>
+
+      </category>
+
+      <event name="jdk.CompilerPhase" label="Compiler Phase">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="threshold" control="compiler-phase-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 s</setting>
+      </event>
+
+      <event name="jdk.CompilerConfiguration" label="Compiler Configuration">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+    </category>
+
+    <category label="Profiling">
+
+      <event name="jdk.OldObjectSample" label="Old Object Sample" description="A potential memory leak">
+        <setting name="enabled" control="memory-leak-detection-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="stackTrace" control="memory-leak-detection-stack-trace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="cutoff" control="memory-leak-detection-cutoff" label="Cutoff" description="Limit running time of event">0 ns</setting>
+      </event>
+
+      <event name="jdk.ExecutionSample" label="Method Profiling Sample" description="Snapshot of a threads state">
+        <setting name="enabled" control="method-sampling-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" control="method-sampling-java-interval" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">20 ms</setting>
+      </event>
+
+      <event name="jdk.NativeMethodSample" label="Method Profiling Sample Native" description="Snapshot of a threads state when in native">
+        <setting name="enabled" control="method-sampling-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" control="method-sampling-native-interval" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">20 ms</setting>
+      </event>
+
+    </category>
+
+    <event name="jdk.JVMInformation" label="JVM Information" description="Description of JVM and the Java application">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+    </event>
+
+    <event name="jdk.InitialSystemProperty" label="Initial System Property" description="System Property at JVM start">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+    </event>
+
+  </category>
+
+  <category label="Java Application">
+
+    <event name="jdk.JavaMonitorEnter" label="Java Monitor Blocked">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" control="synchronization-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+    </event>
+
+    <event name="jdk.JavaExceptionThrow" label="Java Exception" description="An object derived from java.lang.Exception has been created">
+      <setting name="enabled" control="enable-exceptions" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ns</setting>
+    </event>
+
+    <category label="Statistics">
+
+      <event name="jdk.ClassLoadingStatistics" label="Class Loading Statistics">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">1000 ms</setting>
+      </event>
+
+      <event name="jdk.JavaThreadStatistics" label="Java Thread Statistics">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">1000 ms</setting>
+      </event>
+
+      <event name="jdk.ClassLoaderStatistics" label="Class Loader Statistics">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+      </event>
+
+      <event name="jdk.ThreadAllocationStatistics" label="Thread Allocation Statistics">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+      </event>
+
+      <event name="jdk.ExceptionStatistics" label="Exception Statistics" description="Number of objects derived from java.lang.Throwable that have been created">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">1000 ms</setting>
+      </event>
+
+    </category>
+
+    <event name="jdk.ThreadPark" label="Java Thread Park">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" control="synchronization-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+    </event>
+
+    <event name="jdk.ThreadStart" label="Java Thread Start">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+    </event>
+
+    <event name="jdk.SocketRead" label="Socket Read" description="Reading data from a socket">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" control="socket-io-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+    </event>
+
+    <event name="jdk.FileForce" label="File Force" description="Force updates to be written to file">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" control="file-io-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+    </event>
+
+    <event name="jdk.SocketWrite" label="Socket Write" description="Writing data to a socket">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" control="socket-io-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+    </event>
+
+    <event name="jdk.JavaErrorThrow" label="Java Error" description="An object derived from java.lang.Error has been created. OutOfMemoryErrors are ignored">
+      <setting name="enabled" control="enable-errors" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ns</setting>
+    </event>
+
+    <event name="jdk.JavaMonitorInflate" label="Java Monitor Inflated">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" control="synchronization-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+    </event>
+
+    <event name="jdk.ObjectAllocationOutsideTLAB" label="Allocation outside TLAB" description="Allocation outside Thread Local Allocation Buffers">
+      <setting name="enabled" control="memory-profiling-enabled-medium" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+    </event>
+
+    <event name="jdk.FileWrite" label="File Write" description="Writing data to a file">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" control="file-io-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+    </event>
+
+    <event name="jdk.JavaMonitorWait" label="Java Monitor Wait" description="Waiting on a Java monitor">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" control="synchronization-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+    </event>
+
+    <event name="jdk.ObjectAllocationInNewTLAB" label="Allocation in new TLAB" description="Allocation in new Thread Local Allocation Buffer">
+      <setting name="enabled" control="memory-profiling-enabled-medium" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+    </event>
+
+    <event name="jdk.FileRead" label="File Read" description="Reading data from a file">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" control="file-io-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+    </event>
+
+    <event name="jdk.ThreadSleep" label="Java Thread Sleep">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="threshold" control="synchronization-threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">10 ms</setting>
+    </event>
+
+    <event name="jdk.ThreadEnd" label="Java Thread End">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+    </event>
+
+  </category>
+
+  <category label="Operating System">
+
+    <category label="Processor">
+
+      <event name="jdk.CPULoad" label="CPU Load" description="OS CPU Load">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">1000 ms</setting>
+      </event>
+
+      <event name="jdk.ThreadCPULoad" label="Thread CPU Load">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">10 s</setting>
+      </event>
+
+      <event name="jdk.CPUInformation" label="CPU Information">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+      <event name="jdk.ThreadContextSwitchRate" label="Thread Context Switch Rate">
+        <setting name="enabled" control="compiler-enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">10 s</setting>
+      </event>
+
+      <event name="jdk.CPUTimeStampCounter" label="CPU Time Stamp Counter">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+      </event>
+
+    </category>
+
+    <event name="jdk.OSInformation" label="OS Information">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+    </event>
+
+    <category label="Memory">
+
+      <event name="jdk.PhysicalMemory" label="Physical Memory" description="OS Physical Memory">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">everyChunk</setting>
+      </event>
+
+    </category>
+
+    <event name="jdk.SystemProcess" label="System Process">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">endChunk</setting>
+    </event>
+
+    <event name="jdk.InitialEnvironmentVariable" label="Initial Environment Variable">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">beginChunk</setting>
+    </event>
+
+    <category label="Network">
+
+      <event name="jdk.NetworkUtilization" label="Network Utilization">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+        <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">5 s</setting>
+      </event>
+
+    </category>
+
+    <event name="jdk.VirtualizationInformation" label="Virtualization Information">
+      <setting name="period" label="Period" description="Record event at interval" contentType="jdk.jfr.Period">endChunk</setting>
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+    </event>
+
+  </category>
+
+  <category label="Flight Recorder">
+
+    <event name="jdk.ActiveSetting" label="Recording Setting">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">false</setting>
+      <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ns</setting>
+    </event>
+
+    <event name="jdk.ActiveRecording" label="Flight Recording">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+      <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">false</setting>
+      <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ns</setting>
+    </event>
+
+    <event name="jdk.DumpReason" label="Recording Reason" description="Who requested the recording and why">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+    </event>
+
+    <event name="jdk.DataLoss" label="Data Loss" description="Data could not be copied out from a buffer, typically because of contention">
+      <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">true</setting>
+    </event>
+
+  </category>
+
+  <category label="Java Development Kit">
+
+    <category label="Security">
+
+      <event name="jdk.SecurityPropertyModification" label="Security Property Modification" description="Modification of Security property">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">false</setting>
+        <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ns</setting>
+      </event>
+
+      <event name="jdk.X509Validation" label="X509 Validation" description="Serial numbers from X.509 Certificates forming chain of trust">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">false</setting>
+        <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ns</setting>
+      </event>
+
+      <event name="jdk.X509Certificate" label="X509 Certificate" description="Details of X.509 Certificate parsed by JDK">
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">false</setting>
+        <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ns</setting>
+      </event>
+
+      <event name="jdk.TLSHandshake" label="TLS Handshake" description="Parameters used in TLS Handshake">
+        <setting name="threshold" label="Threshold" description="Record event with duration above or equal to threshold" contentType="jdk.jfr.Timespan">0 ns</setting>
+        <setting name="stackTrace" label="Stack Trace" description="Record stack traces" contentType="jdk.jfr.Flag">false</setting>
+        <setting name="enabled" label="Enabled" description="Record event" contentType="jdk.jfr.Flag">false</setting>
+      </event>
+
+    </category>
+
+  </category>
+
+</configuration>
diff --git a/profiling/kafka-s3/mvnw b/profiling/kafka-s3/mvnw
new file mode 100755
index 0000000..41c0f0c
--- /dev/null
+++ b/profiling/kafka-s3/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# 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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/profiling/kafka-s3/mvnw.cmd b/profiling/kafka-s3/mvnw.cmd
new file mode 100644
index 0000000..8611571
--- /dev/null
+++ b/profiling/kafka-s3/mvnw.cmd
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/profiling/kafka-s3/pom.xml b/profiling/kafka-s3/pom.xml
new file mode 100644
index 0000000..232fe05
--- /dev/null
+++ b/profiling/kafka-s3/pom.xml
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel.tests</groupId>
+        <artifactId>profiling</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>kafka-s3</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <name>Camel Performance :: Profiling :: Kafka S3</name>
+    <description>An example of measuring resources consumption in a container through Kafka and AWS2-S3 component</description>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+        <exec-maven-plugin.version>3.0.0</exec-maven-plugin.version>
+        <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+        <maven.compiler.parameters>true</maven.compiler.parameters>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+
+        <quarkus.version>1.11.1.Final</quarkus.version>
+        <quarkus.container-image.build>true</quarkus.container-image.build>
+        <quarkus.container-image.group>quay.io/oscerd</quarkus.container-image.group>
+        <quarkus.container-image.name>${project.artifactId}</quarkus.container-image.name>
+
+        <camel-k-runtime.version>1.7.0-SNAPSHOT</camel-k-runtime.version>
+        <camel-quarkus.version>1.7.0</camel-quarkus.version>
+        <camel.version>3.8.0</camel.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-bom</artifactId>
+                <version>${quarkus.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel.k</groupId>
+                <artifactId>camel-k-runtime-bom</artifactId>
+                <version>${camel-k-runtime.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-bom</artifactId>
+                <version>${camel-quarkus.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.quarkus</groupId>
+            <artifactId>quarkus-container-image-jib</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-runtime</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.k</groupId>
+            <artifactId>camel-k-loader-yaml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-kamelet</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-kafka</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-aws2-s3</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>io.quarkus</groupId>
+                <artifactId>quarkus-maven-plugin</artifactId>
+                <version>${quarkus.version}</version>
+                <extensions>true</extensions>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>build</goal>
+                            <goal>generate-code</goal>
+                            <goal>generate-code-tests</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin.version}</version>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>jvm</id>
+            <activation>
+                <property>
+                    <name>!native</name>
+                </property>
+            </activation>
+            <properties>
+                <quarkus.jib.base-jvm-image>adoptopenjdk/openjdk11:ubi-minimal</quarkus.jib.base-jvm-image>
+                <quarkus.jib.jvm-entrypoint>java,-XX:+UseShenandoahGC,-Xlog:gc,-jar,/work/quarkus-run.jar</quarkus.jib.jvm-entrypoint>
+                <quarkus.container-image.tag>${project.version}-jvm</quarkus.container-image.tag>
+            </properties>
+        </profile>
+    </profiles>
+
+    <repositories>
+        <repository>
+            <id>apache.snapshots</id>
+            <url>https://repository.apache.org/snapshots/</url>
+            <name>Apache Snapshot Repo</name>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+        </repository>
+    </repositories>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>apache.snapshots</id>
+            <url>https://repository.apache.org/snapshots/</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+        </pluginRepository>
+    </pluginRepositories>
+
+</project>
diff --git a/profiling/kafka-s3/src/main/resources/application.properties b/profiling/kafka-s3/src/main/resources/application.properties
new file mode 100644
index 0000000..626d8b0
--- /dev/null
+++ b/profiling/kafka-s3/src/main/resources/application.properties
@@ -0,0 +1,30 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+#
+# quarkus
+#
+quarkus.banner.enabled = false
+quarkus.package.type = fast-jar
+
+
+#
+# camel - main
+#
+camel.main.name = camel-k-runtime-examples-yaml
+camel.main.stream-caching-enabled = true
+camel.main.stream-caching-spool-directory = ${java.io.tmpdir}/camel-q
diff --git a/profiling/pom.xml b/profiling/pom.xml
index 3ad9536..36c93db 100644
--- a/profiling/pom.xml
+++ b/profiling/pom.xml
@@ -36,6 +36,7 @@
 
     <modules>
         <module>timer-log</module>
+        <module>kafka-s3</module>
     </modules>
 
 </project>

[camel-performance-tests] 12/16: CAMEL-16251 - Move Performance and jmh itests in a separated repository

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit 1d31f978a6b77b8ea7ff0dd03faa56b68e125d27
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Mar 10 16:36:05 2021 +0100

    CAMEL-16251 - Move Performance and jmh itests in a separated repository
---
 tests/camel-itest-performance/pom.xml              | 112 ++++++++++++
 .../camel/tests/component/EchoTestComponent.java   |  87 +++++++++
 .../tests/component/PerformanceTestComponent.java  | 157 ++++++++++++++++
 .../src/main/resources/META-INF/LICENSE.txt        | 203 +++++++++++++++++++++
 .../src/main/resources/META-INF/NOTICE.txt         |  11 ++
 .../services/org/apache/camel/component/echo       |  17 ++
 .../services/org/apache/camel/component/test-perf  |  17 ++
 .../org/apache/camel/tests/performance/NoTest.java |  26 +++
 .../tests/performance/ProducerCacheHitsTest.java   | 107 +++++++++++
 .../src/test/resources/log4j2.properties           |  28 +++
 tests/pom.xml                                      |   1 +
 11 files changed, 766 insertions(+)

diff --git a/tests/camel-itest-performance/pom.xml b/tests/camel-itest-performance/pom.xml
new file mode 100644
index 0000000..bd77f9f
--- /dev/null
+++ b/tests/camel-itest-performance/pom.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel.tests</groupId>
+        <artifactId>tests</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>camel-itest-performance</artifactId>
+    <name>Camel Performance :: Tests :: Perfomance integration tests</name>
+    <description>Tests camel performance aspects</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- Add Camel BOM -->
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-bom</artifactId>
+                <version>${camel.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+        </dependency>
+
+        <!-- testing -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- logging -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+            <version>${log4j2-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-1.2-api</artifactId>
+            <scope>test</scope>
+            <version>${log4j2-version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <includes>
+                        <include>**/NoTest.*</include>
+                    </includes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>performance-tests</id>
+            <activation>
+                <activeByDefault>false</activeByDefault>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <includes>
+                                <include>**/*Test.*</include>
+                            </includes>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git a/tests/camel-itest-performance/src/main/java/org/apache/camel/tests/component/EchoTestComponent.java b/tests/camel-itest-performance/src/main/java/org/apache/camel/tests/component/EchoTestComponent.java
new file mode 100644
index 0000000..9b1fb55
--- /dev/null
+++ b/tests/camel-itest-performance/src/main/java/org/apache/camel/tests/component/EchoTestComponent.java
@@ -0,0 +1,87 @@
+/*
+ * 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.tests.component;
+
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.AsyncProcessor;
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.support.DefaultProducer;
+
+public class EchoTestComponent extends DefaultComponent {
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        Endpoint endpoint = new EchoEndpoint(uri, this);
+        setProperties(endpoint, parameters);
+        return endpoint;
+    }
+
+    private final class EchoEndpoint extends DefaultEndpoint {
+        protected EchoEndpoint(String uri, Component component) {
+            super(uri, component);
+        }
+
+        @Override
+        public Consumer createConsumer(Processor processor) throws Exception {
+            // Component only supports Producers
+            return null;
+        }
+
+        @Override
+        public Producer createProducer() throws Exception {
+            return new EchoProducer(this);
+        }
+
+        @Override
+        public boolean isSingleton() {
+            return false;
+        }
+    }
+
+    private final class EchoProducer extends DefaultProducer implements AsyncProcessor {
+        protected EchoProducer(Endpoint endpoint) {
+            super(endpoint);
+        }
+
+        @Override
+        public void process(Exchange exchange) throws Exception {
+            // do nothing, echo is implicit
+        }
+
+        @Override
+        public boolean process(Exchange exchange, AsyncCallback callback) {
+            // do nothing, echo is implicit
+            return true;
+        }
+
+        @Override
+        public CompletableFuture<Exchange> processAsync(Exchange exchange) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    }
+}
diff --git a/tests/camel-itest-performance/src/main/java/org/apache/camel/tests/component/PerformanceTestComponent.java b/tests/camel-itest-performance/src/main/java/org/apache/camel/tests/component/PerformanceTestComponent.java
new file mode 100644
index 0000000..2d08b73
--- /dev/null
+++ b/tests/camel-itest-performance/src/main/java/org/apache/camel/tests/component/PerformanceTestComponent.java
@@ -0,0 +1,157 @@
+/*
+ * 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.tests.component;
+
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionService;
+import java.util.concurrent.ExecutorCompletionService;
+import java.util.concurrent.ExecutorService;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.AsyncProcessor;
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.support.DefaultConsumer;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.support.ExchangeHelper;
+
+public class PerformanceTestComponent extends DefaultComponent {
+    public static final String HEADER_THREADS = "CamelPerfThreads";
+    public static final String HEADER_ITERATIONS = "CamelPerfIterations";
+
+    private static final int DEFAULT_THREADS = 8;
+    private static final int DEFAULT_ITERATIONS = 100;
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        Endpoint endpoint = new PerformanceTestEndpoint(uri, this);
+        setProperties(endpoint, parameters);
+        return endpoint;
+    }
+
+    public static int getHeaderValue(Exchange exchange, String header) {
+        Integer value = exchange.getContext().getTypeConverter().convertTo(Integer.class, exchange,
+                exchange.getIn().getHeader(header));
+        return value != null ? value : header.equals(HEADER_THREADS) ? DEFAULT_THREADS
+                : header.equals(HEADER_ITERATIONS) ? DEFAULT_ITERATIONS : 0;
+    }
+
+    private static final class PerformanceTestEndpoint extends DefaultEndpoint {
+        private PerformanceTestConsumer consumer;
+
+        protected PerformanceTestEndpoint(String uri, Component component) {
+            super(uri, component);
+        }
+
+        @Override
+        public Consumer createConsumer(Processor processor) throws Exception {
+            synchronized (this) {
+                if (consumer != null && processor != consumer.getProcessor()) {
+                    throw new Exception("PerformanceTestEndpoint doesn not support multiple consumers per Endpoint");
+                }
+                consumer = new PerformanceTestConsumer(this, processor);
+            }
+            return consumer;
+        }
+
+        @Override
+        public Producer createProducer() throws Exception {
+            return new PerformanceTestProducer(this);
+        }
+
+        @Override
+        public boolean isSingleton() {
+            return true;
+        }
+
+        public Consumer getConsumer() {
+            return consumer;
+        }
+    }
+
+    private static final class PerformanceTestConsumer extends DefaultConsumer {
+        protected PerformanceTestConsumer(Endpoint endpoint, Processor processor) {
+            super(endpoint, processor);
+        }
+    }
+
+    private static final class PerformanceTestProducer extends DefaultProducer implements AsyncProcessor {
+        protected PerformanceTestProducer(Endpoint endpoint) {
+            super(endpoint);
+        }
+
+        @Override
+        public void process(final Exchange exchange) throws Exception {
+            final int count = getHeaderValue(exchange, HEADER_ITERATIONS);
+            final int threads = getHeaderValue(exchange, HEADER_THREADS);
+            PerformanceTestEndpoint endpoint = (PerformanceTestEndpoint) getEndpoint();
+            if (endpoint != null) {
+                final DefaultConsumer consumer = (DefaultConsumer) endpoint.getConsumer();
+                ExecutorService executor
+                        = exchange.getContext().getExecutorServiceManager().newFixedThreadPool(this, "perf", threads);
+                CompletionService<Exchange> tasks = new ExecutorCompletionService<>(executor);
+
+                // StopWatch watch = new StopWatch(); // if we want to clock how
+                // long it takes
+                for (int i = 0; i < count; i++) {
+                    tasks.submit(new Callable<Exchange>() {
+                        @Override
+                        public Exchange call() throws Exception {
+                            Exchange exch = ExchangeHelper.createCopy(exchange, false);
+                            try {
+                                consumer.getProcessor().process(exch);
+                            } catch (final Exception e) {
+                                exch.setException(e);
+                            }
+                            return exch;
+                        }
+                    });
+                }
+
+                for (int i = 0; i < count; i++) {
+                    // Future<Exchange> result = tasks.take();
+                    tasks.take(); // wait for all exchanges to complete
+                }
+            }
+        }
+
+        @Override
+        public boolean process(Exchange exchange, AsyncCallback callback) {
+            try {
+                this.process(exchange);
+            } catch (Exception e) {
+                exchange.setException(e);
+            }
+            callback.done(true);
+            return true;
+        }
+
+        @Override
+        public CompletableFuture<Exchange> processAsync(Exchange exchange) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    }
+}
diff --git a/tests/camel-itest-performance/src/main/resources/META-INF/LICENSE.txt b/tests/camel-itest-performance/src/main/resources/META-INF/LICENSE.txt
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/tests/camel-itest-performance/src/main/resources/META-INF/LICENSE.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
diff --git a/tests/camel-itest-performance/src/main/resources/META-INF/NOTICE.txt b/tests/camel-itest-performance/src/main/resources/META-INF/NOTICE.txt
new file mode 100644
index 0000000..2e215bf
--- /dev/null
+++ b/tests/camel-itest-performance/src/main/resources/META-INF/NOTICE.txt
@@ -0,0 +1,11 @@
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Apache Camel distribution.                    ==
+   =========================================================================
+
+   This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Please read the different LICENSE files present in the licenses directory of
+   this distribution.
diff --git a/tests/camel-itest-performance/src/main/resources/META-INF/services/org/apache/camel/component/echo b/tests/camel-itest-performance/src/main/resources/META-INF/services/org/apache/camel/component/echo
new file mode 100644
index 0000000..cab3f16
--- /dev/null
+++ b/tests/camel-itest-performance/src/main/resources/META-INF/services/org/apache/camel/component/echo
@@ -0,0 +1,17 @@
+# 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.
+#
+
+class=org.apache.camel.tests.component.EchoTestComponent
diff --git a/tests/camel-itest-performance/src/main/resources/META-INF/services/org/apache/camel/component/test-perf b/tests/camel-itest-performance/src/main/resources/META-INF/services/org/apache/camel/component/test-perf
new file mode 100644
index 0000000..c53833f
--- /dev/null
+++ b/tests/camel-itest-performance/src/main/resources/META-INF/services/org/apache/camel/component/test-perf
@@ -0,0 +1,17 @@
+# 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.
+#
+
+class=org.apache.camel.tests.component.PerformanceTestComponent
diff --git a/tests/camel-itest-performance/src/test/java/org/apache/camel/tests/performance/NoTest.java b/tests/camel-itest-performance/src/test/java/org/apache/camel/tests/performance/NoTest.java
new file mode 100644
index 0000000..da4040c
--- /dev/null
+++ b/tests/camel-itest-performance/src/test/java/org/apache/camel/tests/performance/NoTest.java
@@ -0,0 +1,26 @@
+/*
+ * 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.tests.performance;
+
+import org.junit.jupiter.api.Test;
+
+public class NoTest {
+
+    @Test
+    public void testNothing() throws Exception {
+    }
+}
diff --git a/tests/camel-itest-performance/src/test/java/org/apache/camel/tests/performance/ProducerCacheHitsTest.java b/tests/camel-itest-performance/src/test/java/org/apache/camel/tests/performance/ProducerCacheHitsTest.java
new file mode 100644
index 0000000..3b63545
--- /dev/null
+++ b/tests/camel-itest-performance/src/test/java/org/apache/camel/tests/performance/ProducerCacheHitsTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.tests.performance;
+
+import java.text.DecimalFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.apache.camel.tests.component.PerformanceTestComponent;
+import org.apache.camel.util.StopWatch;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProducerCacheHitsTest extends CamelTestSupport {
+
+    private static final String SMALL_MESSAGE = "message";
+    private static final DecimalFormat FORMAT = new DecimalFormat("#.##");
+
+    private Logger log = LoggerFactory.getLogger(getClass());
+
+    @Test
+    public void testRepeatProcessing() throws Exception {
+        MockEndpoint data = getMandatoryEndpoint("mock:results", MockEndpoint.class);
+        data.expectedMessageCount(4 * 7);
+
+        for (int iter = 10; iter <= 10000; iter *= 10) {
+            for (int t = 2; t <= 128; t *= 2) {
+                runTest("test-perf:endpoint", SMALL_MESSAGE, iter, t);
+            }
+        }
+
+        data.assertIsSatisfied();
+        for (Exchange ex : data.getExchanges()) {
+            TestResult r = ex.getIn().getBody(TestResult.class);
+
+            log.info(r.toString());
+
+        }
+    }
+
+    protected Object runTest(String uri, String body, int iterations, int threads) {
+        Map<String, Object> headers = new HashMap<>();
+        headers.put(PerformanceTestComponent.HEADER_ITERATIONS, iterations);
+        headers.put(PerformanceTestComponent.HEADER_THREADS, threads);
+
+        StopWatch watch = new StopWatch();
+        Object result = template.requestBodyAndHeaders(uri, body, headers);
+        template.sendBody("mock:results", new TestResult(uri, iterations, threads, watch.taken()));
+        return result;
+    }
+
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("test-perf:endpoint").to("echo:echo");
+            }
+        };
+    }
+
+    public final class TestResult {
+        public String uri;
+        public int iterations;
+        public int threads;
+        public long time;
+
+        public TestResult(String uri, int iterations, int threads, long time) {
+            this.uri = uri;
+            this.iterations = iterations;
+            this.threads = threads;
+            this.time = time;
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("[");
+            sb.append(FORMAT.format(1000.0 * iterations / time));
+            sb.append(" /s], ");
+            sb.append(uri);
+            sb.append(", ");
+            sb.append(iterations);
+            sb.append(", ");
+            sb.append(threads);
+            sb.append(", ");
+            sb.append(time);
+            return sb.toString();
+        }
+    }
+}
diff --git a/tests/camel-itest-performance/src/test/resources/log4j2.properties b/tests/camel-itest-performance/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..d4f5a84
--- /dev/null
+++ b/tests/camel-itest-performance/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+appender.out.type = File
+appender.out.name = out
+appender.out.fileName = target/camel-test.log
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.stdout.type = Console
+appender.stdout.name = stdout
+appender.stdout.layout.type = PatternLayout
+appender.stdout.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.stdout.ref = stdout
diff --git a/tests/pom.xml b/tests/pom.xml
index 4f56de4..e92c26f 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -37,6 +37,7 @@
     <modules>
         <module>camel-jmh</module>
         <module>camel-performance</module>
+        <module>camel-itest-performance</module>
     </modules>
 
 </project>

[camel-performance-tests] 03/16: Initial camel performance

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit 991ff0b875e48fd3f2e3774c221d362f671c86ae
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Mar 10 13:29:07 2021 +0100

    Initial camel performance
---
 profiling/timer-log/README.md | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/profiling/timer-log/README.md b/profiling/timer-log/README.md
new file mode 100644
index 0000000..02e43ac
--- /dev/null
+++ b/profiling/timer-log/README.md
@@ -0,0 +1,20 @@
+## Camel Performance - Timer Log
+
+This is a small demo application that is used for cpu and memory profiling the
+internal Camel routing engine.
+
+The demo uses a timer to trigger 1000 msg/sec that gets routed by Camel.
+The demo does not use any networking or external services. This is on purpose
+to focus profiling the internals of Camel - more specific the routing engine.
+
+### Profiling
+
+The demo can be run with `mvn camel:run` or by running the `MyApplication.java`
+main class (from an IDE you can right-click this file and Run...).
+
+A profile such as _YourKit_ or _JDK mission control_ can be attached to
+the running application and manually profiled.
+
+The application can be configured in `application.properties` such as
+the functionality to turn on|off the pooling of exchanges (and other objects).
+

[camel-performance-tests] 14/16: CAMEL-16337: Add short uuid generator that uses 50% the size as the default.

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit 6027bb83ccd32b1b9c778ce7b98260e9f3b37176
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Mar 12 12:35:45 2021 +0100

    CAMEL-16337: Add short uuid generator that uses 50% the size as the default.
---
 profiling/timer-log/src/main/resources/application.properties | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/profiling/timer-log/src/main/resources/application.properties b/profiling/timer-log/src/main/resources/application.properties
index c7d93cf..52a6c20 100644
--- a/profiling/timer-log/src/main/resources/application.properties
+++ b/profiling/timer-log/src/main/resources/application.properties
@@ -22,6 +22,10 @@ camel.main.name = MyTinyCamel
 # run in lightweight mode to be tiny as possible
 camel.main.lightweight = true
 
+# use short uuid which uses 16 bytes vs 32 by default
+camel.main.uuid-generator = short
+
+# use object pooling to reduce JVM garbage collection
 camel.main.exchange-factory = pooled
 camel.main.exchange-factory-capacity = 25
 camel.main.exchange-factory-statistics-enabled = true

[camel-performance-tests] 11/16: CAMEL-16251 - Move Performance and jmh itests in a separated repository

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit f585f686cd54727febff5996ba2fef65f397e2a6
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Mar 10 16:22:02 2021 +0100

    CAMEL-16251 - Move Performance and jmh itests in a separated repository
---
 tests/camel-performance/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/camel-performance/pom.xml b/tests/camel-performance/pom.xml
index e97fc69..3e506f9 100644
--- a/tests/camel-performance/pom.xml
+++ b/tests/camel-performance/pom.xml
@@ -29,7 +29,7 @@
     </parent>
 
     <artifactId>camel-performance</artifactId>
-    <name>Camel :: Performance Tests :: Performance</name>
+    <name>Camel Performance :: Tests :: Performance</name>
     <description>Performs cross component performance tests</description>
 
     <dependencyManagement>

[camel-performance-tests] 02/16: Initial camel performance

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit 3361fb10eec311927f4f8ca938e704fbc4f01498
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Mar 10 13:24:32 2021 +0100

    Initial camel performance
---
 README.md | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..66bc9af
--- /dev/null
+++ b/README.md
@@ -0,0 +1,16 @@
+# Apache Camel Performance Tests
+
+![master build](https://github.com/apache/camel-examples/workflows/master%20build/badge.svg)
+[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.apache.camel/apache-camel/badge.svg?style=flat-square)](https://maven-badges.herokuapp.com/maven-central/org.apache.camel/apache-camel)
+[![Javadocs](http://www.javadoc.io/badge/org.apache.camel/apache-camel.svg?color=brightgreen)](http://www.javadoc.io/doc/org.apache.camel/camel-core)
+[![Stack Overflow](https://img.shields.io/:stack%20overflow-apache--camel-brightgreen.svg)](http://stackoverflow.com/questions/tagged/apache-camel)
+[![Chat](https://img.shields.io/badge/zulip-join_chat-brightgreen.svg)](https://camel.zulipchat.com/)
+[![Twitter](https://img.shields.io/twitter/follow/ApacheCamel.svg?label=Follow&style=social)](https://twitter.com/ApacheCamel)
+
+
+[Apache Camel](http://camel.apache.org/) is a powerful open source integration framework based on known
+Enterprise Integration Patterns with powerful bean integration.
+
+### Introduction
+
+This project provides performance tests for Apache Camel.

[camel-performance-tests] 16/16: Update profile test

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit be76098cc1aa60ded972f836525b202bbfee79a1
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Mar 13 10:38:22 2021 +0100

    Update profile test
---
 .../main/java/org/apache/camel/example/MyRouteBuilder.java  | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/profiling/timer-http/src/main/java/org/apache/camel/example/MyRouteBuilder.java b/profiling/timer-http/src/main/java/org/apache/camel/example/MyRouteBuilder.java
index e08606c..b5b7cb5 100644
--- a/profiling/timer-http/src/main/java/org/apache/camel/example/MyRouteBuilder.java
+++ b/profiling/timer-http/src/main/java/org/apache/camel/example/MyRouteBuilder.java
@@ -26,6 +26,17 @@ public class MyRouteBuilder extends RouteBuilder {
             // we can include a request body
             .setBody(constant("Hi from Camel"))
             .to("http://localhost:5678/")
-            .to("log:out?level=OFF");
+            // the bigger the route the more object allocations
+            // so lets test with 10 more steps
+            .to("log:out0?level=OFF")
+            .to("log:out1?level=OFF")
+            .to("log:out2?level=OFF")
+            .to("log:out3?level=OFF")
+            .to("log:out4?level=OFF")
+            .to("log:out5?level=OFF")
+            .to("log:out6?level=OFF")
+            .to("log:out7?level=OFF")
+            .to("log:out8?level=OFF")
+            .to("log:out9?level=OFF");
     }
 }

[camel-performance-tests] 15/16: Add http profiling demo

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit 72f547f6e357078be2c83d3c08c93c08387dc630
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Mar 12 14:36:03 2021 +0100

    Add http profiling demo
---
 profiling/pom.xml                                  |  1 +
 profiling/timer-http/README.md                     | 22 +++++
 profiling/timer-http/pom.xml                       | 98 ++++++++++++++++++++++
 .../org/apache/camel/example/MyApplication.java    | 38 +++++++++
 .../org/apache/camel/example/MyRouteBuilder.java   | 31 +++++++
 .../src/main/resources/application.properties      | 49 +++++++++++
 .../src/main/resources/logback.xml}                | 34 +++-----
 7 files changed, 250 insertions(+), 23 deletions(-)

diff --git a/profiling/pom.xml b/profiling/pom.xml
index 36c93db..cf5315e 100644
--- a/profiling/pom.xml
+++ b/profiling/pom.xml
@@ -36,6 +36,7 @@
 
     <modules>
         <module>timer-log</module>
+        <module>timer-http</module>
         <module>kafka-s3</module>
     </modules>
 
diff --git a/profiling/timer-http/README.md b/profiling/timer-http/README.md
new file mode 100644
index 0000000..7be1dbc
--- /dev/null
+++ b/profiling/timer-http/README.md
@@ -0,0 +1,22 @@
+## Camel Performance - Timer HTTP
+
+This is a small demo application that is used for cpu and memory profiling the HTTP component.
+
+The demo uses a timer to trigger 1000 msg/sec that calls a HTTP service.
+
+
+### Profiling
+
+At first start the HTTP service using docker:
+
+    docker run -p 5678:5678 hashicorp/http-echo -text="hello world"
+
+Then the demo can be run with `mvn camel:run` or by running the `MyApplication.java`
+main class (from an IDE you can right-click this file and Run...).
+
+A profile such as _YourKit_ or _JDK mission control_ can be attached to
+the running application and manually profiled.
+
+The application can be configured in `application.properties` such as
+the functionality to turn on|off the pooling of exchanges (and other objects).
+
diff --git a/profiling/timer-http/pom.xml b/profiling/timer-http/pom.xml
new file mode 100644
index 0000000..3c57513
--- /dev/null
+++ b/profiling/timer-http/pom.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <parent>
+        <groupId>org.apache.camel.tests</groupId>
+        <artifactId>profiling</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>timer-http</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <name>Camel Performance :: Profiling :: Timer HTTP</name>
+    <description>A little example to profile Camel routing engine</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- Add Camel BOM -->
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-bom</artifactId>
+                <version>${camel.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-main</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-timer</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-log</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-http</artifactId>
+        </dependency>
+
+        <!-- logging -->
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>${logback-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback-version}</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!-- to run the application -->
+            <plugin>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-maven-plugin</artifactId>
+                <version>${camel.version}</version>
+                <configuration>
+                    <mainClass>org.apache.camel.example.MyApplication</mainClass>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/profiling/timer-http/src/main/java/org/apache/camel/example/MyApplication.java b/profiling/timer-http/src/main/java/org/apache/camel/example/MyApplication.java
new file mode 100644
index 0000000..496b37d
--- /dev/null
+++ b/profiling/timer-http/src/main/java/org/apache/camel/example/MyApplication.java
@@ -0,0 +1,38 @@
+/*
+ * 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.example;
+
+import org.apache.camel.main.Main;
+
+/**
+ * Main class that boot the Camel application
+ */
+public final class MyApplication {
+
+    private MyApplication() {
+    }
+
+    public static void main(String[] args) throws Exception {
+        // use Camels Main class
+        Main main = new Main();
+        // and add the routes (you can specify multiple classes)
+        main.configure().addRoutesBuilder(MyRouteBuilder.class);
+        // now keep the application running until the JVM is terminated (ctrl + c or sigterm)
+        main.run(args);
+    }
+
+}
diff --git a/profiling/timer-http/src/main/java/org/apache/camel/example/MyRouteBuilder.java b/profiling/timer-http/src/main/java/org/apache/camel/example/MyRouteBuilder.java
new file mode 100644
index 0000000..e08606c
--- /dev/null
+++ b/profiling/timer-http/src/main/java/org/apache/camel/example/MyRouteBuilder.java
@@ -0,0 +1,31 @@
+/*
+ * 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.example;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class MyRouteBuilder extends RouteBuilder {
+
+    @Override
+    public void configure() throws Exception {
+        from("timer:foo?delay=10s&period={{myPeriod}}&includeMetadata=false")
+            // we can include a request body
+            .setBody(constant("Hi from Camel"))
+            .to("http://localhost:5678/")
+            .to("log:out?level=OFF");
+    }
+}
diff --git a/profiling/timer-http/src/main/resources/application.properties b/profiling/timer-http/src/main/resources/application.properties
new file mode 100644
index 0000000..f106b44
--- /dev/null
+++ b/profiling/timer-http/src/main/resources/application.properties
@@ -0,0 +1,49 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+# to configure camel main
+# here you can configure options on camel main (see MainConfigurationProperties class)
+camel.main.name = MyTinyCamel
+
+# run in lightweight mode to be tiny as possible
+camel.main.lightweight = true
+
+# use short uuid which uses 16 bytes vs 32 by default
+camel.main.uuid-generator = short
+
+# use object pooling to reduce JVM garbage collection
+camel.main.exchange-factory = pooled
+camel.main.exchange-factory-capacity = 25
+camel.main.exchange-factory-statistics-enabled = true
+
+# turn off various things on http component we do not need
+camel.component.http.cookie-management-disabled = true
+camel.component.http.auth-caching-disabled = true
+camel.component.http.content-compression-disabled = true
+
+# we can turn on|off whether to include request/response header mappings
+# camel.component.http.skip-request-headers = true
+# camel.component.http.skip-response-headers = true
+
+# we can turn copy headers off as we do not need this as http producer only
+camel.component.http.copy-headers = false
+
+# run for about 2 minutes
+camel.main.duration-max-seconds = 130
+
+# properties used in the route
+myPeriod = 1
diff --git a/profiling/pom.xml b/profiling/timer-http/src/main/resources/logback.xml
similarity index 53%
copy from profiling/pom.xml
copy to profiling/timer-http/src/main/resources/logback.xml
index 36c93db..a798d0b 100644
--- a/profiling/pom.xml
+++ b/profiling/timer-http/src/main/resources/logback.xml
@@ -17,26 +17,14 @@
     limitations under the License.
 
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.camel.tests</groupId>
-        <artifactId>camel-tests-parent</artifactId>
-        <version>1.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>profiling</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>pom</packaging>
-    <name>Camel Performance :: Profiling</name>
-
-    <modules>
-        <module>timer-log</module>
-        <module>kafka-s3</module>
-    </modules>
-
-</project>
+<configuration>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="STDOUT" />
+    </root>
+</configuration>

[camel-performance-tests] 04/16: Remove files added by mistake

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit aed9c5ec3e48c9c37c6a10f41b3b973290393c1c
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Mar 10 13:29:44 2021 +0100

    Remove files added by mistake
---
 .../target/classes/application.properties          | 32 ----------------------
 profiling/timer-log/target/classes/logback.xml     | 30 --------------------
 2 files changed, 62 deletions(-)

diff --git a/profiling/timer-log/target/classes/application.properties b/profiling/timer-log/target/classes/application.properties
deleted file mode 100644
index c7d93cf..0000000
--- a/profiling/timer-log/target/classes/application.properties
+++ /dev/null
@@ -1,32 +0,0 @@
-## ---------------------------------------------------------------------------
-## 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.
-## ---------------------------------------------------------------------------
-
-# to configure camel main
-# here you can configure options on camel main (see MainConfigurationProperties class)
-camel.main.name = MyTinyCamel
-
-# run in lightweight mode to be tiny as possible
-camel.main.lightweight = true
-
-camel.main.exchange-factory = pooled
-camel.main.exchange-factory-capacity = 25
-camel.main.exchange-factory-statistics-enabled = true
-
-camel.main.duration-max-seconds = 130
-
-# properties used in the route
-myPeriod = 1
diff --git a/profiling/timer-log/target/classes/logback.xml b/profiling/timer-log/target/classes/logback.xml
deleted file mode 100644
index a798d0b..0000000
--- a/profiling/timer-log/target/classes/logback.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    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.
-
--->
-<configuration>
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <encoder>
-            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
-        </encoder>
-    </appender>
-
-    <root level="INFO">
-        <appender-ref ref="STDOUT" />
-    </root>
-</configuration>

[camel-performance-tests] 13/16: CAMEL-16251 - Move Performance and jmh itests in a separated repository

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit 88cd709a2d5e0ffc53c1aa32748d592032fb0765
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Mar 10 16:37:17 2021 +0100

    CAMEL-16251 - Move Performance and jmh itests in a separated repository
---
 tests/camel-itest-performance/pom.xml | 13 -------------
 tests/camel-jmh/pom.xml               | 15 +--------------
 tests/camel-performance/pom.xml       | 13 -------------
 tests/pom.xml                         | 13 +++++++++++++
 4 files changed, 14 insertions(+), 40 deletions(-)

diff --git a/tests/camel-itest-performance/pom.xml b/tests/camel-itest-performance/pom.xml
index bd77f9f..422524a 100644
--- a/tests/camel-itest-performance/pom.xml
+++ b/tests/camel-itest-performance/pom.xml
@@ -32,19 +32,6 @@
     <name>Camel Performance :: Tests :: Perfomance integration tests</name>
     <description>Tests camel performance aspects</description>
 
-    <dependencyManagement>
-        <dependencies>
-            <!-- Add Camel BOM -->
-            <dependency>
-                <groupId>org.apache.camel</groupId>
-                <artifactId>camel-bom</artifactId>
-                <version>${camel.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
     <dependencies>
 
         <dependency>
diff --git a/tests/camel-jmh/pom.xml b/tests/camel-jmh/pom.xml
index 2b87eba..6f51554 100644
--- a/tests/camel-jmh/pom.xml
+++ b/tests/camel-jmh/pom.xml
@@ -32,19 +32,6 @@
     <name>Camel Performance :: Tests :: JMH</name>
     <description>Performs JMH performance tests</description>
 
-    <dependencyManagement>
-        <dependencies>
-            <!-- Add Camel BOM -->
-            <dependency>
-                <groupId>org.apache.camel</groupId>
-                <artifactId>camel-bom</artifactId>
-                <version>${camel.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
     <dependencies>
 
         <dependency>
@@ -98,7 +85,7 @@
             <groupId>org.apache.logging.log4j</groupId>
             <artifactId>log4j-slf4j-impl</artifactId>
             <scope>test</scope>
-             <version>${log4j2-version}</version>
+            <version>${log4j2-version}</version>
         </dependency>
     </dependencies>
 
diff --git a/tests/camel-performance/pom.xml b/tests/camel-performance/pom.xml
index 3e506f9..7e700c9 100644
--- a/tests/camel-performance/pom.xml
+++ b/tests/camel-performance/pom.xml
@@ -32,19 +32,6 @@
     <name>Camel Performance :: Tests :: Performance</name>
     <description>Performs cross component performance tests</description>
 
-    <dependencyManagement>
-        <dependencies>
-            <!-- Add Camel BOM -->
-            <dependency>
-                <groupId>org.apache.camel</groupId>
-                <artifactId>camel-bom</artifactId>
-                <version>${camel.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
     <dependencies>
         <!-- assuming camel is pulling aries 1.0.0, pull asm 4.0 first -->
         <dependency>
diff --git a/tests/pom.xml b/tests/pom.xml
index e92c26f..634270a 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -34,6 +34,19 @@
     <packaging>pom</packaging>
     <name>Camel Performance :: Tests</name>
 
+    <dependencyManagement>
+        <dependencies>
+            <!-- Add Camel BOM -->
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-bom</artifactId>
+                <version>${camel.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <modules>
         <module>camel-jmh</module>
         <module>camel-performance</module>

[camel-performance-tests] 10/16: CAMEL-16251 - Move Performance and jmh itests in a separated repository

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit bd8fbbbe7c57a4cce0d1737d209b4cd95d6519a4
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Mar 10 16:20:58 2021 +0100

    CAMEL-16251 - Move Performance and jmh itests in a separated repository
---
 tests/camel-performance/README.adoc                |   8 +
 tests/camel-performance/pom.xml                    | 170 +++++++++++++++++++++
 .../src/test/data/1K_buyStocks.xml                 |  33 ++++
 .../test/perf/AbstractBasePerformanceTest.java     |  64 ++++++++
 .../perf/ContentBasedRoutingPerformanceTest.java   | 115 ++++++++++++++
 .../perf/HeaderBasedRoutingPerformanceTest.java    | 122 +++++++++++++++
 .../camel/test/perf/SplitterPerformanceTest.java   |  92 +++++++++++
 .../perf/XPathBasedRoutingPerformanceTest.java     |  81 ++++++++++
 .../perf/XQueryBasedRoutingPerformanceTest.java    |  81 ++++++++++
 .../camel/test/perf/XsltPerformanceTest.java       |  53 +++++++
 .../src/test/resources/1K_buyStocks.xml            |  33 ++++
 .../src/test/resources/1K_buyStocks_secure.xml     |  78 ++++++++++
 .../test/resources/META-INF/xslt/transform.xslt    |  35 +++++
 .../src/test/resources/log4j2.properties           |  29 ++++
 .../camel-performance/src/test/resources/store.jks | Bin 0 -> 6377 bytes
 .../resources/wsdl/CBRWSDL-consumer-embedded.wsdl  | 126 +++++++++++++++
 .../resources/wsdl/CBRWSDL-provider-embedded.wsdl  | 126 +++++++++++++++
 .../wsdl/HBRSoapWSDL-consumer-embedded.wsdl        | 139 +++++++++++++++++
 .../wsdl/HBRSoapWSDL-provider-embedded.wsdl        | 126 +++++++++++++++
 .../wsdl/HBRTransportWSDL-consumer-embedded.wsdl   | 126 +++++++++++++++
 .../wsdl/HBRTransportWSDL-provider-embedded.wsdl   | 126 +++++++++++++++
 .../wsdl/ProxyWSDL-consumer-embedded.wsdl          | 126 +++++++++++++++
 .../wsdl/ProxyWSDL-provider-embedded.wsdl          | 126 +++++++++++++++
 .../wsdl/SecureProxyWSDL-consumer-embedded.wsdl    | 126 +++++++++++++++
 .../wsdl/SecureProxyWSDL-provider-embedded.wsdl    | 126 +++++++++++++++
 .../wsdl/TransformerWSDL-consumer-embedded.wsdl    | 126 +++++++++++++++
 .../wsdl/TransformerWSDL-provider-embedded.wsdl    | 126 +++++++++++++++
 .../src/test/resources/wssecurity.properties       |  21 +++
 .../src/test/resources/xslt/transform.xslt         |  35 +++++
 .../src/test/resources/xslt/transform_back.xslt    |  32 ++++
 tests/pom.xml                                      |   1 +
 31 files changed, 2608 insertions(+)

diff --git a/tests/camel-performance/README.adoc b/tests/camel-performance/README.adoc
new file mode 100644
index 0000000..a8f82fe
--- /dev/null
+++ b/tests/camel-performance/README.adoc
@@ -0,0 +1,8 @@
+= Camel Performance Tests
+
+== Overview
+
+This module is where you should add performance tests.
+
+All tests should be disabled by default to not run on the CI server because
+we expect performance test are time and CPU consuming.
\ No newline at end of file
diff --git a/tests/camel-performance/pom.xml b/tests/camel-performance/pom.xml
new file mode 100644
index 0000000..e97fc69
--- /dev/null
+++ b/tests/camel-performance/pom.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel.tests</groupId>
+        <artifactId>tests</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>camel-performance</artifactId>
+    <name>Camel :: Performance Tests :: Performance</name>
+    <description>Performs cross component performance tests</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- Add Camel BOM -->
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-bom</artifactId>
+                <version>${camel.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <!-- assuming camel is pulling aries 1.0.0, pull asm 4.0 first -->
+        <dependency>
+            <groupId>org.ow2.asm</groupId>
+            <artifactId>asm-all</artifactId>
+            <version>5.2</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.core</artifactId>
+            <scope>test</scope>
+            <version>${osgi-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>osgi.cmpn</artifactId>
+            <scope>test</scope>
+            <version>${osgi-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- logging -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+            <version>${log4j2-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-1.2-api</artifactId>
+            <scope>test</scope>
+            <version>${log4j2-version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>${commons-io-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-http</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-saxon</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-cxf</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-ws-security</artifactId>
+            <scope>test</scope>
+            <version>${cxf-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.ws.security</groupId>
+            <artifactId>wss4j</artifactId>
+            <version>1.6.17</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcpg-jdk15on</artifactId>
+            <version>${bouncycastle-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk15on</artifactId>
+            <version>${bouncycastle-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+            <version>${jetty9-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlet</artifactId>
+            <version>${jetty9-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-util</artifactId>
+            <version>${jetty9-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-io</artifactId>
+            <version>${jetty9-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-transports-http</artifactId>
+            <scope>test</scope>
+            <version>${cxf-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-transports-http-jetty</artifactId>
+            <scope>test</scope>
+            <version>${cxf-version}</version>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/tests/camel-performance/src/test/data/1K_buyStocks.xml b/tests/camel-performance/src/test/data/1K_buyStocks.xml
new file mode 100644
index 0000000..c57a823
--- /dev/null
+++ b/tests/camel-performance/src/test/data/1K_buyStocks.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+<soapenv:Header><routing xmlns="http://someuri">xadmin;server1;community#1.0##</routing></soapenv:Header>
+<soapenv:Body>
+<m:buyStocks xmlns:m="http://services.samples/xsd">
+<order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>
+<order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>8030</volume></order>
+<order><symbol>SUN</symbol><buyerID>indika</buyerID><price>14.56</price><volume>500</volume></order>
+<order><symbol>GOOG</symbol><buyerID>chathura</buyerID><price>60.24</price><volume>40000</volume></order>
+<order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>
+<order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>803000</volume></order>
+<order><symbol>SUN</symbol><buyerID>indika</buyerID><price>14.56</price><volume>5000</volume></order>
+</m:buyStocks>
+</soapenv:Body>
+</soapenv:Envelope>
diff --git a/tests/camel-performance/src/test/java/org/apache/camel/test/perf/AbstractBasePerformanceTest.java b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/AbstractBasePerformanceTest.java
new file mode 100644
index 0000000..87a4fbb
--- /dev/null
+++ b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/AbstractBasePerformanceTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.test.perf;
+
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.TestInstance;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public abstract class AbstractBasePerformanceTest extends CamelTestSupport {
+
+    protected static final String BODY_1KB_PAYLOAD
+            = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+              + "<soapenv:Header><routing xmlns=\"http://someuri\">xadmin;server1;community#1.0##</routing></soapenv:Header>"
+              + "<soapenv:Body>"
+              + "<m:buyStocks xmlns:m=\"http://services.samples/xsd\">"
+              + "<order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>"
+              + "<order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>8030</volume></order>"
+              + "<order><symbol>SUN</symbol><buyerID>indika</buyerID><price>14.56</price><volume>500</volume></order>"
+              + "<order><symbol>GOOG</symbol><buyerID>chathura</buyerID><price>60.24</price><volume>40000</volume></order>"
+              + "<order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>"
+              + "<order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>803000</volume></order>"
+              + "<order><symbol>SUN</symbol><buyerID>indika</buyerID><price>14.56</price><volume>5000</volume></order>"
+              + "</m:buyStocks>"
+              + "</soapenv:Body>"
+              + "</soapenv:Envelope>";
+
+    protected final Logger log = LoggerFactory.getLogger(getClass());
+
+    protected String getPayload() {
+        return BODY_1KB_PAYLOAD;
+    }
+
+    protected void resetMock(int count) {
+        MockEndpoint mock = getMockEndpoint("mock:end");
+        mock.reset();
+        mock.setRetainFirst(0);
+        mock.setRetainLast(0);
+        mock.expectedMessageCount(count);
+    }
+
+    protected void execute(int count) {
+        for (int counter = 0; counter < count; counter++) {
+            template.sendBody(getPayload());
+        }
+    }
+
+}
diff --git a/tests/camel-performance/src/test/java/org/apache/camel/test/perf/ContentBasedRoutingPerformanceTest.java b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/ContentBasedRoutingPerformanceTest.java
new file mode 100644
index 0000000..622480c
--- /dev/null
+++ b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/ContentBasedRoutingPerformanceTest.java
@@ -0,0 +1,115 @@
+/*
+ * 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.test.perf;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.util.StopWatch;
+import org.junit.jupiter.api.Test;
+
+public class ContentBasedRoutingPerformanceTest extends AbstractBasePerformanceTest {
+
+    private final int count = 30000;
+
+    @Test
+    public void testChoiceSimple() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:choice-simple");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Test
+    public void testChoiceExpression() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:choice-expression");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Test
+    public void testFilterSimple() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:filter-simple");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Test
+    public void testFilterExpression() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:filter-expression");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("direct:filter-simple")
+                        .filter().simple("${body} contains 'xadmin;server1;community#1.0##'")
+                        .to("mock:end");
+
+                from("direct:filter-expression")
+                        .filter(body().contains("<order><symbol>IBM</symbol><buyerID>asankha</buyerID>"))
+                        .to("mock:end");
+
+                from("direct:choice-simple")
+                        .choice()
+                        .when().simple("${body} contains 'xadmin;server1;community#1.0##'")
+                        .to("mock:end");
+
+                from("direct:choice-expression")
+                        .choice()
+                        .when(body().contains("<order><symbol>IBM</symbol><buyerID>asankha</buyerID>"))
+                        .to("mock:end");
+            }
+        };
+    }
+}
diff --git a/tests/camel-performance/src/test/java/org/apache/camel/test/perf/HeaderBasedRoutingPerformanceTest.java b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/HeaderBasedRoutingPerformanceTest.java
new file mode 100644
index 0000000..eae43fa
--- /dev/null
+++ b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/HeaderBasedRoutingPerformanceTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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.test.perf;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.util.StopWatch;
+import org.junit.jupiter.api.Test;
+
+public class HeaderBasedRoutingPerformanceTest extends AbstractBasePerformanceTest {
+
+    private final int count = 30000;
+
+    @Test
+    public void testChoiceSimple() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:choice-simple");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Test
+    public void testChoiceExpression() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:choice-expression");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Test
+    public void testFilterSimple() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:filter-simple");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Test
+    public void testFilterExpression() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:filter-expression");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Override
+    protected void execute(int count) {
+        for (int counter = 0; counter < count; counter++) {
+            template.sendBodyAndHeader(getPayload(), "routing", "xadmin;server1;community#1.0##");
+        }
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("direct:filter-simple")
+                        .filter(simple("${in.header.routing} == 'xadmin;server1;community#1.0##'"))
+                        .to("mock:end");
+
+                from("direct:filter-expression")
+                        .filter(header("routing").isEqualTo("xadmin;server1;community#1.0##"))
+                        .to("mock:end");
+
+                from("direct:choice-simple")
+                        .choice()
+                        .when(simple("${in.header.routing} == 'xadmin;server1;community#1.0##'"))
+                        .to("mock:end");
+
+                from("direct:choice-expression")
+                        .choice()
+                        .when(header("routing").isEqualTo("xadmin;server1;community#1.0##"))
+                        .to("mock:end");
+            }
+        };
+    }
+}
diff --git a/tests/camel-performance/src/test/java/org/apache/camel/test/perf/SplitterPerformanceTest.java b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/SplitterPerformanceTest.java
new file mode 100644
index 0000000..f0d0e68
--- /dev/null
+++ b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/SplitterPerformanceTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.test.perf;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.util.StopWatch;
+import org.junit.jupiter.api.Test;
+
+public class SplitterPerformanceTest extends AbstractBasePerformanceTest {
+
+    protected static final String HEADER = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\">"
+                                           + "<soapenv:Header><routing xmlns=\"http://someuri\">xadmin;server1;community#1.0##</routing></soapenv:Header>"
+                                           + "<soapenv:Body>"
+                                           + "<m:buyStocks xmlns:m=\"http://services.samples/xsd\">";
+
+    protected static final String BODY
+            = "<order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>\n"
+              + "<order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>8030</volume></order>\n"
+              + "<order><symbol>SUN</symbol><buyerID>indika</buyerID><price>14.56</price><volume>500</volume></order>\n"
+              + "<order><symbol>GOOG</symbol><buyerID>chathura</buyerID><price>60.24</price><volume>40000</volume></order>\n"
+              + "<order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>\n"
+              + "<order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>803000</volume></order>\n"
+              + "<order><symbol>SUN</symbol><buyerID>indika</buyerID><price>14.56</price><volume>5000</volume></order>\n"
+              + "<order><symbol>GOOG</symbol><buyerID>chathura</buyerID><price>60.24</price><volume>40000</volume></order>\n"
+              + "<order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>\n"
+              + "<order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>803000</volume></order>\n";
+
+    protected static final String TRAILER = "</m:buyStocks>"
+                                            + "</soapenv:Body>"
+                                            + "</soapenv:Envelope>";
+
+    protected static final String PAYLOAD;
+
+    static {
+        StringBuilder builder = new StringBuilder(HEADER);
+
+        for (int i = 0; i < 2000; i++) {
+            builder.append(BODY);
+        }
+
+        builder.append(TRAILER);
+        PAYLOAD = builder.toString();
+    }
+
+    private final int count = 20001;
+
+    @Test
+    public void testTokenize() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:tokenize");
+
+        // warm up with 1 message so that the JIT compiler kicks in
+        execute(1);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(1);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Override
+    protected String getPayload() {
+        return PAYLOAD;
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("direct:tokenize")
+                        .split(body().tokenize("\n"))
+                        .to("mock:end");
+            }
+        };
+    }
+}
diff --git a/tests/camel-performance/src/test/java/org/apache/camel/test/perf/XPathBasedRoutingPerformanceTest.java b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/XPathBasedRoutingPerformanceTest.java
new file mode 100644
index 0000000..81bd5eb
--- /dev/null
+++ b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/XPathBasedRoutingPerformanceTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.test.perf;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.util.StopWatch;
+import org.junit.jupiter.api.Test;
+
+public class XPathBasedRoutingPerformanceTest extends AbstractBasePerformanceTest {
+
+    private final int count = 30000;
+
+    @Test
+    public void testChoice() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:choice");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Test
+    public void testFilter() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:filter");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                Map<String, String> namespaces = new HashMap<>();
+                namespaces.put("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
+                namespaces.put("m", "http://services.samples/xsd");
+
+                from("direct:filter")
+                        .filter().xpath("/soapenv:Envelope/soapenv:Body/m:buyStocks/order[1]/symbol='IBM'", namespaces)
+                        .to("mock:end");
+
+                from("direct:choice")
+                        .choice()
+                        .when().xpath("/soapenv:Envelope/soapenv:Body/m:buyStocks/order[1]/symbol='IBM'", namespaces)
+                        .to("mock:end");
+            }
+        };
+    }
+}
diff --git a/tests/camel-performance/src/test/java/org/apache/camel/test/perf/XQueryBasedRoutingPerformanceTest.java b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/XQueryBasedRoutingPerformanceTest.java
new file mode 100644
index 0000000..c501e7f
--- /dev/null
+++ b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/XQueryBasedRoutingPerformanceTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.test.perf;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.util.StopWatch;
+import org.junit.jupiter.api.Test;
+
+public class XQueryBasedRoutingPerformanceTest extends AbstractBasePerformanceTest {
+
+    private final int count = 30000;
+
+    @Test
+    public void testChoice() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:choice");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Test
+    public void testFilter() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:filter");
+
+        // warm up with 20.000 messages so that the JIT compiler kicks in
+        execute(20000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                Map<String, String> namespaces = new HashMap<>();
+                namespaces.put("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
+                namespaces.put("m", "http://services.samples/xsd");
+
+                from("direct:filter")
+                        .filter().xquery("/soapenv:Envelope/soapenv:Body/m:buyStocks/order[1]/symbol='IBM'", namespaces)
+                        .to("mock:end");
+
+                from("direct:choice")
+                        .choice()
+                        .when().xquery("/soapenv:Envelope/soapenv:Body/m:buyStocks/order[1]/symbol='IBM'", namespaces)
+                        .to("mock:end");
+            }
+        };
+    }
+}
diff --git a/tests/camel-performance/src/test/java/org/apache/camel/test/perf/XsltPerformanceTest.java b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/XsltPerformanceTest.java
new file mode 100644
index 0000000..b3d2aa7
--- /dev/null
+++ b/tests/camel-performance/src/test/java/org/apache/camel/test/perf/XsltPerformanceTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.test.perf;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.util.StopWatch;
+import org.junit.jupiter.api.Test;
+
+public class XsltPerformanceTest extends AbstractBasePerformanceTest {
+
+    private final int count = 10000;
+
+    @Test
+    public void testXslt() throws InterruptedException {
+        template.setDefaultEndpointUri("direct:xslt");
+
+        // warm up with 1.000 messages so that the JIT compiler kicks in
+        execute(1000);
+
+        resetMock(count);
+
+        StopWatch watch = new StopWatch();
+        execute(count);
+
+        assertMockEndpointsSatisfied();
+        log.warn("Ran {} tests in {}ms", count, watch.taken());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() throws Exception {
+                from("direct:xslt")
+                        .to("xslt://META-INF/xslt/transform.xslt")
+                        .to("mock:end");
+            }
+        };
+    }
+}
diff --git a/tests/camel-performance/src/test/resources/1K_buyStocks.xml b/tests/camel-performance/src/test/resources/1K_buyStocks.xml
new file mode 100644
index 0000000..c57a823
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/1K_buyStocks.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+<soapenv:Header><routing xmlns="http://someuri">xadmin;server1;community#1.0##</routing></soapenv:Header>
+<soapenv:Body>
+<m:buyStocks xmlns:m="http://services.samples/xsd">
+<order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>
+<order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>8030</volume></order>
+<order><symbol>SUN</symbol><buyerID>indika</buyerID><price>14.56</price><volume>500</volume></order>
+<order><symbol>GOOG</symbol><buyerID>chathura</buyerID><price>60.24</price><volume>40000</volume></order>
+<order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>
+<order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>803000</volume></order>
+<order><symbol>SUN</symbol><buyerID>indika</buyerID><price>14.56</price><volume>5000</volume></order>
+</m:buyStocks>
+</soapenv:Body>
+</soapenv:Envelope>
diff --git a/tests/camel-performance/src/test/resources/1K_buyStocks_secure.xml b/tests/camel-performance/src/test/resources/1K_buyStocks_secure.xml
new file mode 100644
index 0000000..c5aa7cc
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/1K_buyStocks_secure.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+<soapenv:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1"><xenc:EncryptedKey xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Id="id-1357383968943278000-1391997743"><xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"/><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><wsse:SecurityTokenReference><wsse:KeyIdentifier EncodingType="http://docs.oasis-open.org/wss/2004/ [...]
+74Cg9Ot33to1CpQ4wl7SlszeomRx+AL3GA+QuouhO9eDJyAbjYIFy+FcUJ619P1AD1FR8VVdW5P4
+DvOxGfm+htl81tdP2kU=</xenc:CipherValue></xenc:CipherData><xenc:ReferenceList><xenc:DataReference URI="#id-1357383968943430000-1928238693"/></xenc:ReferenceList></xenc:EncryptedKey><wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity- [...]
+DAVPQVNJUzEeMBwGA1UEAwwVT0FTSVMgSW50ZXJvcCBUZXN0IENBMB4XDTA1MDMxOTAwMDAwMFoX
+DTE4MDMxOTIzNTk1OVowQjEOMAwGA1UECgwFT0FTSVMxIDAeBgNVBAsMF09BU0lTIEludGVyb3Ag
+VGVzdCBDZXJ0MQ4wDAYDVQQDDAVBbGljZTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAoqi9
+9By1VYo0aHrkKCNT4DkIgPL/SgahbeKdGhrbu3K2XG7arfD9tqIBIKMfrX4Gp90NJa85AV1yiNsE
+yvq+mUnMpNcKnLXLOjkTmMCqDYbbkehJlXPnaWLzve+mW0pJdPxtf3rbD4PS/cBQIvtpjmrDAU8V
+sZKT8DN5Kyz+EZsCAwEAAaOBkzCBkDAJBgNVHRMEAjAAMDMGA1UdHwQsMCowKKImhiRodHRwOi8v
+aW50ZXJvcC5iYnRlc3QubmV0L2NybC9jYS5jcmwwDgYDVR0PAQH/BAQDAgSwMB0GA1UdDgQWBBQK
+4l0TUHZ1QV3V2QtlLNDm+PoxiDAfBgNVHSMEGDAWgBTAnSj8wes1oR3WqqqgHBpNwkkPDzANBgkq
+hkiG9w0BAQUFAAOCAQEABTqpOpvW+6yrLXyUlP2xJbEkohXHI5OWwKWleOb9hlkhWntUalfcFOJA
+gUyH30TTpHldzx1+vK2LPzhoUFKYHE1IyQvokBN2JjFO64BQukCKnZhldLRPxGhfkTdxQgdf5rCK
+/wh3xVsZCNTfuMNmlAM6lOAg8QduDah3WFZpEA0s2nwQaCNQTNMjJC8tav1CBr6+E5FAmwPXP7pJ
+xn9Fw9OXRyqbRA4v2y7YpbGkG2GI9UvOHw6SGvf4FRSthMMO35YbpikGsLix3vAsXWWi4rwfVOYz
+QK0OFPNi9RMCUdSH06m9uLWckiCxjos0FQODZE9l4ATGy9s9hNVwryOJTw==</wsse:BinarySecurityToken><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+<ds:SignedInfo>
+<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
+<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
+<ds:Reference URI="#id-1357383968939063000-142227415">
+<ds:Transforms>
+<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
+</ds:Transforms>
+<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
+<ds:DigestValue>SZkK3D7xaoGDBMudnAhko4svV3Y=</ds:DigestValue>
+</ds:Reference>
+<ds:Reference URI="#id-1357383968938551000-396142871">
+<ds:Transforms>
+<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
+</ds:Transforms>
+<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
+<ds:DigestValue>HUHU6PCkHctVkkxdOVBTowAcTds=</ds:DigestValue>
+</ds:Reference>
+</ds:SignedInfo>
+<ds:SignatureValue>
+gAc34IGlAuClhIbQ6Vyd8iu8pw0RTw0eyXjNQEUzEzWt6/vdG1Z9clDup13SzyTvaVRkv0fbRzFy
+5joMJ7CLjdMrHJg/FP6TMFUxDlit3QXbAaiB7J/VxMuJuQ05+MjnqCy/I4D8QCt7BhlbPiPozPsk
+bhDz8LOeWQDzXSUJJ1U=
+</ds:SignatureValue>
+<ds:KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="#id-1357383968942887000-228572128" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></ds:KeyInfo></ds:Signature><wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-1357383968938551000-396142871"><wsu:Created>2013-01-05T11:06:08.938Z</wsu:Created><wsu:Expires>2013-02-04T11:06:08.93 [...]
+<soapenv:Body wsu:Id="id-1357383968939063000-142227415" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Id="id-1357383968943430000-1928238693" Type="http://www.w3.org/2001/04/xmlenc#Content"><xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"/><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+<wsse:SecurityTokenReference xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><wsse:Reference URI="#id-1357383968943278000-1391997743"/></wsse:SecurityTokenReference>
+</ds:KeyInfo><xenc:CipherData><xenc:CipherValue>OaYLQwfFj0i01Zl7fCp8xclhoBR8/OJvqN6qdPUYcd2hHlYJOtHTnirPXev0xCxM4Y0/LHcFc64n
+afRkz/cT+V4yLW5MSfZfeLFvLIfrz427UblCwQxQlgyiBxP16KkGVdGLws9duaNOPE4efKt7brnV
+AOqvj2olsFLBz2LE7OAH/eDDQh2s19ivjy+OKqTDj11kOXtCb7fS6Egi5erzte9dKvE6rnUXVue3
+C+H5/NRkJXiayMznpJoVUwkmSobwHV7syuli8wF6tExKZVHZzJVJngRjvLsFJBAI9Zbcpu/VzV0U
+NtmO7wbntC/WHnTW1gqzqsyFUVrKuLtT92z8qL2PEIl8lqCYfg2LdZzVPzUNXVLA9c7WSgbeoRty
+euj20EGqLRWrMQx6/fwVoUHTqdBmI17IF0btRELVrBr+HXOOSg+WKZ2kRtQTC9fWjPHhxLaMQCMX
+0ijls8JrHdRRIOUeB3IBM4hWQwA19mXwIR+apCcjaQld0K2SvIQAqSDdwYQleYoT+lYlxTNwqDSF
+RNUPNygkDbGPF0wV4sMMgOj751VSiCSVcBNtbTsdMWxqtmvpr3IQO5HDvdr3jToDWN2a79bWBvkH
+q40bvAOLiQshMgu+wLeTRmg5yv+5TYi6bDaz20aXTSp3nKHJIvnc8386ZrpKYx8RWEvfkXgm5+Bj
+zLesMmGQLiaIcWnCDBOVa6XcGf5rxLi806vic6lqpl/12CseBuyfxN8UqvI4sRlJUbseQtUBKoov
+c+EAPPbQatoBd1xOyy6h9zIkHinCCDGjMIPQ89pVb4vb5lH7VQKgJh96gT8LX1XgHQQKpaF0ab5L
+zOd4d4Qlv+J9ZkvxrmNMYNoueDgqq/r6+Q4Q5d66lfv5jm/4GrrL6CYmC0ZasNnRBrO7B6QZnsp0
+Cjzzbl4rT0fuHGHAKnUVFCRe3puzS+nsumJ8lIMam+OQkCqvli+2wew1JtJjcll49x58hAnwRDgy
+YzukmNt73HJirVdT6Yhe3s3R0kpqRARza1UPsVheL+XQP6hVpS8etabk5cBzGatoYUK6IIDRsz9a
+RZKzN0cUEEJ/KlcsZE1hDz8/</xenc:CipherValue></xenc:CipherData></xenc:EncryptedData></soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file
diff --git a/tests/camel-performance/src/test/resources/META-INF/xslt/transform.xslt b/tests/camel-performance/src/test/resources/META-INF/xslt/transform.xslt
new file mode 100644
index 0000000..cbd3ebf
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/META-INF/xslt/transform.xslt
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet version="2.0"
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:m0="http://services.samples/xsd"
+    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+    
+    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" exclude-result-prefixes="m0" />
+
+    <xsl:template match="m0:buyStocks">
+        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+            <soapenv:Body>
+                <m:skcotSyub xmlns:m="http://services.samples/xsd">
+                    <xsl:for-each select="order">
+                        <redro>
+                            <lobmys>
+                                <xsl:value-of select="symbol" />
+                            </lobmys>
+                            <DIreyub>
+                                <xsl:value-of select="buyerID" />
+                            </DIreyub>
+                            <ecirp>
+                                <xsl:value-of select="price" />
+                            </ecirp>
+                            <emulov>
+                                <xsl:value-of select="volume" />
+                            </emulov>
+                        </redro>
+                    </xsl:for-each>
+                </m:skcotSyub>
+            </soapenv:Body>
+        </soapenv:Envelope>
+    </xsl:template>
+
+    <xsl:template match="soapenv:Header"></xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/camel-performance/src/test/resources/log4j2.properties b/tests/camel-performance/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..8957aa0
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/log4j2.properties
@@ -0,0 +1,29 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-performance-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d %-5p %c{1}.%M - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d %-5p %c{1}.%M - %m%n
+rootLogger.level = WARN
+rootLogger.appenderRef.file.ref = file
+rootLogger.appenderRef.out.ref = out
diff --git a/tests/camel-performance/src/test/resources/store.jks b/tests/camel-performance/src/test/resources/store.jks
new file mode 100644
index 0000000..02d7c4e
Binary files /dev/null and b/tests/camel-performance/src/test/resources/store.jks differ
diff --git a/tests/camel-performance/src/test/resources/wsdl/CBRWSDL-consumer-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/CBRWSDL-consumer-embedded.wsdl
new file mode 100644
index 0000000..f61bfd0
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/CBRWSDL-consumer-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="CBRProxy">
+        <port name="CBREchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:8192/service/CBRProxy"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/CBRWSDL-provider-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/CBRWSDL-provider-embedded.wsdl
new file mode 100644
index 0000000..a6540d9
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/CBRWSDL-provider-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="CBREchoService">
+        <port name="CBREchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:9000/service/EchoService"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/HBRSoapWSDL-consumer-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/HBRSoapWSDL-consumer-embedded.wsdl
new file mode 100644
index 0000000..72d23cd
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/HBRSoapWSDL-consumer-embedded.wsdl
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+    </xsd:schema>
+        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+                    targetNamespace="http://someuri"
+                    xmlns:tns="http://someuri"
+                    elementFormDefault="unqualified">
+            <xsd:element name="routing" type="xsd:string"></xsd:element>
+        </xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="request_header" element="some:routing" xmlns:some="http://someuri"/>
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:header use="literal" message="tns:EchoOperationRequest" part="request_header" required="true"/>
+                <soap:body use="literal" parts="parameters"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:header use="literal" message="tns:EchoOperationRequest" part="request_header" required="true"/>
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:header use="literal" message="tns:EchoOperationRequest" part="request_header" required="true"/>
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:header use="literal" message="tns:EchoOperationRequest" part="request_header" required="true"/>
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:header use="literal" message="tns:EchoOperationRequest" part="request_header" required="true"/>
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:header use="literal" message="tns:EchoOperationRequest" part="request_header" required="true"/>
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="CBRSOAPHeaderProxy">
+        <port name="CBRSOAPHeaderEchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:8192/service/CBRSOAPHeaderProxy"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/HBRSoapWSDL-provider-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/HBRSoapWSDL-provider-embedded.wsdl
new file mode 100644
index 0000000..e2392f0
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/HBRSoapWSDL-provider-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="HBRSoapEchoService">
+        <port name="HBRSoapEchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:9001/service/EchoService"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/HBRTransportWSDL-consumer-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/HBRTransportWSDL-consumer-embedded.wsdl
new file mode 100644
index 0000000..4ece9fb
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/HBRTransportWSDL-consumer-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="CBRTransportHeaderProxy">
+        <port name="CBRTransportHeaderEchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:8192/service/CBRTransportHeaderProxy"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/HBRTransportWSDL-provider-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/HBRTransportWSDL-provider-embedded.wsdl
new file mode 100644
index 0000000..ee03250
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/HBRTransportWSDL-provider-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="HBRTransportEchoService">
+        <port name="HBRTransportEchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:9000/service/EchoService"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/ProxyWSDL-consumer-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/ProxyWSDL-consumer-embedded.wsdl
new file mode 100644
index 0000000..bb5bee0
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/ProxyWSDL-consumer-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="DirectProxy">
+        <port name="EchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:8192/service/DirectProxy"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/ProxyWSDL-provider-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/ProxyWSDL-provider-embedded.wsdl
new file mode 100644
index 0000000..7a62555
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/ProxyWSDL-provider-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="ProxyEchoService">
+        <port name="EchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:9000/service/EchoService"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/SecureProxyWSDL-consumer-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/SecureProxyWSDL-consumer-embedded.wsdl
new file mode 100644
index 0000000..5b34f98
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/SecureProxyWSDL-consumer-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="SecureProxy">
+        <port name="EchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:8192/service/SecureProxy"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/SecureProxyWSDL-provider-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/SecureProxyWSDL-provider-embedded.wsdl
new file mode 100644
index 0000000..57b8fa4
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/SecureProxyWSDL-provider-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="SecureEchoService">
+        <port name="EchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:9000/service/EchoService"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/TransformerWSDL-consumer-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/TransformerWSDL-consumer-embedded.wsdl
new file mode 100644
index 0000000..2591b6f
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/TransformerWSDL-consumer-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="XSLTProxy">
+        <port name="EchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:8192/service/XSLTProxy"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wsdl/TransformerWSDL-provider-embedded.wsdl b/tests/camel-performance/src/test/resources/wsdl/TransformerWSDL-provider-embedded.wsdl
new file mode 100644
index 0000000..6b9b3a1
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wsdl/TransformerWSDL-provider-embedded.wsdl
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions name="EchoWSDL" targetNamespace="http://services.samples/xsd"
+             xmlns="http://schemas.xmlsoap.org/wsdl/"
+             xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://services.samples/xsd"
+             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
+    <types>
+	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+		    targetNamespace="http://services.samples/xsd"
+		    xmlns:tns="http://services.samples/xsd"
+		    elementFormDefault="unqualified">
+	    <xsd:complexType name="BuyStocks">
+		<xsd:sequence>
+		    <xsd:element name="order">
+		        <xsd:complexType>
+		            <xsd:sequence>
+		                <xsd:element name="symbol" type="xsd:string"></xsd:element>
+		                <xsd:element name="buyerID" type="xsd:string"></xsd:element>
+		                <xsd:element name="price" type="xsd:double"></xsd:element>
+		                <xsd:element name="volume" type="xsd:int"></xsd:element>
+		            </xsd:sequence>
+		        </xsd:complexType>
+		    </xsd:element>
+		</xsd:sequence>
+	    </xsd:complexType>
+	    <xsd:element name="buyStocks" type="tns:BuyStocks"></xsd:element>
+	</xsd:schema>
+    </types>
+    <message name="EchoOperationRequest">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+    <message name="EchoOperationResponse">
+        <part name="parameters" element="tns:buyStocks"/>
+    </message>
+
+    <portType name="buyStocksPortType">
+        <operation name="buyStocksOperation">
+            <input name="message" message="tns:EchoOperationRequest"/>
+            <output name="message" message="tns:EchoOperationResponse"/>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <input name="message1K" message="tns:EchoOperationRequest"/>
+            <output name="message1K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <input name="message5K" message="tns:EchoOperationRequest"/>
+            <output name="message5K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <input name="message10K" message="tns:EchoOperationRequest"/>
+            <output name="message10K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <input name="message100K" message="tns:EchoOperationRequest"/>
+            <output name="message100K" message="tns:EchoOperationResponse"/>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <input name="message500K" message="tns:EchoOperationRequest"/>
+            <output name="message500K" message="tns:EchoOperationResponse"/>
+        </operation>
+    </portType>
+    <binding name="EchoServiceSOAP11Binding" type="tns:buyStocksPortType">
+        <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
+        <operation name="buyStocksOperation">
+            <soap:operation soapAction="urn:buyStocks" style="document"/>
+            <input name="message">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+
+        <operation name="buyStocksOperation1K">
+            <soap:operation soapAction="urn:buyStocks.2" style="document"/>
+            <input name="message1K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message1K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation5K">
+            <soap:operation soapAction="urn:buyStocks.5" style="document"/>
+            <input name="message5K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message5K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation10K">
+            <soap:operation soapAction="urn:buyStocks.10" style="document"/>
+            <input name="message10K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message10K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation100K">
+            <soap:operation soapAction="urn:buyStocks.100" style="document"/>
+            <input name="message100K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message100K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+        <operation name="buyStocksOperation500K">
+            <soap:operation soapAction="urn:buyStocks.500" style="document"/>
+            <input name="message500K">
+                <soap:body use="literal"/>
+            </input>
+            <output name="message500K">
+                <soap:body use="literal"/>
+            </output>
+        </operation>
+    </binding>
+    <service name="XSLTEchoService">
+        <port name="EchoServicePort" binding="tns:EchoServiceSOAP11Binding">
+            <soap:address location="http://localhost:9000/service/EchoService"/>
+        </port>
+    </service>
+</definitions>
+
diff --git a/tests/camel-performance/src/test/resources/wssecurity.properties b/tests/camel-performance/src/test/resources/wssecurity.properties
new file mode 100644
index 0000000..68196c1
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/wssecurity.properties
@@ -0,0 +1,21 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+org.apache.ws.security.crypto.provider=org.apache.ws.security.components.crypto.Merlin
+org.apache.ws.security.crypto.merlin.keystore.type=jks
+org.apache.ws.security.crypto.merlin.keystore.password=password
+org.apache.ws.security.crypto.merlin.file=store.jks
+timeToLive=6307200000
\ No newline at end of file
diff --git a/tests/camel-performance/src/test/resources/xslt/transform.xslt b/tests/camel-performance/src/test/resources/xslt/transform.xslt
new file mode 100644
index 0000000..cbd3ebf
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/xslt/transform.xslt
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet version="2.0"
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:m0="http://services.samples/xsd"
+    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+    
+    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" exclude-result-prefixes="m0" />
+
+    <xsl:template match="m0:buyStocks">
+        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+            <soapenv:Body>
+                <m:skcotSyub xmlns:m="http://services.samples/xsd">
+                    <xsl:for-each select="order">
+                        <redro>
+                            <lobmys>
+                                <xsl:value-of select="symbol" />
+                            </lobmys>
+                            <DIreyub>
+                                <xsl:value-of select="buyerID" />
+                            </DIreyub>
+                            <ecirp>
+                                <xsl:value-of select="price" />
+                            </ecirp>
+                            <emulov>
+                                <xsl:value-of select="volume" />
+                            </emulov>
+                        </redro>
+                    </xsl:for-each>
+                </m:skcotSyub>
+            </soapenv:Body>
+        </soapenv:Envelope>
+    </xsl:template>
+
+    <xsl:template match="soapenv:Header"></xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/camel-performance/src/test/resources/xslt/transform_back.xslt b/tests/camel-performance/src/test/resources/xslt/transform_back.xslt
new file mode 100644
index 0000000..04ea451
--- /dev/null
+++ b/tests/camel-performance/src/test/resources/xslt/transform_back.xslt
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet version="2.0"
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:m0="http://services.samples/xsd">
+    
+    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" exclude-result-prefixes="m0" />
+
+    <xsl:template match="m0:skcotSyub">
+        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+            <soapenv:Body>
+                <m:buyStocks xmlns:m="http://services.samples/xsd">
+                    <xsl:for-each select="redro">
+                        <order>
+                            <symbol>
+                                <xsl:value-of select="lobmys" />
+                            </symbol>
+                            <buyerID>
+                                <xsl:value-of select="DIreyub" />
+                            </buyerID>
+                            <price>
+                                <xsl:value-of select="ecirp" />
+                            </price>
+                            <volume>
+                                <xsl:value-of select="emulov" />
+                            </volume>
+                        </order>
+                    </xsl:for-each>
+                </m:buyStocks>
+            </soapenv:Body>
+        </soapenv:Envelope>
+    </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/pom.xml b/tests/pom.xml
index a5e25db..4f56de4 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -36,6 +36,7 @@
 
     <modules>
         <module>camel-jmh</module>
+        <module>camel-performance</module>
     </modules>
 
 </project>

[camel-performance-tests] 01/16: Initial camel performance

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit 4d788c3716103d2d26f2c1b00791a5b8250a62b6
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed Mar 10 13:22:56 2021 +0100

    Initial camel performance
---
 .gitignore                                         |  27 +++
 pom.xml                                            | 190 +++++++++++++++++++++
 profiling/pom.xml                                  |  41 +++++
 profiling/timer-log/pom.xml                        |  94 ++++++++++
 .../org/apache/camel/example/MyApplication.java    |  38 +++++
 .../org/apache/camel/example/MyRouteBuilder.java   |  37 ++++
 .../src/main/resources/application.properties      |  32 ++++
 profiling/timer-log/src/main/resources/logback.xml |  30 ++++
 .../target/classes/application.properties          |  32 ++++
 profiling/timer-log/target/classes/logback.xml     |  30 ++++
 10 files changed, 551 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5d69a55
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,27 @@
+target
+*.iml
+*.ipr
+*.iws
+.idea
+.DS_Store
+.classpath
+.ekstazi
+.project
+.settings
+.checkstyle
+*.log
+test-salesforce-login.properties
+dependency-reduced-pom.xml
+id_file
+components/camel-solr/data
+*.epoch
+.factorypath
+.pmd
+.sts4-cache
+log-camel-lsp.out
+.vscode
+*.code-workspace
+components/camel-cxf/activemq-data
+*.swp
+.flattened-pom.xml
+.java-version
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..8bc7869
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,190 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+
+    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.
+
+--><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-dependencies</artifactId>
+        <version>3.9.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.camel.tests</groupId>
+    <artifactId>camel-tests-parent</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <name>Camel Performance :: Parent</name>
+    <packaging>pom</packaging>
+    <description>Performance tests for Camel</description>
+    <url>https://camel.apache.org</url>
+
+    <developers>
+        <developer>
+            <name>The Apache Camel Team</name>
+            <email>dev@camel.apache.org</email>
+            <url>https://camel.apache.org</url>
+            <organization>Apache Software Foundation</organization>
+            <organizationUrl>http://apache.org/</organizationUrl>
+        </developer>
+    </developers>
+
+    <mailingLists>
+        <mailingList>
+            <name>Development List</name>
+            <subscribe>dev-subscribe@camel.apache.org</subscribe>
+            <unsubscribe>dev-unsubscribe@camel.apache.org</unsubscribe>
+            <post>dev@camel.apache.org</post>
+        </mailingList>
+        <mailingList>
+            <name>User List</name>
+            <subscribe>users-subscribe@camel.apache.org</subscribe>
+            <unsubscribe>users-unsubscribe@camel.apache.org</unsubscribe>
+            <post>users@camel.apache.org</post>
+        </mailingList>
+        <mailingList>
+            <name>Commits List</name>
+            <subscribe>commits-subscribe@camel.apache.org</subscribe>
+            <unsubscribe>commits-unsubscribe@camel.apache.org</unsubscribe>
+            <post>commits@camel.apache.org</post>
+        </mailingList>
+    </mailingLists>
+
+    <issueManagement>
+        <system>jira</system>
+        <url>https://issues.apache.org/jira/browse/CAMEL</url>
+    </issueManagement>
+
+    <distributionManagement>
+        <site>
+            <id>apache.website</id>
+            <url>${site-repo-url}</url>
+        </site>
+    </distributionManagement>
+
+    <modules>
+        <module>profiling</module>
+    </modules>
+
+    <properties>
+        <!-- unify the encoding for all the modules -->
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+        <site-repo-url>scpexe://people.apache.org/www/camel.apache.org/maven/</site-repo-url>
+        <jdk.version>1.8</jdk.version>
+        <compiler.fork>false</compiler.fork>
+
+        <camel.version>3.9.0-SNAPSHOT</camel.version>
+
+        <!-- Versions -->
+        <maven-compiler-plugin-version>3.8.1</maven-compiler-plugin-version>
+        <maven-surefire-plugin-version>3.0.0-M4</maven-surefire-plugin-version>
+        <maven-javadoc-plugin-version>3.0.1</maven-javadoc-plugin-version>
+        <exec-maven-plugin-version>1.6.0</exec-maven-plugin-version>
+        <surefire.version>${maven-surefire-plugin-version}</surefire.version>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>apache.snapshots</id>
+            <url>https://repository.apache.org/snapshots/</url>
+            <name>Apache Snapshot Repo</name>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+        </repository>
+    </repositories>
+    <pluginRepositories>
+        <pluginRepository>
+            <id>apache.snapshots</id>
+            <url>https://repository.apache.org/snapshots/</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+        </pluginRepository>
+    </pluginRepositories>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <forkCount>1</forkCount>
+                    <reuseForks>false</reuseForks>
+                    <systemPropertyVariables>
+                        <skipStartingCamelContext>${skip.starting.camel.context}</skipStartingCamelContext>
+                    </systemPropertyVariables>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin-version}</version>
+                <configuration>
+                    <source>${jdk.version}</source>
+                    <target>${jdk.version}</target>
+                    <maxmem>512M</maxmem>
+                    <fork>${compiler.fork}</fork>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-remote-resources-plugin</artifactId>
+                    <executions>
+                        <execution>
+                            <id>process-resource-bundles</id>
+                            <phase>disabled</phase>
+                        </execution>
+                    </executions>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>exec-maven-plugin</artifactId>
+                    <version>${exec-maven-plugin-version}</version>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>
diff --git a/profiling/pom.xml b/profiling/pom.xml
new file mode 100644
index 0000000..3ad9536
--- /dev/null
+++ b/profiling/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel.tests</groupId>
+        <artifactId>camel-tests-parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>profiling</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <name>Camel Performance :: Profiling</name>
+
+    <modules>
+        <module>timer-log</module>
+    </modules>
+
+</project>
diff --git a/profiling/timer-log/pom.xml b/profiling/timer-log/pom.xml
new file mode 100644
index 0000000..4ae27ef
--- /dev/null
+++ b/profiling/timer-log/pom.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <parent>
+        <groupId>org.apache.camel.tests</groupId>
+        <artifactId>profiling</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>timer-log</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <name>Camel Performance :: Profiling :: Timer Log</name>
+    <description>A little example to profile Camel routing engine</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- Add Camel BOM -->
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-bom</artifactId>
+                <version>${camel.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-main</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-timer</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-log</artifactId>
+        </dependency>
+
+        <!-- logging -->
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <version>${logback-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <version>${logback-version}</version>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <!-- to run the application -->
+            <plugin>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-maven-plugin</artifactId>
+                <version>${camel.version}</version>
+                <configuration>
+                    <mainClass>org.apache.camel.example.MyApplication</mainClass>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/profiling/timer-log/src/main/java/org/apache/camel/example/MyApplication.java b/profiling/timer-log/src/main/java/org/apache/camel/example/MyApplication.java
new file mode 100644
index 0000000..496b37d
--- /dev/null
+++ b/profiling/timer-log/src/main/java/org/apache/camel/example/MyApplication.java
@@ -0,0 +1,38 @@
+/*
+ * 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.example;
+
+import org.apache.camel.main.Main;
+
+/**
+ * Main class that boot the Camel application
+ */
+public final class MyApplication {
+
+    private MyApplication() {
+    }
+
+    public static void main(String[] args) throws Exception {
+        // use Camels Main class
+        Main main = new Main();
+        // and add the routes (you can specify multiple classes)
+        main.configure().addRoutesBuilder(MyRouteBuilder.class);
+        // now keep the application running until the JVM is terminated (ctrl + c or sigterm)
+        main.run(args);
+    }
+
+}
diff --git a/profiling/timer-log/src/main/java/org/apache/camel/example/MyRouteBuilder.java b/profiling/timer-log/src/main/java/org/apache/camel/example/MyRouteBuilder.java
new file mode 100644
index 0000000..fbe0965
--- /dev/null
+++ b/profiling/timer-log/src/main/java/org/apache/camel/example/MyRouteBuilder.java
@@ -0,0 +1,37 @@
+/*
+ * 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.example;
+
+import org.apache.camel.builder.RouteBuilder;
+
+public class MyRouteBuilder extends RouteBuilder {
+
+    @Override
+    public void configure() throws Exception {
+        from("timer:foo?delay=10s&period={{myPeriod}}&includeMetadata=false")
+            .to("log:out0?level=OFF")
+            .to("log:out1?level=OFF")
+            .to("log:out2?level=OFF")
+            .to("log:out3?level=OFF")
+            .to("log:out4?level=OFF")
+            .to("log:out5?level=OFF")
+            .to("log:out6?level=OFF")
+            .to("log:out7?level=OFF")
+            .to("log:out8?level=OFF")
+            .to("log:out9?level=OFF");
+    }
+}
diff --git a/profiling/timer-log/src/main/resources/application.properties b/profiling/timer-log/src/main/resources/application.properties
new file mode 100644
index 0000000..c7d93cf
--- /dev/null
+++ b/profiling/timer-log/src/main/resources/application.properties
@@ -0,0 +1,32 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+# to configure camel main
+# here you can configure options on camel main (see MainConfigurationProperties class)
+camel.main.name = MyTinyCamel
+
+# run in lightweight mode to be tiny as possible
+camel.main.lightweight = true
+
+camel.main.exchange-factory = pooled
+camel.main.exchange-factory-capacity = 25
+camel.main.exchange-factory-statistics-enabled = true
+
+camel.main.duration-max-seconds = 130
+
+# properties used in the route
+myPeriod = 1
diff --git a/profiling/timer-log/src/main/resources/logback.xml b/profiling/timer-log/src/main/resources/logback.xml
new file mode 100644
index 0000000..a798d0b
--- /dev/null
+++ b/profiling/timer-log/src/main/resources/logback.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<configuration>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="STDOUT" />
+    </root>
+</configuration>
diff --git a/profiling/timer-log/target/classes/application.properties b/profiling/timer-log/target/classes/application.properties
new file mode 100644
index 0000000..c7d93cf
--- /dev/null
+++ b/profiling/timer-log/target/classes/application.properties
@@ -0,0 +1,32 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+# to configure camel main
+# here you can configure options on camel main (see MainConfigurationProperties class)
+camel.main.name = MyTinyCamel
+
+# run in lightweight mode to be tiny as possible
+camel.main.lightweight = true
+
+camel.main.exchange-factory = pooled
+camel.main.exchange-factory-capacity = 25
+camel.main.exchange-factory-statistics-enabled = true
+
+camel.main.duration-max-seconds = 130
+
+# properties used in the route
+myPeriod = 1
diff --git a/profiling/timer-log/target/classes/logback.xml b/profiling/timer-log/target/classes/logback.xml
new file mode 100644
index 0000000..a798d0b
--- /dev/null
+++ b/profiling/timer-log/target/classes/logback.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<configuration>
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="INFO">
+        <appender-ref ref="STDOUT" />
+    </root>
+</configuration>

[camel-performance-tests] 09/16: CAMEL-16251 - Move Performance and jmh itests in a separated repository

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit a3595b849fd1d3b97956ef3cd7661dea07b16a03
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Mar 10 16:02:32 2021 +0100

    CAMEL-16251 - Move Performance and jmh itests in a separated repository
---
 tests/camel-jmh/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/camel-jmh/pom.xml b/tests/camel-jmh/pom.xml
index bf88a71..2b87eba 100644
--- a/tests/camel-jmh/pom.xml
+++ b/tests/camel-jmh/pom.xml
@@ -29,7 +29,7 @@
     </parent>
 
     <artifactId>camel-jmh</artifactId>
-    <name>Camel :: Integration Tests :: JMH</name>
+    <name>Camel Performance :: Tests :: JMH</name>
     <description>Performs JMH performance tests</description>
 
     <dependencyManagement>

[camel-performance-tests] 06/16: Kafka-S3 Example: Renamed the docker image

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit 91ae935c4639926e4e77ef798f0555c44b8c8de2
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Mar 10 15:31:11 2021 +0100

    Kafka-S3 Example: Renamed the docker image
---
 profiling/kafka-s3/README.md | 4 ++--
 profiling/kafka-s3/pom.xml   | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/profiling/kafka-s3/README.md b/profiling/kafka-s3/README.md
index 29026c8..ef82fdc 100644
--- a/profiling/kafka-s3/README.md
+++ b/profiling/kafka-s3/README.md
@@ -13,7 +13,7 @@ docker run --rm -ti \
     -e AWS_ACCESS_KEY=<access_key> \
     -e AWS_SECRET_KEY=<secret_key> \
     --network="host" \
-    quay.io/oscerd/camel-k-runtime-example-kafka-s3:1.6.0-jvm
+    quay.io/camel/kafka-s3:1.0-SNAPSHOT-jvm
 ```
 
 You'll need a running Kafka broker locally on your host.
@@ -29,7 +29,7 @@ docker run --rm -ti \
     -e AWS_ACCESS_KEY=<access_key> \
     -e AWS_SECRET_KEY=<secret_key> \
     --network="host" \
-    quay.io/oscerd/camel-k-runtime-example-kafka-s3:1.6.0-jvm
+    quay.io/camel/kafka-s3:1.0-SNAPSHOT-jvm
 ```
 
 You'll need a running Kafka broker locally on your host.
diff --git a/profiling/kafka-s3/pom.xml b/profiling/kafka-s3/pom.xml
index 232fe05..55c6bb2 100644
--- a/profiling/kafka-s3/pom.xml
+++ b/profiling/kafka-s3/pom.xml
@@ -46,7 +46,7 @@
 
         <quarkus.version>1.11.1.Final</quarkus.version>
         <quarkus.container-image.build>true</quarkus.container-image.build>
-        <quarkus.container-image.group>quay.io/oscerd</quarkus.container-image.group>
+        <quarkus.container-image.group>quay.io/camel</quarkus.container-image.group>
         <quarkus.container-image.name>${project.artifactId}</quarkus.container-image.name>
 
         <camel-k-runtime.version>1.7.0-SNAPSHOT</camel-k-runtime.version>

[camel-performance-tests] 08/16: CAMEL-16251 - Move Performance and jmh itests in a separated repository

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit 42b1442cbafbf5eb064f2505a1b006fcc4d19764
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Mar 10 15:58:43 2021 +0100

    CAMEL-16251 - Move Performance and jmh itests in a separated repository
---
 pom.xml                                            |   1 +
 tests/camel-jmh/pom.xml                            | 142 ++++++++++++++
 .../camel/itest/jmh/CSimpleOperatorTest.java       | 131 +++++++++++++
 .../org/apache/camel/itest/jmh/CSimpleScript1.java |  47 +++++
 .../org/apache/camel/itest/jmh/CSimpleScript2.java |  47 +++++
 .../org/apache/camel/itest/jmh/CSimpleScript3.java |  47 +++++
 .../camel/itest/jmh/CaseInsensitiveMapTest.java    | 212 +++++++++++++++++++++
 .../camel/itest/jmh/ContainsIgnoreCaseTest.java    |  85 +++++++++
 .../camel/itest/jmh/DefaultUuidGeneratorTest.java  |  84 ++++++++
 .../camel/itest/jmh/DirectConcurrentTest.java      | 120 ++++++++++++
 .../camel/itest/jmh/FastTypeConverterTest.java     | 108 +++++++++++
 .../java/org/apache/camel/itest/jmh/JoorTest.java  | 154 +++++++++++++++
 .../camel/itest/jmh/LoadTypeConvertersTest.java    | 124 ++++++++++++
 .../apache/camel/itest/jmh/LogEndpointTest.java    | 102 ++++++++++
 .../apache/camel/itest/jmh/NormalizeUriTest.java   | 139 ++++++++++++++
 .../camel/itest/jmh/SimpleExpressionTest.java      | 112 +++++++++++
 .../camel/itest/jmh/SimpleMockPlaceholderTest.java | 117 ++++++++++++
 .../org/apache/camel/itest/jmh/SimpleMockTest.java | 110 +++++++++++
 .../apache/camel/itest/jmh/SimpleOperatorTest.java | 131 +++++++++++++
 .../camel/itest/jmh/SlowTypeConverterTest.java     | 106 +++++++++++
 .../apache/camel/itest/jmh/TypeConverterTest.java  | 175 +++++++++++++++++
 .../src/test/resources/META-INF/LICENSE.txt        | 203 ++++++++++++++++++++
 .../src/test/resources/META-INF/NOTICE.txt         |  11 ++
 .../services/org/apache/camel/csimple.properties   |  20 ++
 .../camel-jmh/src/test/resources/log4j2.properties |  28 +++
 tests/camel-jmh/src/test/resources/sample_soap.xml |  33 ++++
 tests/pom.xml                                      |  41 ++++
 27 files changed, 2630 insertions(+)

diff --git a/pom.xml b/pom.xml
index 8bc7869..d74f995 100644
--- a/pom.xml
+++ b/pom.xml
@@ -78,6 +78,7 @@
     </distributionManagement>
 
     <modules>
+        <module>tests</module>
         <module>profiling</module>
     </modules>
 
diff --git a/tests/camel-jmh/pom.xml b/tests/camel-jmh/pom.xml
new file mode 100644
index 0000000..bf88a71
--- /dev/null
+++ b/tests/camel-jmh/pom.xml
@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel.tests</groupId>
+        <artifactId>tests</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>camel-jmh</artifactId>
+    <name>Camel :: Integration Tests :: JMH</name>
+    <description>Performs JMH performance tests</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <!-- Add Camel BOM -->
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-bom</artifactId>
+                <version>${camel.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-core</artifactId>
+            <version>${jmh-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.openjdk.jmh</groupId>
+            <artifactId>jmh-generator-annprocess</artifactId>
+            <version>${jmh-version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-headersmap</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-netty</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-joor</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <scope>test</scope>
+            <version>${junit-jupiter-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>${commons-lang3-version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- logging -->
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+             <version>${log4j2-version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>${maven-surefire-plugin-version}</version>
+                <configuration>
+                    <includes>
+                        <include>**/*XXX.java</include>
+                    </includes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <!-- to run tests: mvn test -P jmh -->
+    <profiles>
+        <profile>
+            <id>jmh</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <version>${maven-surefire-plugin-version}</version>
+                        <configuration>
+                            <forkedProcessTimeoutInSeconds>1800</forkedProcessTimeoutInSeconds>
+                            <includes>
+                                <include>**/*Test.java</include>
+                            </includes>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleOperatorTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleOperatorTest.java
new file mode 100644
index 0000000..3336052
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleOperatorTest.java
@@ -0,0 +1,131 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.Language;
+import org.apache.camel.support.DefaultExchange;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Tests a Compiled Compile Simple operator expression
+ */
+public class CSimpleOperatorTest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CSimpleOperatorTest.class);
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(10))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+        String expression = "${header.gold} == 123";
+        String expression2 = "${header.gold} > 123";
+        String expression3 = "${header.gold} < 123";
+        Exchange exchange;
+        Language csimple;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+            try {
+                camel.getTypeConverterRegistry().getStatistics().setStatisticsEnabled(true);
+                camel.start();
+                exchange = new DefaultExchange(camel);
+                exchange.getIn().setBody("World");
+                exchange.getIn().setHeader("gold", "123");
+                csimple = camel.resolveLanguage("csimple");
+
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                LOG.info("" + camel.getTypeConverterRegistry().getStatistics());
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void csimplePredicate(BenchmarkState state, Blackhole bh) {
+        boolean out = state.csimple.createPredicate(state.expression).matches(state.exchange);
+        if (!out) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out);
+        boolean out2 = state.csimple.createPredicate(state.expression2).matches(state.exchange);
+        if (out2) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out2);
+        boolean out3 = state.csimple.createPredicate(state.expression3).matches(state.exchange);
+        if (out3) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out3);
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript1.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript1.java
new file mode 100644
index 0000000..a94d7d5
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript1.java
@@ -0,0 +1,47 @@
+/*
+ * 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.itest.jmh;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.language.csimple.CSimpleSupport;
+
+import static org.apache.camel.language.csimple.CSimpleHelper.headerAs;
+
+public class CSimpleScript1 extends CSimpleSupport {
+
+    public CSimpleScript1() {
+    }
+
+    @Override
+    public String getText() {
+        return "${header.gold} == 123";
+    }
+
+    @Override
+    public Object evaluate(CamelContext context, Exchange exchange, Message message, Object body)
+            throws Exception {
+        return headerAs(message, "gold", int.class) == 123;
+    }
+
+    @Override
+    public boolean isPredicate() {
+        return true;
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript2.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript2.java
new file mode 100644
index 0000000..b5f8312
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript2.java
@@ -0,0 +1,47 @@
+/*
+ * 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.itest.jmh;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.language.csimple.CSimpleSupport;
+
+import static org.apache.camel.language.csimple.CSimpleHelper.headerAs;
+
+public class CSimpleScript2 extends CSimpleSupport {
+
+    public CSimpleScript2() {
+    }
+
+    @Override
+    public String getText() {
+        return "${header.gold} > 123";
+    }
+
+    @Override
+    public Object evaluate(CamelContext context, Exchange exchange, Message message, Object body)
+            throws Exception {
+        return headerAs(message, "gold", int.class) > 123;
+    }
+
+    @Override
+    public boolean isPredicate() {
+        return true;
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript3.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript3.java
new file mode 100644
index 0000000..64c6ec5
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CSimpleScript3.java
@@ -0,0 +1,47 @@
+/*
+ * 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.itest.jmh;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.language.csimple.CSimpleSupport;
+
+import static org.apache.camel.language.csimple.CSimpleHelper.headerAs;
+
+public class CSimpleScript3 extends CSimpleSupport {
+
+    public CSimpleScript3() {
+    }
+
+    @Override
+    public String getText() {
+        return "${header.gold} < 123";
+    }
+
+    @Override
+    public Object evaluate(CamelContext context, Exchange exchange, Message message, Object body)
+            throws Exception {
+        return headerAs(message, "gold", int.class) < 123;
+    }
+
+    @Override
+    public boolean isPredicate() {
+        return true;
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CaseInsensitiveMapTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CaseInsensitiveMapTest.java
new file mode 100644
index 0000000..42c4fde
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/CaseInsensitiveMapTest.java
@@ -0,0 +1,212 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+
+/**
+ * Tests {@link CaseInsensitiveMap}
+ */
+public class CaseInsensitiveMapTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.SampleTime)
+                .timeUnit(TimeUnit.MILLISECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(5))
+                .measurementIterations(5)
+                .threads(1)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .measurementBatchSize(1000000)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class MapsBenchmarkState {
+        CaseInsensitiveMap camelMap;
+        com.cedarsoftware.util.CaseInsensitiveMap cedarsoftMap;
+        HashMap hashMap;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camelMap = new CaseInsensitiveMap();
+            cedarsoftMap = new com.cedarsoftware.util.CaseInsensitiveMap();
+            hashMap = new HashMap();
+        }
+
+    }
+
+    @State(Scope.Benchmark)
+    public static class MapsSourceDataBenchmarkState {
+        Map<String, Object> map1 = generateRandomMap(10);
+        Map<String, Object> map2 = generateRandomMap(10);
+
+        private Map<String, Object> generateRandomMap(int size) {
+            return IntStream.range(0, size)
+                    .boxed()
+                    .collect(Collectors.toMap(i -> randomAlphabetic(10), i -> randomAlphabetic(10)));
+        }
+    }
+
+    @Benchmark
+    public void camelMapSimpleCase(MapsBenchmarkState state, Blackhole bh) {
+        Map map = state.camelMap;
+
+        map.put("foo", "Hello World");
+        Object o1 = map.get("foo");
+        bh.consume(o1);
+        Object o2 = map.get("FOO");
+        bh.consume(o2);
+
+        map.put("BAR", "Bye World");
+        Object o3 = map.get("bar");
+        bh.consume(o3);
+        Object o4 = map.get("BAR");
+        bh.consume(o4);
+    }
+
+    @Benchmark
+    public void cedarsoftMapSimpleCase(MapsBenchmarkState state, Blackhole bh) {
+        Map map = state.cedarsoftMap;
+
+        map.put("foo", "Hello World");
+        Object o1 = map.get("foo");
+        bh.consume(o1);
+        Object o2 = map.get("FOO");
+        bh.consume(o2);
+
+        map.put("BAR", "Bye World");
+        Object o3 = map.get("bar");
+        bh.consume(o3);
+        Object o4 = map.get("BAR");
+        bh.consume(o4);
+    }
+
+    @Benchmark
+    public void hashMapSimpleCase(MapsBenchmarkState state, Blackhole bh) {
+        Map map = state.hashMap;
+
+        map.put("foo", "Hello World");
+        Object o1 = map.get("foo");
+        bh.consume(o1);
+        Object o2 = map.get("FOO");
+        bh.consume(o2);
+
+        map.put("BAR", "Bye World");
+        Object o3 = map.get("bar");
+        bh.consume(o3);
+        Object o4 = map.get("BAR");
+        bh.consume(o4);
+    }
+
+    @Benchmark
+    public void camelMapComplexCase(
+            MapsBenchmarkState mapsBenchmarkState, MapsSourceDataBenchmarkState sourceDataState, Blackhole blackhole) {
+        // step 1 - initialize map with existing elements
+        Map map = mapsBenchmarkState.camelMap;
+
+        // step 2 - add elements one by one
+        sourceDataState.map2.entrySet().forEach(entry -> blackhole.consume(map.put(entry.getKey(), entry.getValue())));
+
+        // step 3 - remove elements one by one
+        sourceDataState.map1.keySet().forEach(key -> blackhole.consume(map.get(key)));
+
+        // step 4 - remove elements one by one
+        sourceDataState.map1.keySet().forEach(key -> blackhole.consume(map.remove(key)));
+
+        // step 5 - add couple of element at once
+        map.putAll(sourceDataState.map1);
+
+        blackhole.consume(map);
+    }
+
+    @Benchmark
+    public void cedarsoftMapComplexCase(
+            MapsBenchmarkState mapsBenchmarkState, MapsSourceDataBenchmarkState sourceDataState, Blackhole blackhole) {
+        // step 1 - initialize map with existing elements
+        Map map = mapsBenchmarkState.cedarsoftMap;
+
+        // step 2 - add elements one by one
+        sourceDataState.map2.entrySet().forEach(entry -> blackhole.consume(map.put(entry.getKey(), entry.getValue())));
+
+        // step 3 - remove elements one by one
+        sourceDataState.map1.keySet().forEach(key -> blackhole.consume(map.get(key)));
+
+        // step 4 - remove elements one by one
+        sourceDataState.map1.keySet().forEach(key -> blackhole.consume(map.remove(key)));
+
+        // step 5 - add couple of element at once
+        map.putAll(sourceDataState.map1);
+
+        blackhole.consume(map);
+    }
+
+    @Benchmark
+    public void hashMapComplexCase(
+            MapsBenchmarkState mapsBenchmarkState, MapsSourceDataBenchmarkState sourceDataState, Blackhole blackhole) {
+        // step 1 - initialize map with existing elements
+        Map map = mapsBenchmarkState.hashMap;
+
+        // step 2 - add elements one by one
+        sourceDataState.map2.entrySet().forEach(entry -> blackhole.consume(map.put(entry.getKey(), entry.getValue())));
+
+        // step 3 - remove elements one by one
+        sourceDataState.map1.keySet().forEach(key -> blackhole.consume(map.get(key)));
+
+        // step 4 - remove elements one by one
+        sourceDataState.map1.keySet().forEach(key -> blackhole.consume(map.remove(key)));
+
+        // step 5 - add couple of element at once
+        map.putAll(sourceDataState.map1);
+
+        blackhole.consume(map);
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/ContainsIgnoreCaseTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/ContainsIgnoreCaseTest.java
new file mode 100644
index 0000000..e8849cc
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/ContainsIgnoreCaseTest.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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.util.StringHelper;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests the {@link StringHelper}.
+ * <p/>
+ * Thanks to this SO answer: https://stackoverflow.com/questions/30485856/how-to-run-jmh-from-inside-junit-tests
+ */
+public class ContainsIgnoreCaseTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(1))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        @Setup(Level.Trial)
+        public void initialize() {
+        }
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000000)
+    public void benchmark(BenchmarkState state, Blackhole bh) {
+        bh.consume(StringHelper.containsIgnoreCase("abc", "A"));
+        bh.consume(StringHelper.containsIgnoreCase("abc", "aB"));
+        bh.consume(StringHelper.containsIgnoreCase("abc", "aBc"));
+        bh.consume(StringHelper.containsIgnoreCase("abc", "ad"));
+        bh.consume(StringHelper.containsIgnoreCase("abc", "abD"));
+        bh.consume(StringHelper.containsIgnoreCase("abc", "ABD"));
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DefaultUuidGeneratorTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DefaultUuidGeneratorTest.java
new file mode 100644
index 0000000..381d222
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DefaultUuidGeneratorTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.support.DefaultUuidGenerator;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests the {@link DefaultUuidGenerator}.
+ * <p/>
+ * Thanks to this SO answer: https://stackoverflow.com/questions/30485856/how-to-run-jmh-from-inside-junit-tests
+ */
+public class DefaultUuidGeneratorTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(1))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        DefaultUuidGenerator uuid;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            uuid = new DefaultUuidGenerator();
+        }
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000000)
+    public void benchmark(BenchmarkState state, Blackhole bh) {
+        String id = state.uuid.generateUuid();
+        bh.consume(id);
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DirectConcurrentTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DirectConcurrentTest.java
new file mode 100644
index 0000000..97c1b06
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DirectConcurrentTest.java
@@ -0,0 +1,120 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+/**
+ * Tests a simple Camel route
+ */
+public class DirectConcurrentTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.AverageTime)
+                .timeUnit(TimeUnit.MILLISECONDS)
+                .warmupIterations(1)
+                .measurementIterations(5)
+                .threads(4)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+        ProducerTemplate producer;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+            try {
+                camel.addRoutes(new RouteBuilder() {
+                    @Override
+                    public void configure() throws Exception {
+                        from("direct:start")
+                                .to("direct:a")
+                                .to("direct:b")
+                                .to("direct:c")
+                                .to("mock:result?retainFirst=0");
+
+                        from("direct:a")
+                                .to("log:a?level=OFF");
+
+                        from("direct:b")
+                                .to("log:b?level=OFF");
+
+                        from("direct:c")
+                                .to("log:c?level=OFF");
+                    }
+                });
+                camel.start();
+                producer = camel.createProducerTemplate();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                producer.stop();
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+    }
+
+    @Benchmark
+    public void directConcurrentTest(BenchmarkState state, Blackhole bh) {
+        ProducerTemplate template = state.producer;
+        for (int i = 0; i < 50000; i++) {
+            template.sendBody("direct:start", "Hello " + i);
+        }
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/FastTypeConverterTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/FastTypeConverterTest.java
new file mode 100644
index 0000000..ff0ca6d
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/FastTypeConverterTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.itest.jmh;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests the fast {@link org.apache.camel.TypeConverter} which uses the code generated loader
+ */
+public class FastTypeConverterTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.SampleTime)
+                .timeUnit(TimeUnit.MILLISECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(5))
+                .measurementIterations(3)
+                .threads(1)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .measurementBatchSize(100000)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkCamelContextState {
+        ByteBuf buffer;
+        byte[] bytes = "Hello World this is some text".getBytes();
+
+        CamelContext camel;
+
+        @Setup(Level.Trial)
+        public void initialize() throws IOException {
+            camel = new DefaultCamelContext();
+            try {
+                // dont scan for additional type converters
+                camel.setLoadTypeConverters(false);
+                camel.start();
+            } catch (Exception e) {
+                // ignore
+            }
+
+            buffer = ByteBufAllocator.DEFAULT.buffer(bytes.length);
+            buffer.writeBytes(bytes);
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+    }
+
+    @Benchmark
+    public void typeConvertByteBufToArray(BenchmarkCamelContextState state, Blackhole bh) {
+        byte[] arr = state.camel.getTypeConverter().convertTo(byte[].class, state.buffer);
+        bh.consume(arr);
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/JoorTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/JoorTest.java
new file mode 100644
index 0000000..d0f78b0
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/JoorTest.java
@@ -0,0 +1,154 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.Predicate;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.Language;
+import org.apache.camel.support.DefaultExchange;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JoorTest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(JoorTest.class);
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(10))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    public static class MyUser {
+
+        private int age = 44;
+        private String name = "tony";
+
+        public int getAge() {
+            return age;
+        }
+
+        public void setAge(int age) {
+            this.age = age;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+        Exchange exchange;
+        String joorCode
+                = "var user = message.getBody(org.apache.camel.itest.jmh.JoorTest.MyUser.class); return user.getName() != null && user.getAge() > 20;";
+        String simpleCode = "${body.name} != null && ${body.age} > 20";
+        Predicate joorPredicate;
+        Predicate simplePredicate;
+        Language joor;
+        Language simple;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+            try {
+                camel.start();
+                exchange = new DefaultExchange(camel);
+                exchange.getIn().setBody(new MyUser());
+                exchange.getIn().setHeader("gold", "123");
+                joor = camel.resolveLanguage("joor");
+                joorPredicate = joor.createPredicate(joorCode);
+                simple = camel.resolveLanguage("simple");
+                simplePredicate = simple.createPredicate(simpleCode);
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void joorPredicate(BenchmarkState state, Blackhole bh) {
+        boolean out = state.joorPredicate.matches(state.exchange);
+        if (!out) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out);
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void simplePredicate(BenchmarkState state, Blackhole bh) {
+        boolean out = state.simplePredicate.matches(state.exchange);
+        if (!out) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out);
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/LoadTypeConvertersTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/LoadTypeConvertersTest.java
new file mode 100644
index 0000000..6bd6504
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/LoadTypeConvertersTest.java
@@ -0,0 +1,124 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests loading type converters from classpath scanning.
+ */
+public class LoadTypeConvertersTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(1))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    /**
+     * Setup a fresh CamelContext per invocation
+     */
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+
+        @Setup(Level.Invocation)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+        }
+
+        @TearDown(Level.Invocation)
+        public void close() {
+            try {
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void load(BenchmarkState state, Blackhole bh) {
+        int size = 0;
+        try {
+            state.camel.start();
+
+            size = state.camel.getTypeConverterRegistry().size();
+            bh.consume(size);
+        } catch (Exception e) {
+            // ignore
+        }
+
+        if (size < 200) {
+            throw new IllegalArgumentException("Should have 200+ type converters loaded");
+        }
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void notLoad(BenchmarkState state, Blackhole bh) {
+        int size = 0;
+        try {
+            state.camel.setLoadTypeConverters(false);
+            state.camel.start();
+
+            size = state.camel.getTypeConverterRegistry().size();
+            bh.consume(size);
+        } catch (Exception e) {
+            // ignore
+        }
+
+        if (size > 200) {
+            throw new IllegalArgumentException("Should not load additional type converters from classpath");
+        }
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/LogEndpointTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/LogEndpointTest.java
new file mode 100644
index 0000000..c80f9a3
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/LogEndpointTest.java
@@ -0,0 +1,102 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests fast property binding on endpoints
+ */
+public class LogEndpointTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(1))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+        AtomicInteger counter;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+            camel.getGlobalOptions().put(Exchange.MAXIMUM_ENDPOINT_CACHE_SIZE, "1");
+            counter = new AtomicInteger();
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void logEndpoint(BenchmarkState state, Blackhole bh) {
+        // use the legacy binding which uses reflection
+        // Endpoint out = state.camel.getEndpoint("log:foo?basicPropertyBinding=true&showAll=true&groupSize=" + state.counter.incrementAndGet());
+        Endpoint out = state.camel.getEndpoint("log:foo?showAll=true&groupSize=" + state.counter.incrementAndGet());
+        bh.consume(out);
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/NormalizeUriTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/NormalizeUriTest.java
new file mode 100644
index 0000000..610b763
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/NormalizeUriTest.java
@@ -0,0 +1,139 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.util.URISupport;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests the {@link org.apache.camel.util.URISupport#normalizeUri(String)}.
+ * <p/>
+ * Thanks to this SO answer: https://stackoverflow.com/questions/30485856/how-to-run-jmh-from-inside-junit-tests
+ */
+public class NormalizeUriTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(1))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(false)
+                .measurementBatchSize(100000)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        @Setup(Level.Trial)
+        public void initialize() {
+        }
+    }
+
+    @Benchmark
+    public void benchmarkMixed(ContainsIgnoreCaseTest.BenchmarkState state, Blackhole bh) throws Exception {
+        // fast
+        bh.consume(URISupport.normalizeUri("log:foo?level=INFO&logMask=false&exchangeFormatter=#myFormatter"));
+        // slow
+        bh.consume(URISupport.normalizeUri("http://www.google.com?q=S%C3%B8ren%20Hansen"));
+        // fast
+        bh.consume(URISupport.normalizeUri("file:target/inbox?recursive=true"));
+        // slow
+        bh.consume(URISupport.normalizeUri("http://www.google.com?q=S%C3%B8ren%20Hansen"));
+        // fast
+        bh.consume(URISupport.normalizeUri("seda:foo?concurrentConsumer=2"));
+        // slow
+        bh.consume(URISupport.normalizeUri("ftp://us%40r:t%25st@localhost:21000/tmp3/camel?foo=us@r"));
+        // fast
+        bh.consume(URISupport.normalizeUri("http:www.google.com?q=Camel"));
+        // slow
+        bh.consume(URISupport.normalizeUri("ftp://us@r:t%25st@localhost:21000/tmp3/camel?foo=us@r"));
+    }
+
+    @Benchmark
+    public void benchmarkFast(ContainsIgnoreCaseTest.BenchmarkState state, Blackhole bh) throws Exception {
+        bh.consume(URISupport.normalizeUri("log:foo"));
+        bh.consume(URISupport.normalizeUri("log:foo?level=INFO&logMask=false&exchangeFormatter=#myFormatter"));
+        bh.consume(URISupport.normalizeUri("file:target/inbox?recursive=true"));
+        bh.consume(URISupport.normalizeUri("smtp://localhost?password=secret&username=davsclaus"));
+        bh.consume(URISupport.normalizeUri("seda:foo?concurrentConsumer=2"));
+        bh.consume(URISupport.normalizeUri("irc:someserver/#camel?user=davsclaus"));
+        bh.consume(URISupport.normalizeUri("http:www.google.com?q=Camel"));
+        bh.consume(URISupport.normalizeUri("smtp://localhost?to=foo&to=bar&from=me&from=you"));
+    }
+
+    @Benchmark
+    public void benchmarkFastSorted(ContainsIgnoreCaseTest.BenchmarkState state, Blackhole bh) throws Exception {
+        bh.consume(URISupport.normalizeUri("log:foo"));
+        bh.consume(URISupport.normalizeUri("log:foo?exchangeFormatter=#myFormatter&level=INFO&logMask=false"));
+        bh.consume(URISupport.normalizeUri("file:target/inbox?recursive=true"));
+        bh.consume(URISupport.normalizeUri("smtp://localhost?username=davsclaus&password=secret"));
+        bh.consume(URISupport.normalizeUri("seda:foo?concurrentConsumer=2"));
+        bh.consume(URISupport.normalizeUri("irc:someserver/#camel?user=davsclaus"));
+        bh.consume(URISupport.normalizeUri("http:www.google.com?q=Camel"));
+        bh.consume(URISupport.normalizeUri("smtp://localhost?&from=me&from=you&to=foo&to=bar"));
+    }
+
+    @Benchmark
+    public void benchmarkSlow(ContainsIgnoreCaseTest.BenchmarkState state, Blackhole bh) throws Exception {
+        bh.consume(URISupport.normalizeUri("http://www.google.com?q=S%C3%B8ren%20Hansen"));
+        bh.consume(URISupport.normalizeUri("ftp://us%40r:t%st@localhost:21000/tmp3/camel?foo=us@r"));
+        bh.consume(URISupport.normalizeUri("ftp://us%40r:t%25st@localhost:21000/tmp3/camel?foo=us@r"));
+        bh.consume(URISupport.normalizeUri("ftp://us@r:t%st@localhost:21000/tmp3/camel?foo=us@r"));
+        bh.consume(URISupport.normalizeUri("ftp://us@r:t%25st@localhost:21000/tmp3/camel?foo=us@r"));
+        bh.consume(URISupport
+                .normalizeUri("xmpp://camel-user@localhost:123/test-user@localhost?password=secret&serviceName=someCoolChat"));
+        bh.consume(URISupport.normalizeUri(
+                "xmpp://camel-user@localhost:123/test-user@localhost?password=RAW(++?w0rd)&serviceName=some chat"));
+        bh.consume(URISupport.normalizeUri(
+                "xmpp://camel-user@localhost:123/test-user@localhost?password=RAW(foo %% bar)&serviceName=some chat"));
+    }
+
+    @Benchmark
+    public void sorting(ContainsIgnoreCaseTest.BenchmarkState state, Blackhole bh) throws Exception {
+        bh.consume(URISupport
+                .normalizeUri("log:foo?zzz=123&xxx=222&hhh=444&aaa=tru&d=yes&cc=no&Camel=awesome&foo.hey=bar&foo.bar=blah"));
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleExpressionTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleExpressionTest.java
new file mode 100644
index 0000000..c44781d
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleExpressionTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.Language;
+import org.apache.camel.support.DefaultExchange;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests a Simple expression
+ */
+public class SimpleExpressionTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(10))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+        String expression = "Hello ${body}";
+        Exchange exchange;
+        Language simple;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+            try {
+                camel.start();
+                exchange = new DefaultExchange(camel);
+                exchange.getIn().setBody("World");
+                simple = camel.resolveLanguage("simple");
+
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void simpleExpression(BenchmarkState state, Blackhole bh) {
+        String out = state.simple.createExpression(state.expression).evaluate(state.exchange, String.class);
+        if (!out.equals("Hello World")) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out);
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleMockPlaceholderTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleMockPlaceholderTest.java
new file mode 100644
index 0000000..bf5e624
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleMockPlaceholderTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests a simple Camel route
+ */
+public class SimpleMockPlaceholderTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(1))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+        ProducerTemplate producer;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+
+            Properties prop = new Properties();
+            prop.put("foolish", "log:foo?groupSize=10");
+            prop.put("mymock", "mock:result?retainFirst=0");
+            camel.getPropertiesComponent().setInitialProperties(prop);
+
+            try {
+                camel.addRoutes(new RouteBuilder() {
+                    @Override
+                    public void configure() throws Exception {
+                        from("direct:start").to("{{foolish}}").to("log:bar").to("{{mymock}}");
+                    }
+                });
+                camel.start();
+                producer = camel.createProducerTemplate();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                producer.stop();
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void simpleMockPlaceholderTest(BenchmarkState state, Blackhole bh) {
+        ProducerTemplate template = state.producer;
+        template.sendBody("direct:start", "Hello World");
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleMockTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleMockTest.java
new file mode 100644
index 0000000..dcae207
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleMockTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests a simple Camel route
+ */
+public class SimpleMockTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(1))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+        ProducerTemplate producer;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+            try {
+                camel.addRoutes(new RouteBuilder() {
+                    @Override
+                    public void configure() throws Exception {
+                        from("direct:start").to("log:foo").to("log:bar").to("mock:result?retainFirst=0");
+                    }
+                });
+                camel.start();
+                producer = camel.createProducerTemplate();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                producer.stop();
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void simpleMockTest(BenchmarkState state, Blackhole bh) {
+        ProducerTemplate template = state.producer;
+        template.sendBody("direct:start", "Hello World");
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleOperatorTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleOperatorTest.java
new file mode 100644
index 0000000..fc00074
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SimpleOperatorTest.java
@@ -0,0 +1,131 @@
+/*
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.Language;
+import org.apache.camel.support.DefaultExchange;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Tests a Simple operator expression
+ */
+public class SimpleOperatorTest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(SimpleOperatorTest.class);
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.All)
+                .timeUnit(TimeUnit.MICROSECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(10))
+                .measurementIterations(2)
+                .threads(2)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+        String expression = "${header.gold} == 123";
+        String expression2 = "${header.gold} > 123";
+        String expression3 = "${header.gold} < 123";
+        Exchange exchange;
+        Language simple;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+            try {
+                camel.getTypeConverterRegistry().getStatistics().setStatisticsEnabled(true);
+                camel.start();
+                exchange = new DefaultExchange(camel);
+                exchange.getIn().setBody("World");
+                exchange.getIn().setHeader("gold", "123");
+                simple = camel.resolveLanguage("simple");
+
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                LOG.info("" + camel.getTypeConverterRegistry().getStatistics());
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void simplePredicate(BenchmarkState state, Blackhole bh) {
+        boolean out = state.simple.createPredicate(state.expression).matches(state.exchange);
+        if (!out) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out);
+        boolean out2 = state.simple.createPredicate(state.expression2).matches(state.exchange);
+        if (out2) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out2);
+        boolean out3 = state.simple.createPredicate(state.expression3).matches(state.exchange);
+        if (out3) {
+            throw new IllegalArgumentException("Evaluation failed");
+        }
+        bh.consume(out3);
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SlowTypeConverterTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SlowTypeConverterTest.java
new file mode 100644
index 0000000..a044263
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/SlowTypeConverterTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.itest.jmh;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufAllocator;
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests the default slow {@link org.apache.camel.TypeConverter} which uses method call reflection
+ */
+public class SlowTypeConverterTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.SampleTime)
+                .timeUnit(TimeUnit.MILLISECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(5))
+                .measurementIterations(3)
+                .threads(1)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .measurementBatchSize(100000)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkCamelContextState {
+        ByteBuf buffer;
+        byte[] bytes = "Hello World this is some text".getBytes();
+
+        CamelContext camel;
+
+        @Setup(Level.Trial)
+        public void initialize() throws IOException {
+            camel = new DefaultCamelContext();
+            try {
+                camel.start();
+            } catch (Exception e) {
+                // ignore
+            }
+
+            buffer = ByteBufAllocator.DEFAULT.buffer(bytes.length);
+            buffer.writeBytes(bytes);
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+    }
+
+    @Benchmark
+    public void typeConvertByteBufToArray(BenchmarkCamelContextState state, Blackhole bh) {
+        byte[] arr = state.camel.getTypeConverter().convertTo(byte[].class, state.buffer);
+        bh.consume(arr);
+    }
+
+}
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/TypeConverterTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/TypeConverterTest.java
new file mode 100644
index 0000000..35a5101
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/TypeConverterTest.java
@@ -0,0 +1,175 @@
+/*
+ * 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.itest.jmh;
+
+import java.io.ByteArrayInputStream;
+import java.io.CharArrayReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.TimeUnit;
+
+import org.w3c.dom.Document;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.util.IOHelper;
+import org.junit.jupiter.api.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests {@link org.apache.camel.TypeConverter}
+ */
+public class TypeConverterTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+                // Specify which benchmarks to run.
+                // You can be more specific if you'd like to run only one benchmark per test.
+                .include(this.getClass().getName() + ".*")
+                // Set the following options as needed
+                .mode(Mode.Throughput)
+                .timeUnit(TimeUnit.MILLISECONDS)
+                .warmupTime(TimeValue.seconds(1))
+                .warmupIterations(2)
+                .measurementTime(TimeValue.seconds(5))
+                .measurementIterations(3)
+                .threads(1)
+                .forks(1)
+                .shouldFailOnError(true)
+                .shouldDoGC(true)
+                .measurementBatchSize(1000)
+                .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkCamelContextState {
+        Integer someInteger = 12345;
+        String someIntegerString = String.valueOf(someInteger);
+        ByteArrayInputStream bos;
+        String xmlAsString;
+        byte[] xmlAsBytes;
+        char[] xmlAsCharArray;
+
+        CamelContext camel;
+
+        @Setup(Level.Trial)
+        public void initialize() throws IOException {
+            camel = new DefaultCamelContext();
+            try {
+                camel.start();
+            } catch (Exception e) {
+                // ignore
+            }
+
+            xmlAsString = IOHelper.loadText(getClass().getClassLoader().getResourceAsStream("sample_soap.xml"));
+            xmlAsBytes = xmlAsString.getBytes(StandardCharsets.UTF_8);
+            xmlAsCharArray = xmlAsString.toCharArray();
+            bos = new ByteArrayInputStream(xmlAsBytes);
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+    }
+
+    @Benchmark
+    public void typeConvertIntegerToString(BenchmarkCamelContextState state, Blackhole bh) {
+        String string = state.camel.getTypeConverter().convertTo(String.class, state.someInteger);
+        bh.consume(string);
+    }
+
+    @Benchmark
+    public void typeConvertStringToInteger(BenchmarkCamelContextState state, Blackhole bh) {
+        Integer integer = state.camel.getTypeConverter().convertTo(Integer.class, state.someIntegerString);
+        bh.consume(integer);
+    }
+
+    @Benchmark
+    public void typeConvertTheSameTypes(BenchmarkCamelContextState state, Blackhole bh) {
+        String string = state.camel.getTypeConverter().convertTo(String.class, state.someIntegerString);
+        bh.consume(string);
+    }
+
+    @Benchmark
+    public void typeConvertInputStreamToString(BenchmarkCamelContextState state, Blackhole bh) {
+        state.bos.reset();
+        String string = state.camel.getTypeConverter().convertTo(String.class, state.bos);
+        bh.consume(string);
+    }
+
+    @Benchmark
+    public void typeConvertStringToInputStream(BenchmarkCamelContextState state, Blackhole bh) {
+        InputStream inputStream = state.camel.getTypeConverter().convertTo(InputStream.class, state.xmlAsString);
+        bh.consume(inputStream);
+    }
+
+    @Benchmark
+    public void typeConvertStringToDocument(BenchmarkCamelContextState state, Blackhole bh) {
+        Document document = state.camel.getTypeConverter().convertTo(Document.class, state.xmlAsString);
+        bh.consume(document);
+    }
+
+    @Benchmark
+    public void typeConvertStringToByteArray(BenchmarkCamelContextState state, Blackhole bh) {
+        byte[] bytes = state.camel.getTypeConverter().convertTo(byte[].class, state.xmlAsString);
+        bh.consume(bytes);
+    }
+
+    @Benchmark
+    public void typeConvertByteArrayToString(BenchmarkCamelContextState state, Blackhole bh) {
+        String string = state.camel.getTypeConverter().convertTo(String.class, state.xmlAsBytes);
+        bh.consume(string);
+    }
+
+    @Benchmark
+    public void typeConvertStringToEnum(BenchmarkCamelContextState state, Blackhole bh) {
+        LoggingLevel level = state.camel.getTypeConverter().convertTo(LoggingLevel.class, "WARN");
+        bh.consume(level);
+    }
+
+    @Benchmark
+    public void typeConvertReaderToByteArray(BenchmarkCamelContextState state, Blackhole bh) {
+        Reader reader = new CharArrayReader(state.xmlAsCharArray);
+        byte[] arr = state.camel.getTypeConverter().convertTo(byte[].class, reader);
+        bh.consume(arr);
+        bh.consume(reader);
+    }
+}
diff --git a/tests/camel-jmh/src/test/resources/META-INF/LICENSE.txt b/tests/camel-jmh/src/test/resources/META-INF/LICENSE.txt
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/tests/camel-jmh/src/test/resources/META-INF/LICENSE.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
diff --git a/tests/camel-jmh/src/test/resources/META-INF/NOTICE.txt b/tests/camel-jmh/src/test/resources/META-INF/NOTICE.txt
new file mode 100644
index 0000000..2e215bf
--- /dev/null
+++ b/tests/camel-jmh/src/test/resources/META-INF/NOTICE.txt
@@ -0,0 +1,11 @@
+   =========================================================================
+   ==  NOTICE file corresponding to the section 4 d of                    ==
+   ==  the Apache License, Version 2.0,                                   ==
+   ==  in this case for the Apache Camel distribution.                    ==
+   =========================================================================
+
+   This product includes software developed by
+   The Apache Software Foundation (http://www.apache.org/).
+
+   Please read the different LICENSE files present in the licenses directory of
+   this distribution.
diff --git a/tests/camel-jmh/src/test/resources/META-INF/services/org/apache/camel/csimple.properties b/tests/camel-jmh/src/test/resources/META-INF/services/org/apache/camel/csimple.properties
new file mode 100644
index 0000000..fc8d8ef
--- /dev/null
+++ b/tests/camel-jmh/src/test/resources/META-INF/services/org/apache/camel/csimple.properties
@@ -0,0 +1,20 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+org.apache.camel.itest.jmh.CSimpleScript1
+org.apache.camel.itest.jmh.CSimpleScript2
+org.apache.camel.itest.jmh.CSimpleScript3
diff --git a/tests/camel-jmh/src/test/resources/log4j2.properties b/tests/camel-jmh/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..2ae0380
--- /dev/null
+++ b/tests/camel-jmh/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-jmh-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.stdout.type = Console
+appender.stdout.name = stdout
+appender.stdout.layout.type = PatternLayout
+appender.stdout.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/tests/camel-jmh/src/test/resources/sample_soap.xml b/tests/camel-jmh/src/test/resources/sample_soap.xml
new file mode 100644
index 0000000..6800482
--- /dev/null
+++ b/tests/camel-jmh/src/test/resources/sample_soap.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+    <soapenv:Header><routing xmlns="http://someuri">xadmin;server1;community#1.0##</routing></soapenv:Header>
+    <soapenv:Body>
+        <m:buyStocks xmlns:m="http://services.samples/xsd">
+            <order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>
+            <order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>8030</volume></order>
+            <order><symbol>SUN</symbol><buyerID>indika</buyerID><price>14.56</price><volume>500</volume></order>
+            <order><symbol>GOOG</symbol><buyerID>chathura</buyerID><price>60.24</price><volume>40000</volume></order>
+            <order><symbol>IBM</symbol><buyerID>asankha</buyerID><price>140.34</price><volume>2000</volume></order>
+            <order><symbol>MSFT</symbol><buyerID>ruwan</buyerID><price>23.56</price><volume>803000</volume></order>
+            <order><symbol>SUN</symbol><buyerID>indika</buyerID><price>14.56</price><volume>5000</volume></order>
+        </m:buyStocks>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file
diff --git a/tests/pom.xml b/tests/pom.xml
new file mode 100644
index 0000000..a5e25db
--- /dev/null
+++ b/tests/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel.tests</groupId>
+        <artifactId>camel-tests-parent</artifactId>
+        <version>1.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>tests</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+    <name>Camel Performance :: Tests</name>
+
+    <modules>
+        <module>camel-jmh</module>
+    </modules>
+
+</project>

[camel-performance-tests] 07/16: Kafka to S3: Fixed title

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

dfoulks pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-performance-tests.git

commit 03e8fe86875342591377128aca25d8c8cdcdfadc
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Wed Mar 10 15:35:34 2021 +0100

    Kafka to S3: Fixed title
---
 profiling/kafka-s3/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/profiling/kafka-s3/README.md b/profiling/kafka-s3/README.md
index ef82fdc..4ccb146 100644
--- a/profiling/kafka-s3/README.md
+++ b/profiling/kafka-s3/README.md
@@ -1,4 +1,4 @@
-# camel-k-runtime-example-kafka-s3
+# Kafka to S3 with YAML and Camel-Quarkus
 
 build:
 ```shell script