diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorMultipleTypesProducerTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorMultipleTypesProducerTest.java
index 4d82cd3..efee2cc 100644
--- a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorMultipleTypesProducerTest.java
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorMultipleTypesProducerTest.java
@@ -25,6 +25,12 @@
 import org.openjdk.jmh.runner.options.Options;
 import org.openjdk.jmh.runner.options.OptionsBuilder;
 
+
+/**
+ * This tests the disruptor component when running with a small threads and exchanging data with different types. This is
+ * suitable for most cases when a large machine with too many cores is not available (as it limits to a maximum of 4 consumers
+ * + 4 producers).
+ */
 public class DisruptorMultipleTypesProducerTest {
 
     @Test
@@ -48,7 +54,7 @@
     // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
     @State(Scope.Benchmark)
     public static class BenchmarkState {
-        @Param({"1", "2", "4", "8", "16", "32"})
+        @Param({"1", "2", "4"})
         int consumers;
 
         CamelContext context;
@@ -78,7 +84,7 @@
         }
     }
 
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    @OutputTimeUnit(TimeUnit.MICROSECONDS)
     @BenchmarkMode(Mode.AverageTime)
     @Benchmark
     public void sendMultipleTypes_1(BenchmarkState state, Blackhole bh) {
@@ -88,7 +94,7 @@
         state.producerTemplate.sendBody(state.endpoint, state.sampleFile);
     }
 
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    @OutputTimeUnit(TimeUnit.MICROSECONDS)
     @BenchmarkMode(Mode.AverageTime)
     @Benchmark
     @Threads(2)
@@ -99,7 +105,7 @@
         state.producerTemplate.sendBody(state.endpoint, state.sampleFile);
     }
 
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    @OutputTimeUnit(TimeUnit.MICROSECONDS)
     @BenchmarkMode(Mode.AverageTime)
     @Benchmark
     @Threads(4)
@@ -109,38 +115,4 @@
         state.producerTemplate.sendBody(state.endpoint, state.someLong);
         state.producerTemplate.sendBody(state.endpoint, state.sampleFile);
     }
-
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
-    @BenchmarkMode(Mode.AverageTime)
-    @Benchmark
-    @Threads(8)
-    public void sendBlockingWithMultipleTypes_8(BenchmarkState state, Blackhole bh) {
-        state.producerTemplate.sendBody(state.endpoint, "test");
-        state.producerTemplate.sendBody(state.endpoint, state.someInt);
-        state.producerTemplate.sendBody(state.endpoint, state.someLong);
-        state.producerTemplate.sendBody(state.endpoint, state.sampleFile);
-    }
-
-
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
-    @BenchmarkMode(Mode.AverageTime)
-    @Benchmark
-    @Threads(16)
-    public void sendBlockingWithMultipleTypes_16(BenchmarkState state, Blackhole bh) {
-        state.producerTemplate.sendBody(state.endpoint, "test");
-        state.producerTemplate.sendBody(state.endpoint, state.someInt);
-        state.producerTemplate.sendBody(state.endpoint, state.someLong);
-        state.producerTemplate.sendBody(state.endpoint, state.sampleFile);
-    }
-
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
-    @BenchmarkMode(Mode.AverageTime)
-    @Benchmark
-    @Threads(32)
-    public void sendBlockingWithMultipleTypes_32(BenchmarkState state, Blackhole bh) {
-        state.producerTemplate.sendBody(state.endpoint, "test");
-        state.producerTemplate.sendBody(state.endpoint, state.someInt);
-        state.producerTemplate.sendBody(state.endpoint, state.someLong);
-        state.producerTemplate.sendBody(state.endpoint, state.sampleFile);
-    }
 }
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorProducerTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorProducerTest.java
index e13cbfb..2bc22ad 100644
--- a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorProducerTest.java
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorProducerTest.java
@@ -1,6 +1,5 @@
 package org.apache.camel.itest.jmh;
 
-import java.io.File;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.camel.CamelContext;
@@ -25,6 +24,10 @@
 import org.openjdk.jmh.runner.options.Options;
 import org.openjdk.jmh.runner.options.OptionsBuilder;
 
