You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/02/06 12:04:59 UTC

[camel] 06/18: CAMEL-16102: Source code generate @InvokeOnHeader for reflection free

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

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

commit 9a72e1de2a27204cfe77a10596056bebc20ab366
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Feb 4 15:34:54 2021 +0100

    CAMEL-16102: Source code generate @InvokeOnHeader for reflection free
---
 .../AtomixMapProducerInvokeOnHeaderFactory.java    |  48 ++++++
 ...omixMessagingProducerInvokeOnHeaderFactory.java |  28 ++++
 ...tomixMultiMapProducerInvokeOnHeaderFactory.java |  40 +++++
 .../AtomixQueueProducerInvokeOnHeaderFactory.java  |  42 ++++++
 .../AtomixSetProducerInvokeOnHeaderFactory.java    |  36 +++++
 .../AtomixValueProducerInvokeOnHeaderFactory.java  |  32 ++++
 ...l.component.atomix.client.map.AtomixMapProducer |   2 +
 ...atomix.client.messaging.AtomixMessagingProducer |   2 +
 ...t.atomix.client.multimap.AtomixMultiMapProducer |   2 +
 ...mponent.atomix.client.queue.AtomixQueueProducer |   2 +
 ...l.component.atomix.client.set.AtomixSetProducer |   2 +
 ...mponent.atomix.client.value.AtomixValueProducer |   2 +
 .../atomix/AtomixAsyncMessageProcessor.java        |   8 +-
 .../client/AbstractAtomixClientProducer.java       |  51 +------
 ...CaffeineCacheProducerInvokeOnHeaderFactory.java |  38 +++++
 ...eineLoadCacheProducerInvokeOnHeaderFactory.java |  38 +++++
 ....component.caffeine.cache.CaffeineCacheProducer |   2 +
 ...mponent.caffeine.load.CaffeineLoadCacheProducer |   2 +
 ...ConsulCatalogProducerInvokeOnHeaderFactory.java |  38 +++++
 ...ulCoordinatesProducerInvokeOnHeaderFactory.java |  28 ++++
 .../ConsulEventProducerInvokeOnHeaderFactory.java  |  28 ++++
 .../ConsulHealthProducerInvokeOnHeaderFactory.java |  32 ++++
 ...onsulKeyValueProducerInvokeOnHeaderFactory.java |  42 ++++++
 ...PreparedQueryProducerInvokeOnHeaderFactory.java |  30 ++++
 ...ConsulSessionProducerInvokeOnHeaderFactory.java |  34 +++++
 ...component.consul.endpoint.ConsulCatalogProducer |   2 +
 ...onent.consul.endpoint.ConsulCoordinatesProducer |   2 +
 ...l.component.consul.endpoint.ConsulEventProducer |   2 +
 ....component.consul.endpoint.ConsulHealthProducer |   2 +
 ...omponent.consul.endpoint.ConsulKeyValueProducer |   2 +
 ...ent.consul.endpoint.ConsulPreparedQueryProducer |   2 +
 ...component.consul.endpoint.ConsulSessionProducer |   2 +
 .../corda/CordaProducerInvokeOnHeaderFactory.java  | 100 ++++++++++++
 .../org.apache.camel.component.corda.CordaProducer |   2 +
 .../EhcacheProducerInvokeOnHeaderFactory.java      |  42 ++++++
 ....apache.camel.component.ehcache.EhcacheProducer |   2 +
 ...spanEmbeddedProducerInvokeOnHeaderFactory.java} |  11 +-
 ....infinispan.embedded.InfinispanEmbeddedProducer |   2 +
 ...inispanRemoteProducerInvokeOnHeaderFactory.java |   3 +-
 .../web3j/Web3jProducerInvokeOnHeaderFactory.java  | 168 +++++++++++++++++++++
 .../org.apache.camel.component.web3j.Web3jProducer |   2 +
 .../java/org/apache/camel/spi/InvokeOnHeader.java  |  11 ++
 .../apache/camel/spi/InvokeOnHeaderStrategy.java   |   4 +-
 .../camel/support/HeaderSelectorProducer.java      |   2 +
 .../packaging/GenerateInvokeOnHeaderMojo.java      |  21 ++-
 45 files changed, 932 insertions(+), 61 deletions(-)