+/**
+ * This tests the disruptor component when running with a small threads. This is suitable for most cases when
+ * a large machine with too many cores is not available (as it limits to a maximum of 4 consumers + 4 producers).
+ */
 public class DisruptorProducerTest {
 
     @Test
@@ -48,7 +51,7 @@
     // http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
     @State(Scope.Benchmark)
     public static class BenchmarkState {
-        @Param({"1", "2", "4", "8", "16", "32"})
+        @Param({"1", "2", "4"})
         int consumers;
 
         CamelContext context;
@@ -74,14 +77,14 @@
         }
     }
 
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    @OutputTimeUnit(TimeUnit.MICROSECONDS)
     @BenchmarkMode(Mode.AverageTime)
     @Benchmark
     public void send_1(BenchmarkState state, Blackhole bh) {
         state.producerTemplate.sendBody(state.endpoint, "test");
     }
 
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    @OutputTimeUnit(TimeUnit.MICROSECONDS)
     @BenchmarkMode(Mode.AverageTime)
     @Benchmark
     @Threads(2)
@@ -90,35 +93,11 @@
     }
 
 
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    @OutputTimeUnit(TimeUnit.MICROSECONDS)
     @BenchmarkMode(Mode.AverageTime)
     @Benchmark
     @Threads(4)
     public void send_4(BenchmarkState state, Blackhole bh) {
         state.producerTemplate.sendBody(state.endpoint, "test");
     }
-
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
-    @BenchmarkMode(Mode.AverageTime)
-    @Benchmark
-    @Threads(8)
-    public void send_8(BenchmarkState state, Blackhole bh) {
-        state.producerTemplate.sendBody(state.endpoint, "test");
-    }
-
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
-    @BenchmarkMode(Mode.AverageTime)
-    @Benchmark
-    @Threads(16)
-    public void send_16(BenchmarkState state, Blackhole bh) {
-        state.producerTemplate.sendBody(state.endpoint, "test");
-    }
-
-    @OutputTimeUnit(TimeUnit.MILLISECONDS)
-    @BenchmarkMode(Mode.AverageTime)
-    @Benchmark
-    @Threads(32)
-    public void send_32(BenchmarkState state, Blackhole bh) {
-        state.producerTemplate.sendBody(state.endpoint, "test");
-    }
 }
diff --git a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorScalabilityProducerTest.java b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorScalabilityProducerTest.java
new file mode 100644
index 0000000..2840349
--- /dev/null
+++ b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/DisruptorScalabilityProducerTest.java
@@ -0,0 +1,104 @@
+package org.apache.camel.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+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.BenchmarkMode;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Threads;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.results.format.ResultFormatType;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+/**
+ * This tests the scalability of the disruptor component when running with many threads. You need a large machine for running
+ * this reliably: desktops and machines with a small number of cores may introduce excessive scheduler latency affecting the
+ * results.
+ */
+public class DisruptorScalabilityProducerTest {
+
+    @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
+                .measurementIterations(10)
+                .warmupIterations(5)
+                .forks(1)
+                .resultFormat(ResultFormatType.JSON)
+                .result(this.getClass().getSimpleName() + ".jmh.json")
+                .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.Benchmark)
+    public static class BenchmarkState {
+        @Param({"1", "8", "16", "32"})
+        int consumers;
+
+        CamelContext context;
+        ProducerTemplate producerTemplate;
+        Endpoint endpoint;
+
+        @Setup(Level.Trial)
+        public void initialize() throws Exception {
+            context = new DefaultCamelContext();
+
+            producerTemplate = context.createProducerTemplate();
+            endpoint = context.getEndpoint("disruptor:test");
+
+            context.addRoutes(new RouteBuilder() {
+                @Override
+                public void configure() {
+                    fromF("disruptor:test?concurrentConsumers=%s", consumers).to("log:?level=OFF");
+
+                }
+            });
+
+            context.start();
+        }
+    }
+
+    @OutputTimeUnit(TimeUnit.MICROSECONDS)
+    @BenchmarkMode(Mode.AverageTime)
+    @Benchmark
+    @Threads(8)
+    public void send_8(BenchmarkState state, Blackhole bh) {
+        state.producerTemplate.sendBody(state.endpoint, "test");
+    }
+
+    @OutputTimeUnit(TimeUnit.MICROSECONDS)
+    @BenchmarkMode(Mode.AverageTime)
+    @Benchmark
+    @Threads(16)
+    public void send_16(BenchmarkState state, Blackhole bh) {
+        state.producerTemplate.sendBody(state.endpoint, "test");
+    }
+
+    @OutputTimeUnit(TimeUnit.MICROSECONDS)
+    @BenchmarkMode(Mode.AverageTime)
+    @Benchmark
+    @Threads(32)
+    public void send_32(BenchmarkState state, Blackhole bh) {
+        state.producerTemplate.sendBody(state.endpoint, "test");
+    }
+}