diff --git a/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/map/AtomixMapProducerInvokeOnHeaderFactory.java b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/map/AtomixMapProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..2b4beca
--- /dev/null
+++ b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/map/AtomixMapProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,48 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.atomix.client.map;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.atomix.client.map.AtomixMapProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class AtomixMapProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.atomix.client.map.AtomixMapProducer target = (org.apache.camel.component.atomix.client.map.AtomixMapProducer) obj;
+        switch (key) {
+        case "size":
+        case "SIZE": return target.onSize(exchange.getMessage(), callback);
+        case "entry_set":
+        case "ENTRY_SET": return target.onEntrySet(exchange.getMessage(), callback);
+        case "replace":
+        case "REPLACE": return target.onReplace(exchange.getMessage(), callback);
+        case "remove":
+        case "REMOVE": return target.onRemove(exchange.getMessage(), callback);
+        case "get":
+        case "GET": return target.onGet(exchange.getMessage(), callback);
+        case "put":
+        case "PUT": return target.onPut(exchange.getMessage(), callback);
+        case "contains_value":
+        case "CONTAINS_VALUE": return target.onContainsValue(exchange.getMessage(), callback);
+        case "values":
+        case "VALUES": return target.onValues(exchange.getMessage(), callback);
+        case "contains_key":
+        case "CONTAINS_KEY": return target.onContainsKey(exchange.getMessage(), callback);
+        case "clear":
+        case "CLEAR": return target.onClear(exchange.getMessage(), callback);
+        case "is_empty":
+        case "IS_EMPTY": return target.onIsEmpty(exchange.getMessage(), callback);
+        case "put_if_absent":
+        case "PUT_IF_ABSENT": return target.onPutIfAbsent(exchange.getMessage(), callback);
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/messaging/AtomixMessagingProducerInvokeOnHeaderFactory.java b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/messaging/AtomixMessagingProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..2065291
--- /dev/null
+++ b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/messaging/AtomixMessagingProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,28 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.atomix.client.messaging;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.atomix.client.messaging.AtomixMessagingProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class AtomixMessagingProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.atomix.client.messaging.AtomixMessagingProducer target = (org.apache.camel.component.atomix.client.messaging.AtomixMessagingProducer) obj;
+        switch (key) {
+        case "broadcast":
+        case "BROADCAST": return target.onBroadcast(exchange.getMessage(), callback);
+        case "direct":
+        case "DIRECT": return target.onDirect(exchange.getMessage(), callback);
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/multimap/AtomixMultiMapProducerInvokeOnHeaderFactory.java b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/multimap/AtomixMultiMapProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..b4d5979
--- /dev/null
+++ b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/multimap/AtomixMultiMapProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,40 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.atomix.client.multimap;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.atomix.client.multimap.AtomixMultiMapProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class AtomixMultiMapProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.atomix.client.multimap.AtomixMultiMapProducer target = (org.apache.camel.component.atomix.client.multimap.AtomixMultiMapProducer) obj;
+        switch (key) {
+        case "get":
+        case "GET": return target.onGet(exchange.getMessage(), callback);
+        case "remove":
+        case "REMOVE": return target.onRemove(exchange.getMessage(), callback);
+        case "is_empty":
+        case "IS_EMPTY": return target.onIsEmpty(exchange.getMessage(), callback);
+        case "contains_key":
+        case "CONTAINS_KEY": return target.onContainsKey(exchange.getMessage(), callback);
+        case "put":
+        case "PUT": return target.onPut(exchange.getMessage(), callback);
+        case "clear":
+        case "CLEAR": return target.onClear(exchange.getMessage(), callback);
+        case "size":
+        case "SIZE": return target.onSize(exchange.getMessage(), callback);
+        case "remove_value":
+        case "REMOVE_VALUE": return target.onRemoveValue(exchange.getMessage(), callback);
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/queue/AtomixQueueProducerInvokeOnHeaderFactory.java b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/queue/AtomixQueueProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..be270c7
--- /dev/null
+++ b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/queue/AtomixQueueProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,42 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.atomix.client.queue;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.atomix.client.queue.AtomixQueueProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class AtomixQueueProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.atomix.client.queue.AtomixQueueProducer target = (org.apache.camel.component.atomix.client.queue.AtomixQueueProducer) obj;
+        switch (key) {
+        case "clear":
+        case "CLEAR": return target.onClear(exchange.getMessage(), callback);
+        case "add":
+        case "ADD": return target.onAdd(exchange.getMessage(), callback);
+        case "contains":
+        case "CONTAINS": return target.onContains(exchange.getMessage(), callback);
+        case "peek":
+        case "PEEK": return target.onPeek(exchange.getMessage(), callback);
+        case "is_empty":
+        case "IS_EMPTY": return target.onIsEmpty(exchange.getMessage(), callback);
+        case "offer":
+        case "OFFER": return target.onOffer(exchange.getMessage(), callback);
+        case "poll":
+        case "POLL": return target.onPoll(exchange.getMessage(), callback);
+        case "remove":
+        case "REMOVE": return target.onRemove(exchange.getMessage(), callback);
+        case "size":
+        case "SIZE": return target.onSize(exchange.getMessage(), callback);
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/set/AtomixSetProducerInvokeOnHeaderFactory.java b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/set/AtomixSetProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..fd9669e
--- /dev/null
+++ b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/set/AtomixSetProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,36 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.atomix.client.set;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.atomix.client.set.AtomixSetProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class AtomixSetProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.atomix.client.set.AtomixSetProducer target = (org.apache.camel.component.atomix.client.set.AtomixSetProducer) obj;
+        switch (key) {
+        case "is_empty":
+        case "IS_EMPTY": return target.onIsEmpty(exchange.getMessage(), callback);
+        case "remove":
+        case "REMOVE": return target.onRemove(exchange.getMessage(), callback);
+        case "add":
+        case "ADD": return target.onAdd(exchange.getMessage(), callback);
+        case "clear":
+        case "CLEAR": return target.onClear(exchange.getMessage(), callback);
+        case "size":
+        case "SIZE": return target.onSize(exchange.getMessage(), callback);
+        case "contains":
+        case "CONTAINS": return target.onContains(exchange.getMessage(), callback);
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/value/AtomixValueProducerInvokeOnHeaderFactory.java b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/value/AtomixValueProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..4ae1809
--- /dev/null
+++ b/components/camel-atomix/src/generated/java/org/apache/camel/component/atomix/client/value/AtomixValueProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,32 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.atomix.client.value;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.atomix.client.value.AtomixValueProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class AtomixValueProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.atomix.client.value.AtomixValueProducer target = (org.apache.camel.component.atomix.client.value.AtomixValueProducer) obj;
+        switch (key) {
+        case "compare_and_set":
+        case "COMPARE_AND_SET": return target.onCompareAndSet(exchange.getMessage(), callback);
+        case "set":
+        case "SET": return target.onSet(exchange.getMessage(), callback);
+        case "get":
+        case "GET": return target.onGet(exchange.getMessage(), callback);
+        case "get_and_set":
+        case "GET_AND_SET": return target.onGetAndSet(exchange.getMessage(), callback);
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.map.AtomixMapProducer b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.map.AtomixMapProducer
new file mode 100644
index 0000000..457bff1
--- /dev/null
+++ b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.map.AtomixMapProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.atomix.client.map.AtomixMapProducer.AtomixMapProducerInvokeOnHeaderFactory
diff --git a/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.messaging.AtomixMessagingProducer b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.messaging.AtomixMessagingProducer
new file mode 100644
index 0000000..ab52975
--- /dev/null
+++ b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.messaging.AtomixMessagingProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.atomix.client.messaging.AtomixMessagingProducer.AtomixMessagingProducerInvokeOnHeaderFactory
diff --git a/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.multimap.AtomixMultiMapProducer b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.multimap.AtomixMultiMapProducer
new file mode 100644
index 0000000..0ffdfe3
--- /dev/null
+++ b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.multimap.AtomixMultiMapProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.atomix.client.multimap.AtomixMultiMapProducer.AtomixMultiMapProducerInvokeOnHeaderFactory
diff --git a/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.queue.AtomixQueueProducer b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.queue.AtomixQueueProducer
new file mode 100644
index 0000000..4c242db
--- /dev/null
+++ b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.queue.AtomixQueueProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.atomix.client.queue.AtomixQueueProducer.AtomixQueueProducerInvokeOnHeaderFactory
diff --git a/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.set.AtomixSetProducer b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.set.AtomixSetProducer
new file mode 100644
index 0000000..0c00cc8
--- /dev/null
+++ b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.set.AtomixSetProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.atomix.client.set.AtomixSetProducer.AtomixSetProducerInvokeOnHeaderFactory
diff --git a/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.value.AtomixValueProducer b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.value.AtomixValueProducer
new file mode 100644
index 0000000..0bbabf2
--- /dev/null
+++ b/components/camel-atomix/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.atomix.client.value.AtomixValueProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.atomix.client.value.AtomixValueProducer.AtomixValueProducerInvokeOnHeaderFactory
diff --git a/components/camel-atomix/src/main/java/org/apache/camel/component/atomix/AtomixAsyncMessageProcessor.java b/components/camel-atomix/src/main/java/org/apache/camel/component/atomix/AtomixAsyncMessageProcessor.java
index 3d25a9e..246ad32 100644
--- a/components/camel-atomix/src/main/java/org/apache/camel/component/atomix/AtomixAsyncMessageProcessor.java
+++ b/components/camel-atomix/src/main/java/org/apache/camel/component/atomix/AtomixAsyncMessageProcessor.java
@@ -21,11 +21,7 @@ import org.apache.camel.Message;
 
 @FunctionalInterface
 public interface AtomixAsyncMessageProcessor {
-    /**
-     * @param  message
-     * @param  callback
-     * @return
-     * @throws Exception
-     */
+
     boolean process(Message message, AsyncCallback callback) throws Exception;
+
 }
diff --git a/components/camel-atomix/src/main/java/org/apache/camel/component/atomix/client/AbstractAtomixClientProducer.java b/components/camel-atomix/src/main/java/org/apache/camel/component/atomix/client/AbstractAtomixClientProducer.java
index f11ada9..cfdfa42 100644
--- a/components/camel-atomix/src/main/java/org/apache/camel/component/atomix/client/AbstractAtomixClientProducer.java
+++ b/components/camel-atomix/src/main/java/org/apache/camel/component/atomix/client/AbstractAtomixClientProducer.java
@@ -16,7 +16,6 @@
  */
 package org.apache.camel.component.atomix.client;
 
-import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -26,9 +25,7 @@ import io.atomix.resource.Resource;
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
-import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.atomix.AtomixAsyncMessageProcessor;
-import org.apache.camel.spi.InvokeOnHeader;
 import org.apache.camel.support.DefaultAsyncProducer;
 import org.apache.camel.util.ObjectHelper;
 import org.slf4j.Logger;
@@ -36,7 +33,6 @@ import org.slf4j.LoggerFactory;
 
 import static org.apache.camel.component.atomix.client.AtomixClientConstants.RESOURCE_ACTION_HAS_RESULT;
 import static org.apache.camel.component.atomix.client.AtomixClientConstants.RESOURCE_NAME;
-import static org.apache.camel.support.ObjectHelper.invokeMethodSafe;
 
 public abstract class AbstractAtomixClientProducer<E extends AbstractAtomixClientEndpoint, R extends Resource>
         extends DefaultAsyncProducer {
@@ -54,20 +50,6 @@ public abstract class AbstractAtomixClientProducer<E extends AbstractAtomixClien
     }
 
     @Override
-    protected void doInit() throws Exception {
-        for (final Method method : getClass().getDeclaredMethods()) {
-            InvokeOnHeader[] annotations = method.getAnnotationsByType(InvokeOnHeader.class);
-            if (annotations != null && annotations.length > 0) {
-                for (InvokeOnHeader annotation : annotations) {
-                    bind(annotation, method);
-                }
-            }
-        }
-
-        super.doInit();
-    }
-
-    @Override
     public boolean process(Exchange exchange, AsyncCallback callback) {
         final Message message = exchange.getIn();
         final String key = getProcessorKey(message);
@@ -77,11 +59,14 @@ public abstract class AbstractAtomixClientProducer<E extends AbstractAtomixClien
             try {
                 return processor.process(message, callback);
             } catch (Exception e) {
-                throw new RuntimeCamelException(e);
+                exchange.setException(e);
             }
         } else {
-            throw new RuntimeCamelException("No handler for action " + key);
+            exchange.setException(new IllegalArgumentException("No handler for action " + key));
         }
+
+        callback.done(true);
+        return true;
     }
 
     // **********************************
@@ -124,30 +109,4 @@ public abstract class AbstractAtomixClientProducer<E extends AbstractAtomixClien
 
     protected abstract R createResource(String name);
 
-    // ************************************
-    // Binding helpers
-    // ************************************
-
-    private void bind(InvokeOnHeader annotation, final Method method) {
-        if (method.getParameterCount() == 2) {
-
-            if (!Message.class.isAssignableFrom(method.getParameterTypes()[0])) {
-                throw new IllegalArgumentException("First argument should be of type Message");
-            }
-            if (!AsyncCallback.class.isAssignableFrom(method.getParameterTypes()[1])) {
-                throw new IllegalArgumentException("Second argument should be of type AsyncCallback");
-            }
-
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("bind key={}, class={}, method={}",
-                        annotation.value(), this.getClass(), method.getName());
-            }
-
-            this.processors.put(annotation.value(), (m, c) -> (boolean) invokeMethodSafe(method, this, m, c));
-        } else {
-            throw new IllegalArgumentException(
-                    "Illegal number of parameters for method: " + method.getName() + ", required: 2, found: "
-                                               + method.getParameterCount());
-        }
-    }
 }
diff --git a/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/cache/CaffeineCacheProducerInvokeOnHeaderFactory.java b/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/cache/CaffeineCacheProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..000bb11
--- /dev/null
+++ b/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/cache/CaffeineCacheProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,38 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.caffeine.cache;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.caffeine.cache.CaffeineCacheProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class CaffeineCacheProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.caffeine.cache.CaffeineCacheProducer target = (org.apache.camel.component.caffeine.cache.CaffeineCacheProducer) obj;
+        switch (key) {
+        case "invalidate_all":
+        case "INVALIDATE_ALL": target.onInvalidateAll(exchange.getMessage()); return null;
+        case "put":
+        case "PUT": target.onPut(exchange.getMessage()); return null;
+        case "cleanup":
+        case "CLEANUP": target.onCleanUp(exchange.getMessage()); return null;
+        case "get":
+        case "GET": target.onGet(exchange.getMessage()); return null;
+        case "put_all":
+        case "PUT_ALL": target.onPutAll(exchange.getMessage()); return null;
+        case "get_all":
+        case "GET_ALL": target.onGetAll(exchange.getMessage()); return null;
+        case "invalidate":
+        case "INVALIDATE": target.onInvalidate(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/load/CaffeineLoadCacheProducerInvokeOnHeaderFactory.java b/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/load/CaffeineLoadCacheProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..88c8473
--- /dev/null
+++ b/components/camel-caffeine/src/generated/java/org/apache/camel/component/caffeine/load/CaffeineLoadCacheProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,38 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.caffeine.load;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.caffeine.load.CaffeineLoadCacheProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class CaffeineLoadCacheProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.caffeine.load.CaffeineLoadCacheProducer target = (org.apache.camel.component.caffeine.load.CaffeineLoadCacheProducer) obj;
+        switch (key) {
+        case "get_all":
+        case "GET_ALL": target.onGetAll(exchange.getMessage()); return null;
+        case "cleanup":
+        case "CLEANUP": target.onCleanUp(exchange.getMessage()); return null;
+        case "put":
+        case "PUT": target.onPut(exchange.getMessage()); return null;
+        case "invalidate_all":
+        case "INVALIDATE_ALL": target.onInvalidateAll(exchange.getMessage()); return null;
+        case "put_all":
+        case "PUT_ALL": target.onPutAll(exchange.getMessage()); return null;
+        case "get":
+        case "GET": target.onGet(exchange.getMessage()); return null;
+        case "invalidate":
+        case "INVALIDATE": target.onInvalidate(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.caffeine.cache.CaffeineCacheProducer b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.caffeine.cache.CaffeineCacheProducer
new file mode 100644
index 0000000..30a4448
--- /dev/null
+++ b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.caffeine.cache.CaffeineCacheProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.caffeine.cache.CaffeineCacheProducer.CaffeineCacheProducerInvokeOnHeaderFactory
diff --git a/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.caffeine.load.CaffeineLoadCacheProducer b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.caffeine.load.CaffeineLoadCacheProducer
new file mode 100644
index 0000000..3cf2b9e
--- /dev/null
+++ b/components/camel-caffeine/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.caffeine.load.CaffeineLoadCacheProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.caffeine.load.CaffeineLoadCacheProducer.CaffeineLoadCacheProducerInvokeOnHeaderFactory
diff --git a/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulCatalogProducerInvokeOnHeaderFactory.java b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulCatalogProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..d5821d2
--- /dev/null
+++ b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulCatalogProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,38 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.consul.endpoint;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.consul.endpoint.ConsulCatalogProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class ConsulCatalogProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.consul.endpoint.ConsulCatalogProducer target = (org.apache.camel.component.consul.endpoint.ConsulCatalogProducer) obj;
+        switch (key) {
+        case "get_service":
+        case "GET_SERVICE": target.getService(exchange.getMessage()); return null;
+        case "get_node":
+        case "GET_NODE": target.getNode(exchange.getMessage()); return null;
+        case "list_datacenters":
+        case "LIST_DATACENTERS": target.listDatacenters(exchange.getMessage()); return null;
+        case "list_nodes":
+        case "LIST_NODES": target.listNodes(exchange.getMessage()); return null;
+        case "register":
+        case "REGISTER": target.register(exchange.getMessage()); return null;
+        case "deregister":
+        case "DEREGISTER": target.deregister(exchange.getMessage()); return null;
+        case "list_services":
+        case "LIST_SERVICES": target.listServices(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulCoordinatesProducerInvokeOnHeaderFactory.java b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulCoordinatesProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..4bac375
--- /dev/null
+++ b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulCoordinatesProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,28 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.consul.endpoint;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.consul.endpoint.ConsulCoordinatesProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class ConsulCoordinatesProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.consul.endpoint.ConsulCoordinatesProducer target = (org.apache.camel.component.consul.endpoint.ConsulCoordinatesProducer) obj;
+        switch (key) {
+        case "nodes":
+        case "NODES": target.nodes(exchange.getMessage()); return null;
+        case "datacenters":
+        case "DATACENTERS": target.datacenters(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulEventProducerInvokeOnHeaderFactory.java b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulEventProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..04d6159
--- /dev/null
+++ b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulEventProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,28 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.consul.endpoint;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.consul.endpoint.ConsulEventProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class ConsulEventProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.consul.endpoint.ConsulEventProducer target = (org.apache.camel.component.consul.endpoint.ConsulEventProducer) obj;
+        switch (key) {
+        case "fire":
+        case "FIRE": target.fire(exchange.getMessage()); return null;
+        case "list":
+        case "LIST": target.list(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulHealthProducerInvokeOnHeaderFactory.java b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulHealthProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..8b65e37
--- /dev/null
+++ b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulHealthProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,32 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.consul.endpoint;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.consul.endpoint.ConsulHealthProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class ConsulHealthProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.consul.endpoint.ConsulHealthProducer target = (org.apache.camel.component.consul.endpoint.ConsulHealthProducer) obj;
+        switch (key) {
+        case "node_checks":
+        case "NODE_CHECKS": target.nodeChecks(exchange.getMessage()); return null;
+        case "checks":
+        case "CHECKS": target.checks(exchange.getMessage()); return null;
+        case "service_checks":
+        case "SERVICE_CHECKS": target.serviceChecks(exchange.getMessage()); return null;
+        case "service_instances":
+        case "SERVICE_INSTANCES": target.serviceInstances(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulKeyValueProducerInvokeOnHeaderFactory.java b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulKeyValueProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..7f5a8dd
--- /dev/null
+++ b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulKeyValueProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,42 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.consul.endpoint;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.consul.endpoint.ConsulKeyValueProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class ConsulKeyValueProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.consul.endpoint.ConsulKeyValueProducer target = (org.apache.camel.component.consul.endpoint.ConsulKeyValueProducer) obj;
+        switch (key) {
+        case "get_sessions":
+        case "GET_SESSIONS": target.getSessions(exchange.getMessage()); return null;
+        case "lock":
+        case "LOCK": target.lock(exchange.getMessage()); return null;
+        case "delete_key":
+        case "DELETE_KEY": target.deleteKey(exchange.getMessage()); return null;
+        case "get_value":
+        case "GET_VALUE": target.getValue(exchange.getMessage()); return null;
+        case "delete_keys":
+        case "DELETE_KEYS": target.deleteKeys(exchange.getMessage()); return null;
+        case "get_values":
+        case "GET_VALUES": target.getValues(exchange.getMessage()); return null;
+        case "put":
+        case "PUT": target.put(exchange.getMessage()); return null;
+        case "get_keys":
+        case "GET_KEYS": target.getKeys(exchange.getMessage()); return null;
+        case "unlock":
+        case "UNLOCK": target.unlock(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulPreparedQueryProducerInvokeOnHeaderFactory.java b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulPreparedQueryProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..cb374cb
--- /dev/null
+++ b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulPreparedQueryProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,30 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.consul.endpoint;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.consul.endpoint.ConsulPreparedQueryProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class ConsulPreparedQueryProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.consul.endpoint.ConsulPreparedQueryProducer target = (org.apache.camel.component.consul.endpoint.ConsulPreparedQueryProducer) obj;
+        switch (key) {
+        case "get":
+        case "GET": target.get(exchange.getMessage()); return null;
+        case "execute":
+        case "EXECUTE": target.execute(exchange.getMessage()); return null;
+        case "create":
+        case "CREATE": target.create(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulSessionProducerInvokeOnHeaderFactory.java b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulSessionProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..05617e0
--- /dev/null
+++ b/components/camel-consul/src/generated/java/org/apache/camel/component/consul/endpoint/ConsulSessionProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,34 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.consul.endpoint;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.consul.endpoint.ConsulSessionProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class ConsulSessionProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.consul.endpoint.ConsulSessionProducer target = (org.apache.camel.component.consul.endpoint.ConsulSessionProducer) obj;
+        switch (key) {
+        case "info":
+        case "INFO": target.info(exchange.getMessage()); return null;
+        case "create":
+        case "CREATE": target.create(exchange.getMessage()); return null;
+        case "renew":
+        case "RENEW": target.renew(exchange.getMessage()); return null;
+        case "list":
+        case "LIST": target.list(exchange.getMessage()); return null;
+        case "destroy":
+        case "DESTROY": target.destroy(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulCatalogProducer b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulCatalogProducer
new file mode 100644
index 0000000..27ce6b7
--- /dev/null
+++ b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulCatalogProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.consul.endpoint.ConsulCatalogProducer.ConsulCatalogProducerInvokeOnHeaderFactory
diff --git a/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulCoordinatesProducer b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulCoordinatesProducer
new file mode 100644
index 0000000..d1906cb
--- /dev/null
+++ b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulCoordinatesProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.consul.endpoint.ConsulCoordinatesProducer.ConsulCoordinatesProducerInvokeOnHeaderFactory
diff --git a/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulEventProducer b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulEventProducer
new file mode 100644
index 0000000..a46e21e
--- /dev/null
+++ b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulEventProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.consul.endpoint.ConsulEventProducer.ConsulEventProducerInvokeOnHeaderFactory
diff --git a/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulHealthProducer b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulHealthProducer
new file mode 100644
index 0000000..ddd4593
--- /dev/null
+++ b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulHealthProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.consul.endpoint.ConsulHealthProducer.ConsulHealthProducerInvokeOnHeaderFactory
diff --git a/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulKeyValueProducer b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulKeyValueProducer
new file mode 100644
index 0000000..d1464a5
--- /dev/null
+++ b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulKeyValueProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.consul.endpoint.ConsulKeyValueProducer.ConsulKeyValueProducerInvokeOnHeaderFactory
diff --git a/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulPreparedQueryProducer b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulPreparedQueryProducer
new file mode 100644
index 0000000..be8e52b
--- /dev/null
+++ b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulPreparedQueryProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.consul.endpoint.ConsulPreparedQueryProducer.ConsulPreparedQueryProducerInvokeOnHeaderFactory
diff --git a/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulSessionProducer b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulSessionProducer
new file mode 100644
index 0000000..ab8e68b
--- /dev/null
+++ b/components/camel-consul/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.consul.endpoint.ConsulSessionProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.consul.endpoint.ConsulSessionProducer.ConsulSessionProducerInvokeOnHeaderFactory
diff --git a/components/camel-corda/src/generated/java/org/apache/camel/component/corda/CordaProducerInvokeOnHeaderFactory.java b/components/camel-corda/src/generated/java/org/apache/camel/component/corda/CordaProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..57575e8
--- /dev/null
+++ b/components/camel-corda/src/generated/java/org/apache/camel/component/corda/CordaProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,100 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.corda;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.corda.CordaProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class CordaProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.corda.CordaProducer target = (org.apache.camel.component.corda.CordaProducer) obj;
+        switch (key) {
+        case "accept_newnetwork_parameters":
+        case "ACCEPT_NEWNETWORK_PARAMETERS": target.acceptNewNetworkParameters(exchange.getMessage()); return null;
+        case "network_map_snapshot":
+        case "NETWORK_MAP_SNAPSHOT": target.networkMapSnapshot(exchange.getMessage()); return null;
+        case "parties_from_key":
+        case "PARTIES_FROM_KEY": target.partyFromKey(exchange.getMessage()); return null;
+        case "get_protocol_version":
+        case "GET_PROTOCOL_VERSION": target.getProtocolVersion(exchange.getMessage()); return null;
+        case "parties_from_name":
+        case "PARTIES_FROM_NAME": target.partiesFromName(exchange.getMessage()); return null;
+        case "node_info":
+        case "NODE_INFO": target.nodeInfo(exchange.getMessage()); return null;
+        case "notary_party_from_x500_name":
+        case "NOTARY_PARTY_FROM_X500_NAME": target.notaryPartyFromX500Name(exchange.getMessage()); return null;
+        case "start_flow_dynamic":
+        case "START_FLOW_DYNAMIC": target.startFlowDynamic(exchange.getMessage()); return null;
+        case "terminate":
+        case "TERMINATE": target.terminate(exchange.getMessage()); return null;
+        case "attachment_exists":
+        case "ATTACHMENT_EXISTS": target.attachmentExists(exchange.getMessage()); return null;
+        case "node_info_from_party":
+        case "NODE_INFO_FROM_PARTY": target.nodeInfoFromParty(exchange.getMessage()); return null;
+        case "registered_flows":
+        case "REGISTERED_FLOWS": target.registeredFlows(exchange.getMessage()); return null;
+        case "well_known_party_from_anonymous":
+        case "WELL_KNOWN_PARTY_FROM_ANONYMOUS": target.wellKnownPartyFromAnonymous(exchange.getMessage()); return null;
+        case "vault_query":
+        case "VAULT_QUERY": target.vaultQuery(exchange.getMessage()); return null;
+        case "upload_attachment":
+        case "UPLOAD_ATTACHMENT": target.uploadAttachment(exchange.getMessage()); return null;
+        case "set_flows_draining_mode_enabled":
+        case "SET_FLOWS_DRAINING_MODE_ENABLED": target.setFlowsDrainingModeEnabled(exchange.getMessage()); return null;
+        case "vault_query_by_criteria":
+        case "VAULT_QUERY_BY_CRITERIA": target.vaultQueryByCriteria(exchange.getMessage()); return null;
+        case "open_attachment":
+        case "OPEN_ATTACHMENT": target.openAttachment(exchange.getMessage()); return null;
+        case "state_machine_recorded_transaction_mapping_snapshot":
+        case "STATE_MACHINE_RECORDED_TRANSACTION_MAPPING_SNAPSHOT": target.stateMachineRecordedTransactionMappingSnapshot(exchange.getMessage()); return null;
+        case "get_vault_transaction_notes":
+        case "GET_VAULT_TRANSACTION_NOTES": target.getVaultTransactionNotes(exchange.getMessage()); return null;
+        case "kill_flow":
+        case "KILL_FLOW": target.killFlow(exchange.getMessage()); return null;
+        case "clear_network_map_cache":
+        case "CLEAR_NETWORK_MAP_CACHE": target.clearNetworkMapCache(exchange.getMessage()); return null;
+        case "is_flows_draining_mode_enabled":
+        case "IS_FLOWS_DRAINING_MODE_ENABLED": target.isFlowsDrainingModeEnabled(exchange.getMessage()); return null;
+        case "add_vault_transaction_note":
+        case "ADD_VAULT_TRANSACTION_NOTE": target.addVaultTransactionNote(exchange.getMessage()); return null;
+        case "is_waiting_for_shutdown":
+        case "IS_WAITING_FOR_SHUTDOWN": target.isWaitingForShutdown(exchange.getMessage()); return null;
+        case "network_parameters_feed":
+        case "NETWORK_PARAMETERS_FEED": target.networkParametersFeed(exchange.getMessage()); return null;
+        case "refresh_network_map_cache":
+        case "REFRESH_NETWORK_MAP_CACHE": target.refreshNetworkMapCache(exchange.getMessage()); return null;
+        case "state_machine_snapshot":
+        case "STATE_MACHINE_SNAPSHOT": target.stateMachinesSnapshot(exchange.getMessage()); return null;
+        case "query_attachments":
+        case "QUERY_ATTACHMENTS": target.queryAttachments(exchange.getMessage()); return null;
+        case "vault_query_by":
+        case "VAULT_QUERY_BY": target.vaultQueryBy(exchange.getMessage()); return null;
+        case "wait_until_network_ready":
+        case "WAIT_UNTIL_NETWORK_READY": target.waitUntilNetworkReady(exchange.getMessage()); return null;
+        case "shutdown":
+        case "SHUTDOWN": target.shutdown(exchange.getMessage()); return null;
+        case "upload_attachment_with_meta_data":
+        case "UPLOAD_ATTACHMENT_WITH_META_DATA": target.uploadAttachmentWithMetadata(exchange.getMessage()); return null;
+        case "vault_query_by_with_paging_spec":
+        case "VAULT_QUERY_BY_WITH_PAGING_SPEC": target.vaultQueryByWithPagingSpec(exchange.getMessage()); return null;
+        case "vault_query_by_with_sorting":
+        case "VAULT_QUERY_BY_WITH_SORTING": target.vaultQueryByWithSorting(exchange.getMessage()); return null;
+        case "current_node_time":
+        case "CURRENT_NODE_TIME": target.currentNodeTime(exchange.getMessage()); return null;
+        case "well_known_party_from_x500_name":
+        case "WELL_KNOWN_PARTY_FROM_X500_NAME": target.wellKnownPartyFromX500Name(exchange.getMessage()); return null;
+        case "notary_identities":
+        case "NOTARY_IDENTITIES": target.notaryIdentities(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-corda/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.corda.CordaProducer b/components/camel-corda/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.corda.CordaProducer
new file mode 100644
index 0000000..2197873
--- /dev/null
+++ b/components/camel-corda/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.corda.CordaProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.corda.CordaProducer.CordaProducerInvokeOnHeaderFactory
diff --git a/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/EhcacheProducerInvokeOnHeaderFactory.java b/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/EhcacheProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..3f42f53
--- /dev/null
+++ b/components/camel-ehcache/src/generated/java/org/apache/camel/component/ehcache/EhcacheProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,42 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.ehcache;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.ehcache.EhcacheProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class EhcacheProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.ehcache.EhcacheProducer target = (org.apache.camel.component.ehcache.EhcacheProducer) obj;
+        switch (key) {
+        case "get_all":
+        case "GET_ALL": target.onGetAll(exchange.getMessage()); return null;
+        case "clear":
+        case "CLEAR": target.onClear(exchange.getMessage()); return null;
+        case "put_if_absent":
+        case "PUT_IF_ABSENT": target.onPutIfAbsent(exchange.getMessage()); return null;
+        case "remove":
+        case "REMOVE": target.onRemove(exchange.getMessage()); return null;
+        case "get":
+        case "GET": target.onGet(exchange.getMessage()); return null;
+        case "put":
+        case "PUT": target.onPut(exchange.getMessage()); return null;
+        case "put_all":
+        case "PUT_ALL": target.onPutAll(exchange.getMessage()); return null;
+        case "remove_all":
+        case "REMOVE_ALL": target.onRemoveAll(exchange.getMessage()); return null;
+        case "replace":
+        case "REPLACE": target.onReplace(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.ehcache.EhcacheProducer b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.ehcache.EhcacheProducer
new file mode 100644
index 0000000..54a6d20
--- /dev/null
+++ b/components/camel-ehcache/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.ehcache.EhcacheProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.ehcache.EhcacheProducer.EhcacheProducerInvokeOnHeaderFactory
diff --git a/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteProducerInvokeOnHeaderFactory.java b/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedProducerInvokeOnHeaderFactory.java
similarity index 54%
copy from components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteProducerInvokeOnHeaderFactory.java
copy to components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedProducerInvokeOnHeaderFactory.java
index ff5b63b..87f0538 100644
--- a/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteProducerInvokeOnHeaderFactory.java
+++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/java/org/apache/camel/component/infinispan/embedded/InfinispanEmbeddedProducerInvokeOnHeaderFactory.java
@@ -1,19 +1,20 @@
 /* Generated by camel build tools - do NOT edit this file! */
-package org.apache.camel.component.infinispan.remote;
+package org.apache.camel.component.infinispan.embedded;
 
+import org.apache.camel.AsyncCallback;
 import org.apache.camel.Exchange;
 import org.apache.camel.spi.InvokeOnHeaderStrategy;
-import org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer;
+import org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedProducer;
 
 /**
  * Generated by camel build tools - do NOT edit this file!
  */
 @SuppressWarnings("unchecked")
-public class InfinispanRemoteProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+public class InfinispanEmbeddedProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
 
     @Override
-    public Object invoke(Object obj, String key, Exchange exchange) throws Exception {
-        org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer target = (org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer) obj;
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedProducer target = (org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedProducer) obj;
         switch (key) {
         case "query":
         case "QUERY": target.onQuery(exchange.getMessage()); return null;
diff --git a/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedProducer b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedProducer
new file mode 100644
index 0000000..86e7776
--- /dev/null
+++ b/components/camel-infinispan/camel-infinispan-embedded/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.infinispan.embedded.InfinispanEmbeddedProducer.InfinispanEmbeddedProducerInvokeOnHeaderFactory
diff --git a/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteProducerInvokeOnHeaderFactory.java b/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteProducerInvokeOnHeaderFactory.java
index ff5b63b..0ddf4fb 100644
--- a/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteProducerInvokeOnHeaderFactory.java
+++ b/components/camel-infinispan/camel-infinispan/src/generated/java/org/apache/camel/component/infinispan/remote/InfinispanRemoteProducerInvokeOnHeaderFactory.java
@@ -1,6 +1,7 @@
 /* Generated by camel build tools - do NOT edit this file! */
 package org.apache.camel.component.infinispan.remote;
 
+import org.apache.camel.AsyncCallback;
 import org.apache.camel.Exchange;
 import org.apache.camel.spi.InvokeOnHeaderStrategy;
 import org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer;
@@ -12,7 +13,7 @@ import org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer;
 public class InfinispanRemoteProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
 
     @Override
-    public Object invoke(Object obj, String key, Exchange exchange) throws Exception {
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
         org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer target = (org.apache.camel.component.infinispan.remote.InfinispanRemoteProducer) obj;
         switch (key) {
         case "query":
diff --git a/components/camel-web3j/src/generated/java/org/apache/camel/component/web3j/Web3jProducerInvokeOnHeaderFactory.java b/components/camel-web3j/src/generated/java/org/apache/camel/component/web3j/Web3jProducerInvokeOnHeaderFactory.java
new file mode 100644
index 0000000..1ee084b
--- /dev/null
+++ b/components/camel-web3j/src/generated/java/org/apache/camel/component/web3j/Web3jProducerInvokeOnHeaderFactory.java
@@ -0,0 +1,168 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.web3j;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Exchange;
+import org.apache.camel.spi.InvokeOnHeaderStrategy;
+import org.apache.camel.component.web3j.Web3jProducer;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class Web3jProducerInvokeOnHeaderFactory implements InvokeOnHeaderStrategy {
+
+    @Override
+    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {
+        org.apache.camel.component.web3j.Web3jProducer target = (org.apache.camel.component.web3j.Web3jProducer) obj;
+        switch (key) {
+        case "quorum_make_block":
+        case "QUORUM_MAKE_BLOCK": target.quorumMakeBlock(exchange.getMessage()); return null;
+        case "quorum_is_block_maker":
+        case "QUORUM_IS_BLOCK_MAKER": target.quorumIsBlockMaker(exchange.getMessage()); return null;
+        case "shh_has_identity":
+        case "SHH_HAS_IDENTITY": target.shhHasIdentity(exchange.getMessage()); return null;
+        case "shh_add_to_group":
+        case "SHH_ADD_TO_GROUP": target.shhAddToGroup(exchange.getMessage()); return null;
+        case "eth_get_storage_at":
+        case "ETH_GET_STORAGE_AT": target.ethGetStorageAt(exchange.getMessage()); return null;
+        case "eth_uninstall_filter":
+        case "ETH_UNINSTALL_FILTER": target.ethUninstallFilter(exchange.getMessage()); return null;
+        case "eth_get_filter_changes":
+        case "ETH_GET_FILTER_CHANGES": target.ethGetFilterChanges(exchange.getMessage()); return null;
+        case "eth_get_logs":
+        case "ETH_GET_LOGS": target.ethGetLogs(exchange.getMessage()); return null;
+        case "net_listening":
+        case "NET_LISTENING": target.netListening(exchange.getMessage()); return null;
+        case "eth_get_transaction_by_hash":
+        case "ETH_GET_TRANSACTION_BY_HASH": target.ethGetTransactionByHash(exchange.getMessage()); return null;
+        case "shh_get_filter_changes":
+        case "SHH_GET_FILTER_CHANGES": target.shhGetFilterChanges(exchange.getMessage()); return null;
+        case "eth_hashrate":
+        case "ETH_HASHRATE": target.ethHashrate(exchange.getMessage()); return null;
+        case "eth_syncing":
+        case "ETH_SYNCING": target.ethSyncing(exchange.getMessage()); return null;
+        case "eth_get_block_transaction_count_by_hash":
+        case "ETH_GET_BLOCK_TRANSACTION_COUNT_BY_HASH": target.ethGetBlockTransactionCountByHash(exchange.getMessage()); return null;
+        case "eth_get_transaction_receipt":
+        case "ETH_GET_TRANSACTION_RECEIPT": target.ethGetTransactionReceipt(exchange.getMessage()); return null;
+        case "eth_estimate_gas":
+        case "ETH_ESTIMATE_GAS": target.ethEstimateGas(exchange.getMessage()); return null;
+        case "eth_send_transaction":
+        case "ETH_SEND_TRANSACTION": target.ethSendTransaction(exchange.getMessage()); return null;
+        case "eth_compile_lll":
+        case "ETH_COMPILE_LLL": target.ethCompileLLL(exchange.getMessage()); return null;
+        case "eth_gas_price":
+        case "ETH_GAS_PRICE": target.ethGasPrice(exchange.getMessage()); return null;
+        case "eth_submit_hashrate":
+        case "ETH_SUBMIT_HASHRATE": target.ethSubmitHashrate(exchange.getMessage()); return null;
+        case "eth_get_balance":
+        case "ETH_GET_BALANCE": target.ethGetBalance(exchange.getMessage()); return null;
+        case "eth_get_block_by_number":
+        case "ETH_GET_BLOCK_BY_NUMBER": target.ethGetBlockByNumber(exchange.getMessage()); return null;
+        case "eth_new_pending_transaction_filter":
+        case "ETH_NEW_PENDING_TRANSACTION_FILTER": target.ethNewPendingTransactionFilter(exchange.getMessage()); return null;
+        case "eth_sign":
+        case "ETH_SIGN": target.ethSign(exchange.getMessage()); return null;
+        case "quorum_pause_block_maker":
+        case "QUORUM_PAUSE_BLOCK_MAKER": target.quorumPauseBlockMaker(exchange.getMessage()); return null;
+        case "eth_block_number":
+        case "ETH_BLOCK_NUMBER": target.ethBlockNumber(exchange.getMessage()); return null;
+        case "eth_new_filter":
+        case "ETH_NEW_FILTER": target.ethNewFilter(exchange.getMessage()); return null;
+        case "web3_client_version":
+        case "WEB3_CLIENT_VERSION": target.web3ClientVersion(exchange.getMessage()); return null;
+        case "eth_new_block_filter":
+        case "ETH_NEW_BLOCK_FILTER": target.ethNewBlockFilter(exchange.getMessage()); return null;
+        case "quorum_is_voter":
+        case "QUORUM_IS_VOTER": target.quorumIsVoter(exchange.getMessage()); return null;
+        case "eth_get_block_transaction_count_by_number":
+        case "ETH_GET_BLOCK_TRANSACTION_COUNT_BY_NUMBER": target.ethGetBlockTransactionCountByNumber(exchange.getMessage()); return null;
+        case "eth_compile_solidity":
+        case "ETH_COMPILE_SOLIDITY": target.ethCompileSolidity(exchange.getMessage()); return null;
+        case "db_put_hex":
+        case "DB_PUT_HEX": target.dbPutHex(exchange.getMessage()); return null;
+        case "eth_get_code":
+        case "ETH_GET_CODE": target.ethGetCode(exchange.getMessage()); return null;
+        case "shh_version":
+        case "SHH_VERSION": target.shhVersion(exchange.getMessage()); return null;
+        case "net_peer_count":
+        case "NET_PEER_COUNT": target.netPeerCount(exchange.getMessage()); return null;
+        case "quorum_node_info":
+        case "QUORUM_NODE_INFO": target.quorumNodeInfo(exchange.getMessage()); return null;
+        case "quorum_eth_send_transaction":
+        case "QUORUM_ETH_SEND_TRANSACTION": target.quorumEthSendTransaction(exchange.getMessage()); return null;
+        case "eth_call":
+        case "ETH_CALL": target.ethCall(exchange.getMessage()); return null;
+        case "quorum_get_private_payload":
+        case "QUORUM_GET_PRIVATE_PAYLOAD": target.quorumGetPrivatePayload(exchange.getMessage()); return null;
+        case "ethprotocolversion":
+        case "ethProtocolVersion": target.ethProtocolVersion(exchange.getMessage()); return null;
+        case "eth_get_work":
+        case "ETH_GET_WORK": target.ethGetWork(exchange.getMessage()); return null;
+        case "db_get_hex":
+        case "DB_GET_HEX": target.dbGetHex(exchange.getMessage()); return null;
+        case "shh_new_group":
+        case "SHH_NEW_GROUP": target.shhNewGroup(exchange.getMessage()); return null;
+        case "web3_sha3":
+        case "WEB3_SHA3": target.web3Sha3(exchange.getMessage()); return null;
+        case "eth_get_compilers":
+        case "ETH_GET_COMPILERS": target.ethGetCompilers(exchange.getMessage()); return null;
+        case "eth_get_uncle_by_block_hash_and_index":
+        case "ETH_GET_UNCLE_BY_BLOCK_HASH_AND_INDEX": target.ethGetUncleByBlockHashAndIndex(exchange.getMessage()); return null;
+        case "eth_get_block_by_hash":
+        case "ETH_GET_BLOCK_BY_HASH": target.ethGetBlockByHash(exchange.getMessage()); return null;
+        case "quorum_resume_block_maker":
+        case "QUORUM_RESUME_BLOCK_MAKER": target.quorumResumeBlockMaker(exchange.getMessage()); return null;
+        case "eth_get_transaction_count":
+        case "ETH_GET_TRANSACTION_COUNT": target.ethGetTransactionCount(exchange.getMessage()); return null;
+        case "shh_new_identity":
+        case "SHH_NEW_IDENTITY": target.shhNewIdentity(exchange.getMessage()); return null;
+        case "quorum_canonical_hash":
+        case "QUORUM_CANONICAL_HASH": target.quorumCanonicalHash(exchange.getMessage()); return null;
+        case "shh_uninstall_filter":
+        case "SHH_UNINSTALL_FILTER": target.shhUninstallFilter(exchange.getMessage()); return null;
+        case "eth_mining":
+        case "ETH_MINING": target.ethMining(exchange.getMessage()); return null;
+        case "eth_get_uncle_count_by_block_number":
+        case "ETH_GET_UNCLE_COUNT_BY_BLOCK_NUMBER": target.ethGetUncleCountByBlockNumber(exchange.getMessage()); return null;
+        case "db_put_string":
+        case "DB_PUT_STRING": target.dbPutString(exchange.getMessage()); return null;
+        case "eth_get_filter_logs":
+        case "ETH_GET_FILTER_LOGS": target.ethGetFilterLogs(exchange.getMessage()); return null;
+        case "shh_post":
+        case "SHH_POST": target.shhPost(exchange.getMessage()); return null;
+        case "net_version":
+        case "NET_VERSION": target.netVersion(exchange.getMessage()); return null;
+        case "eth_accounts":
+        case "ETH_ACCOUNTS": target.ethAccounts(exchange.getMessage()); return null;
+        case "eth_submit_work":
+        case "ETH_SUBMIT_WORK": target.ethSubmitWork(exchange.getMessage()); return null;
+        case "eth_get_transaction_by_block_hash_and_index":
+        case "ETH_GET_TRANSACTION_BY_BLOCK_HASH_AND_INDEX": target.ethGetTransactionByBlockHashAndIndex(exchange.getMessage()); return null;
+        case "eth_get_uncle_by_block_number_and_index":
+        case "ETH_GET_UNCLE_BY_BLOCK_NUMBER_AND_INDEX": target.ethGetUncleByBlockNumberAndIndex(exchange.getMessage()); return null;
+        case "eth_compile_serpent":
+        case "ETH_COMPILE_SERPENT": target.ethCompileSerpent(exchange.getMessage()); return null;
+        case "eth_get_uncle_count_by_block_hash":
+        case "ETH_GET_UNCLE_COUNT_BY_BLOCK_HASH": target.ethGetUncleCountByBlockHash(exchange.getMessage()); return null;
+        case "db_get_string":
+        case "DB_GET_STRING": target.dbGetString(exchange.getMessage()); return null;
+        case "eth_get_transaction_by_block_number_and_index":
+        case "ETH_GET_TRANSACTION_BY_BLOCK_NUMBER_AND_INDEX": target.ethGetTransactionByBlockNumberAndIndex(exchange.getMessage()); return null;
+        case "eth_coinbase":
+        case "ETH_COINBASE": target.ethCoinbase(exchange.getMessage()); return null;
+        case "shh_new_filter":
+        case "SHH_NEW_FILTER": target.shhNewFilter(exchange.getMessage()); return null;
+        case "eth_send_raw_transaction":
+        case "ETH_SEND_RAW_TRANSACTION": target.ethSendRawTransaction(exchange.getMessage()); return null;
+        case "quorum_vote":
+        case "QUORUM_VOTE": target.quorumVote(exchange.getMessage()); return null;
+        case "shh_get_messages":
+        case "SHH_GET_MESSAGES": target.shhGetMessages(exchange.getMessage()); return null;
+        default: return null;
+        }
+    }
+
+}
+
diff --git a/components/camel-web3j/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.web3j.Web3jProducer b/components/camel-web3j/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.web3j.Web3jProducer
new file mode 100644
index 0000000..4b4e03b
--- /dev/null
+++ b/components/camel-web3j/src/generated/resources/META-INF/services/org/apache/camel/invoke-on-header/org.apache.camel.component.web3j.Web3jProducer
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.web3j.Web3jProducer.Web3jProducerInvokeOnHeaderFactory
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeader.java b/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeader.java
index 3a3441c..fc0e977 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeader.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeader.java
@@ -21,11 +21,22 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.apache.camel.AsyncCallback;
 import org.apache.camel.Message;
 
 /**
  * Marks a method as being invoked for a specific header value.
  * <p/>
+ * The method must have either of the following  method signatures:
+ * <pre>
+ *     void theMethodName(Message message) throws Exception;
+ *     Object theMethodName(Message message) throws Exception;
+ *     boolean theMethodName(Message message, AsyncCallback callback) throws Exception;
+ * </pre>
+ * If the method includes the {@link AsyncCallback} type, then the return value must be boolean,
+ * as part of the async callback contract.
+ * Throwing exceptions is optional and can be omitted.
+ * <p/>
  * This can be used by Component implementations that uses org.apache.camel.support.HeaderSelectorProducer.
  *
  * @see Message#getHeader(String)
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeaderStrategy.java b/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeaderStrategy.java
index 57edc45..83f6b8d 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeaderStrategy.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/InvokeOnHeaderStrategy.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.spi;
 
+import org.apache.camel.AsyncCallback;
 import org.apache.camel.Exchange;
 
 /**
@@ -31,8 +32,9 @@ public interface InvokeOnHeaderStrategy {
      * @param  target    the target such as HeaderSelectorProducer
      * @param  key       the header key
      * @param  exchange  the exchange
+     * @param  callback  the async callback
      * @return           option response from invoking the method, or <tt>null</tt> if the method is void
      * @throws Exception is thrown if error invoking the method.
      */
-    Object invoke(Object target, String key, Exchange exchange) throws Exception;
+    Object invoke(Object target, String key, Exchange exchange, AsyncCallback callback) throws Exception;
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/HeaderSelectorProducer.java b/core/camel-support/src/main/java/org/apache/camel/support/HeaderSelectorProducer.java
index 96a9ebf..fbcb0c8 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/HeaderSelectorProducer.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/HeaderSelectorProducer.java
@@ -159,6 +159,8 @@ public abstract class HeaderSelectorProducer extends BaseSelectorProducer {
                 "Unsupported operation " + exchange.getIn().getHeader(headerSupplier.get()));
     }
 
+    // TODO: bind should use factory finder and use reflection free
+    // TODO: And setup this as part of doBuild as its loaded via classpath so we can build time optimize this
     protected void bind() {
         for (final Method method : getTarget().getClass().getDeclaredMethods()) {
             bind(method.getAnnotation(InvokeOnHeader.class), method);
diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java
index 93431ba..e96871b 100644
--- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java
+++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/GenerateInvokeOnHeaderMojo.java
@@ -68,6 +68,7 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo {
         private String key;
         private String methodName;
         private boolean isVoid;
+        private boolean callback;
 
         public String getKey() {
             return key;
@@ -92,6 +93,14 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo {
         public void setVoid(boolean aVoid) {
             isVoid = aVoid;
         }
+
+        public boolean isCallback() {
+            return callback;
+        }
+
+        public void setCallback(boolean callback) {
+            this.callback = callback;
+        }
     }
 
     public GenerateInvokeOnHeaderMojo() {
@@ -127,11 +136,13 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo {
             String value = a.value().asString();
             String methodName = a.target().asMethod().name();
             boolean isVoid = Type.Kind.VOID == a.target().asMethod().returnType().kind();
+            boolean callback = a.target().asMethod().parameters().size() == 2;
             Set<InvokeOnHeaderModel> set = classes.computeIfAbsent(currentClass, k -> new HashSet<>());
             InvokeOnHeaderModel model = new InvokeOnHeaderModel();
             model.setKey(value);
             model.setMethodName(methodName);
             model.setVoid(isVoid);
+            model.setCallback(callback);
             set.add(model);
         });
 
@@ -181,6 +192,7 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo {
         w.write("/* " + AbstractGeneratorMojo.GENERATED_MSG + " */\n");
         w.write("package " + pn + ";\n");
         w.write("\n");
+        w.write("import org.apache.camel.AsyncCallback;\n");
         w.write("import org.apache.camel.Exchange;\n");
         w.write("import org.apache.camel.spi.InvokeOnHeaderStrategy;\n");
         w.write("import " + pfqn + ";\n");
@@ -199,12 +211,17 @@ public class GenerateInvokeOnHeaderMojo extends AbstractGeneratorMojo {
         }
 
         w.write("    @Override\n");
-        w.write("    public Object invoke(Object obj, String key, Exchange exchange) throws Exception {\n");
+        w.write("    public Object invoke(Object obj, String key, Exchange exchange, AsyncCallback callback) throws Exception {\n");
         w.write("        " + en + " target = (" + en + ") obj;\n");
         if (!models.isEmpty()) {
             w.write("        switch (key) {\n");
             for (InvokeOnHeaderModel option : models) {
-                String invoke = "target." + option.getMethodName() + "(exchange.getMessage())";
+                String invoke;
+                if (option.isCallback()) {
+                    invoke = "target." + option.getMethodName() + "(exchange.getMessage(), callback)";
+                } else {
+                    invoke = "target." + option.getMethodName() + "(exchange.getMessage())";
+                }
                 if (!option.getKey().toLowerCase().equals(option.getKey())) {
                     w.write(String.format("        case \"%s\":\n", option.getKey().toLowerCase()));
                 }