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

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


The following commit(s) were added to refs/heads/main by this push:
     new 9ef0c09fffde CAMEL-26155: camel-rocketmq - waitForSendResult=false 
completes the exchange synchronously, and the headers are named CamelRocketMQ 
(#28933)
9ef0c09fffde is described below

commit 9ef0c09fffde3737ebde57f74deabb22335920dc
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Nov 2 20:49:06 2026 +0100

    CAMEL-26155: camel-rocketmq - waitForSendResult=false completes the 
exchange synchronously, and the headers are named CamelRocketMQ (#28933)
    
    …xchange synchronously, and the headers are named CamelRocketMQ
    
    With waitForSendResult=false the InOnly producer returned true (done 
synchronously)
    but called the callback later from the RocketMQ client thread. In practice 
every
    producer waited for the send result and failed the exchange on a failed 
send.
    waitForSendResult is now true by default (the behaviour users had), and 
false now
    calls callback.done(true) right away and only logs the send result.
    
    The header names were misspelled CamelRockerMQ...; they are now 
CamelRocketMQ...
    (hard rename per design/headers.adoc, documented in the upgrade guide).
    
    The test-infra broker registers a host-reachable address (brokerIP1 and a 
fixed
    free port), so the ITs run on Docker Desktop, and the aarch64 skip is 
removed.
    
    Co-Authored-By: Claude Opus 5.5 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../apache/camel/catalog/components/rocketmq.json  |  44 +++----
 .../camel/catalog/docs/rocketmq-component.adoc     |  20 +--
 .../camel/catalog/main/important-headers.json      |   2 +-
 components/camel-rocketmq/pom.xml                  |   4 +-
 .../apache/camel/component/rocketmq/rocketmq.json  |  44 +++----
 .../src/main/docs/rocketmq-component.adoc          |  20 +--
 .../component/rocketmq/RocketMQComponent.java      |   8 +-
 .../component/rocketmq/RocketMQConstants.java      |  40 +++---
 .../camel/component/rocketmq/RocketMQEndpoint.java |   8 +-
 .../camel/component/rocketmq/RocketMQProducer.java |  30 ++++-
 .../rocketmq/RocketMQProducerSendFailureTest.java  |  44 ++++++-
 .../apache/camel/util/ImportantHeaderUtils.java    |   2 +-
 .../ROOT/pages/camel-4x-upgrade-guide-4_24.adoc    |  42 +++++++
 .../dsl/RocketmqComponentBuilderFactory.java       |   8 +-
 .../dsl/RocketMQEndpointBuilderFactory.java        | 136 +++++++++++----------
 .../rocketmq/services/RocketMQBrokerContainer.java |  72 +++++++++--
 16 files changed, 346 insertions(+), 178 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/rocketmq.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/rocketmq.json
index 746bbd41a7b6..5f957de51c5e 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/rocketmq.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/rocketmq.json
@@ -38,7 +38,7 @@
     "producerGroup": { "index": 11, "kind": "property", "displayName": 
"Producer Group", "group": "producer", "label": "producer", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Producer group name." },
     "replyToConsumerGroup": { "index": 12, "kind": "property", "displayName": 
"Reply To Consumer Group", "group": "producer", "label": "producer", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Consumer group name used for receiving response." },
     "replyToTopic": { "index": 13, "kind": "property", "displayName": "Reply 
To Topic", "group": "producer", "label": "producer", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Topic used for receiving response when 
using in-out pattern." },
-    "waitForSendResult": { "index": 14, "kind": "property", "displayName": 
"Wait For Send Result", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether waiting for send result before routing to next endpoint." },
+    "waitForSendResult": { "index": 14, "kind": "property", "displayName": 
"Wait For Send Result", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether waiting for send result before routing to next endpoint. When true, a 
failed send fails the exchange. When false, an InOnly exchange continues as 
soon as the message is handed to the Roc [...]
     "autowiredEnabled": { "index": 15, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching  [...]
     "requestTimeoutCheckerIntervalMillis": { "index": 16, "kind": "property", 
"displayName": "Request Timeout Checker Interval Millis", "group": "advanced", 
"label": "advanced", "required": false, "type": "integer", "javaType": "long", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, 
"description": "Check interval milliseconds of request timeout." },
     "requestTimeoutMillis": { "index": 17, "kind": "property", "displayName": 
"Request Timeout Millis", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 10000, "description": "Timeout 
milliseconds of receiving response when using in-out pattern." },
@@ -46,26 +46,26 @@
     "secretKey": { "index": 19, "kind": "property", "displayName": "Secret 
Key", "group": "secret", "label": "secret", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": true, "security": "secret", "description": "Secret key for 
RocketMQ ACL." }
   },
   "headers": {
-    "CamelRockerMQTopic": { "index": 0, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Topic of message", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#TOPIC" },
-    "CamelRockerMQTag": { "index": 1, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Tag of message", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#TAG" },
-    "CamelRockerMQKey": { "index": 2, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "important": true, "description": "Key of message", 
"constantName": "org.apache.camel.component.rocketmq.RocketMQConstants#KEY" },
-    "CamelRockerMQOverrideTopicName": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "If this header is set, the message will 
be routed to the topic specified by this header instead of the origin topic in 
endpoint.", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_TOPIC_NAME" },
-    "CamelRockerMQOverrideTag": { "index": 4, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "If this header is set, the message's tag will 
be set to value specified by this header instead of the sendTag defined in 
endpoint.", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_TAG" },
-    "CamelRockerMQOverrideMessageKey": { "index": 5, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Set keys for the message. When using 
in-out pattern, the value will be prepended to the generated keys", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_MESSAGE_KEY" },
-    "CamelRockerMQBrokerName": { "index": 6, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Broker name", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BROKER_NAME" },
-    "CamelRockerMQQueueId": { "index": 7, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": "int", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Queue ID", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#QUEUE_ID" },
-    "CamelRockerMQStoreSize": { "index": 8, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Store size", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_SIZE" },
-    "CamelRockerMQQueueOffset": { "index": 9, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"long", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Queue offset", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#QUEUE_OFFSET" },
-    "CamelRockerMQSysFlag": { "index": 10, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Sys flag", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#SYS_FLAG" },
-    "CamelRockerMQBornTimestamp": { "index": 11, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Born timestamp", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BORN_TIMESTAMP" },
-    "CamelRockerMQBornHost": { "index": 12, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"java.net.SocketAddress", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Born host", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BORN_HOST" },
-    "CamelRockerMQStoreTimestamp": { "index": 13, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Store timestamp", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_TIMESTAMP" },
-    "CamelRockerMQStoreHost": { "index": 14, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"java.net.SocketAddress", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Store host", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_HOST" },
-    "CamelRockerMQMsgId": { "index": 15, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Msg ID", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#MSG_ID" },
-    "CamelRockerMQCommitLogOffset": { "index": 16, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Commit log offset", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#COMMIT_LOG_OFFSET" },
-    "CamelRockerMQBodyCrc": { "index": 17, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Body CRC", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BODY_CRC" },
-    "CamelRockerMQReconsumeTimes": { "index": 18, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Reconsume times", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#RECONSUME_TIMES" },
-    "CamelRockerMQPreparedTransactionOffset": { "index": 19, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Prepard transaction offset", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#PREPARED_TRANSACTION_OFFSET"
 }
+    "CamelRocketMQTopic": { "index": 0, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Topic of message", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#TOPIC" },
+    "CamelRocketMQTag": { "index": 1, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Tag of message", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#TAG" },
+    "CamelRocketMQKey": { "index": 2, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "important": true, "description": "Key of message", 
"constantName": "org.apache.camel.component.rocketmq.RocketMQConstants#KEY" },
+    "CamelRocketMQOverrideTopicName": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "If this header is set, the message will 
be routed to the topic specified by this header instead of the origin topic in 
endpoint.", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_TOPIC_NAME" },
+    "CamelRocketMQOverrideTag": { "index": 4, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "If this header is set, the message's tag will 
be set to value specified by this header instead of the sendTag defined in 
endpoint.", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_TAG" },
+    "CamelRocketMQOverrideMessageKey": { "index": 5, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Set keys for the message. When using 
in-out pattern, the value will be prepended to the generated keys", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_MESSAGE_KEY" },
+    "CamelRocketMQBrokerName": { "index": 6, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Broker name", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BROKER_NAME" },
+    "CamelRocketMQQueueId": { "index": 7, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": "int", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Queue ID", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#QUEUE_ID" },
+    "CamelRocketMQStoreSize": { "index": 8, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Store size", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_SIZE" },
+    "CamelRocketMQQueueOffset": { "index": 9, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"long", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Queue offset", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#QUEUE_OFFSET" },
+    "CamelRocketMQSysFlag": { "index": 10, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Sys flag", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#SYS_FLAG" },
+    "CamelRocketMQBornTimestamp": { "index": 11, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Born timestamp", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BORN_TIMESTAMP" },
+    "CamelRocketMQBornHost": { "index": 12, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"java.net.SocketAddress", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Born host", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BORN_HOST" },
+    "CamelRocketMQStoreTimestamp": { "index": 13, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Store timestamp", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_TIMESTAMP" },
+    "CamelRocketMQStoreHost": { "index": 14, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"java.net.SocketAddress", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Store host", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_HOST" },
+    "CamelRocketMQMsgId": { "index": 15, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Msg ID", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#MSG_ID" },
+    "CamelRocketMQCommitLogOffset": { "index": 16, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Commit log offset", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#COMMIT_LOG_OFFSET" },
+    "CamelRocketMQBodyCrc": { "index": 17, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Body CRC", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BODY_CRC" },
+    "CamelRocketMQReconsumeTimes": { "index": 18, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Reconsume times", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#RECONSUME_TIMES" },
+    "CamelRocketMQPreparedTransactionOffset": { "index": 19, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Prepard transaction offset", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#PREPARED_TRANSACTION_OFFSET"
 }
   },
   "bodyTypes": {
     "consumerOut": { "carriers": [ "bytes" ], "javaType": "byte[]", 
"description": "The body of the RocketMQ message. The consumer does not reply: 
the body the route ends with is not sent back" },
@@ -89,7 +89,7 @@
     "replyToConsumerGroup": { "index": 13, "kind": "parameter", "displayName": 
"Reply To Consumer Group", "group": "producer", "label": "producer", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Consumer group name used for receiving response." },
     "replyToTopic": { "index": 14, "kind": "parameter", "displayName": "Reply 
To Topic", "group": "producer", "label": "producer", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Topic used for receiving response when 
using in-out pattern." },
     "sendTag": { "index": 15, "kind": "parameter", "displayName": "Send Tag", 
"group": "producer", "label": "producer", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "Each message would be sent with this tag." },
-    "waitForSendResult": { "index": 16, "kind": "parameter", "displayName": 
"Wait For Send Result", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether waiting for send result before routing to next endpoint." },
+    "waitForSendResult": { "index": 16, "kind": "parameter", "displayName": 
"Wait For Send Result", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether waiting for send result before routing to next endpoint. When true, a 
failed send fails the exchange. When false, an InOnly exchange continues as 
soon as the message is handed to the Ro [...]
     "lazyStartProducer": { "index": 17, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
     "requestTimeoutCheckerIntervalMillis": { "index": 18, "kind": "parameter", 
"displayName": "Request Timeout Checker Interval Millis", "group": "advanced", 
"label": "advanced", "required": false, "type": "integer", "javaType": "long", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, 
"description": "Check interval milliseconds of request timeout." },
     "requestTimeoutMillis": { "index": 19, "kind": "parameter", "displayName": 
"Request Timeout Millis", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 10000, "description": "Timeout 
milliseconds of receiving response when using in-out pattern." },
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/rocketmq-component.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/rocketmq-component.adoc
index 0d76ac38adab..9ef81993f1c0 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/rocketmq-component.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/rocketmq-component.adoc
@@ -130,7 +130,7 @@ YAML::
 ----
 ====
 
-Setting specific headers can change routing behaviour. For example, if header 
`CamelRockerMQOverrideTopicName` was set,
+Setting specific headers can change routing behaviour. For example, if header 
`CamelRocketMQOverrideTopicName` was set,
 the message will be sent to `ACTUAL_TARGET` instead of `ORIGIN_TARGET`.
 
 [tabs]
@@ -140,9 +140,9 @@ Java::
 [source,java]
 ----
 from("rocketmq:FROM?consumerGroup=consumer")
-    .setHeader("CamelRockerMQOverrideTopicName", constant("ACTUAL_TARGET"))
-    .setHeader("CamelRockerMQOverrideTag", constant("OVERRIDE_TAG"))
-    .setHeader("CamelRockerMQOverrideMessageKey", 
constant("OVERRIDE_MESSAGE_KEY"))
+    .setHeader("CamelRocketMQOverrideTopicName", constant("ACTUAL_TARGET"))
+    .setHeader("CamelRocketMQOverrideTag", constant("OVERRIDE_TAG"))
+    .setHeader("CamelRocketMQOverrideMessageKey", 
constant("OVERRIDE_MESSAGE_KEY"))
     .to("rocketmq:ORIGIN_TARGET?producerGroup=producer")
     .to("log:RocketRoute?showAll=true");
 ----
@@ -153,13 +153,13 @@ XML::
 ----
 <route>
   <from uri="rocketmq:FROM?consumerGroup=consumer"/>
-  <setHeader name="CamelRockerMQOverrideTopicName">
+  <setHeader name="CamelRocketMQOverrideTopicName">
     <constant>ACTUAL_TARGET</constant>
   </setHeader>
-  <setHeader name="CamelRockerMQOverrideTag">
+  <setHeader name="CamelRocketMQOverrideTag">
     <constant>OVERRIDE_TAG</constant>
   </setHeader>
-  <setHeader name="CamelRockerMQOverrideMessageKey">
+  <setHeader name="CamelRocketMQOverrideMessageKey">
     <constant>OVERRIDE_MESSAGE_KEY</constant>
   </setHeader>
   <to uri="rocketmq:ORIGIN_TARGET?producerGroup=producer"/>
@@ -178,13 +178,13 @@ YAML::
         consumerGroup: consumer
       steps:
         - setHeader:
-            name: CamelRockerMQOverrideTopicName
+            name: CamelRocketMQOverrideTopicName
             constant: ACTUAL_TARGET
         - setHeader:
-            name: CamelRockerMQOverrideTag
+            name: CamelRocketMQOverrideTag
             constant: OVERRIDE_TAG
         - setHeader:
-            name: CamelRockerMQOverrideMessageKey
+            name: CamelRocketMQOverrideMessageKey
             constant: OVERRIDE_MESSAGE_KEY
         - to:
             uri: rocketmq:ORIGIN_TARGET
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/important-headers.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/important-headers.json
index a724797e9b0e..0a68e6ec6a08 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/important-headers.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/main/important-headers.json
@@ -21,7 +21,7 @@
   "CamelNatsStatusCode",
   "CamelNatsStatusError",
   "CamelNettyRemoteAddress",
-  "CamelRockerMQKey",
+  "CamelRocketMQKey",
   "CamelSplitIndex",
   "CamelSplitSize",
   "CamelSqlRowCount",
diff --git a/components/camel-rocketmq/pom.xml 
b/components/camel-rocketmq/pom.xml
index 68b4c747ffaa..124e483695ae 100644
--- a/components/camel-rocketmq/pom.xml
+++ b/components/camel-rocketmq/pom.xml
@@ -35,11 +35,9 @@
 
     <properties>
         <camel.failsafe.reuseForks>false</camel.failsafe.reuseForks>
-        <!-- RocketMQ container is only available on x86 -->
+        <!-- RocketMQ container is not available on s390x -->
         <skipTests.s390x>true</skipTests.s390x>
-        <skipTests.aarch64>true</skipTests.aarch64>
         <skipITs.s390x>true</skipITs.s390x>
-        <skipITs.aarch64>true</skipITs.aarch64>
     </properties>
 
     <dependencies>
diff --git 
a/components/camel-rocketmq/src/generated/resources/META-INF/org/apache/camel/component/rocketmq/rocketmq.json
 
b/components/camel-rocketmq/src/generated/resources/META-INF/org/apache/camel/component/rocketmq/rocketmq.json
index 746bbd41a7b6..5f957de51c5e 100644
--- 
a/components/camel-rocketmq/src/generated/resources/META-INF/org/apache/camel/component/rocketmq/rocketmq.json
+++ 
b/components/camel-rocketmq/src/generated/resources/META-INF/org/apache/camel/component/rocketmq/rocketmq.json
@@ -38,7 +38,7 @@
     "producerGroup": { "index": 11, "kind": "property", "displayName": 
"Producer Group", "group": "producer", "label": "producer", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "Producer group name." },
     "replyToConsumerGroup": { "index": 12, "kind": "property", "displayName": 
"Reply To Consumer Group", "group": "producer", "label": "producer", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Consumer group name used for receiving response." },
     "replyToTopic": { "index": 13, "kind": "property", "displayName": "Reply 
To Topic", "group": "producer", "label": "producer", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Topic used for receiving response when 
using in-out pattern." },
-    "waitForSendResult": { "index": 14, "kind": "property", "displayName": 
"Wait For Send Result", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether waiting for send result before routing to next endpoint." },
+    "waitForSendResult": { "index": 14, "kind": "property", "displayName": 
"Wait For Send Result", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether waiting for send result before routing to next endpoint. When true, a 
failed send fails the exchange. When false, an InOnly exchange continues as 
soon as the message is handed to the Roc [...]
     "autowiredEnabled": { "index": 15, "kind": "property", "displayName": 
"Autowired Enabled", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether autowiring is enabled. This is used for automatic autowiring options 
(the option must be marked as autowired) by looking up in the registry to find 
if there is a single instance of matching  [...]
     "requestTimeoutCheckerIntervalMillis": { "index": 16, "kind": "property", 
"displayName": "Request Timeout Checker Interval Millis", "group": "advanced", 
"label": "advanced", "required": false, "type": "integer", "javaType": "long", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, 
"description": "Check interval milliseconds of request timeout." },
     "requestTimeoutMillis": { "index": 17, "kind": "property", "displayName": 
"Request Timeout Millis", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 10000, "description": "Timeout 
milliseconds of receiving response when using in-out pattern." },
@@ -46,26 +46,26 @@
     "secretKey": { "index": 19, "kind": "property", "displayName": "Secret 
Key", "group": "secret", "label": "secret", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": true, "security": "secret", "description": "Secret key for 
RocketMQ ACL." }
   },
   "headers": {
-    "CamelRockerMQTopic": { "index": 0, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Topic of message", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#TOPIC" },
-    "CamelRockerMQTag": { "index": 1, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Tag of message", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#TAG" },
-    "CamelRockerMQKey": { "index": 2, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "important": true, "description": "Key of message", 
"constantName": "org.apache.camel.component.rocketmq.RocketMQConstants#KEY" },
-    "CamelRockerMQOverrideTopicName": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "If this header is set, the message will 
be routed to the topic specified by this header instead of the origin topic in 
endpoint.", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_TOPIC_NAME" },
-    "CamelRockerMQOverrideTag": { "index": 4, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "If this header is set, the message's tag will 
be set to value specified by this header instead of the sendTag defined in 
endpoint.", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_TAG" },
-    "CamelRockerMQOverrideMessageKey": { "index": 5, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Set keys for the message. When using 
in-out pattern, the value will be prepended to the generated keys", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_MESSAGE_KEY" },
-    "CamelRockerMQBrokerName": { "index": 6, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Broker name", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BROKER_NAME" },
-    "CamelRockerMQQueueId": { "index": 7, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": "int", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Queue ID", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#QUEUE_ID" },
-    "CamelRockerMQStoreSize": { "index": 8, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Store size", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_SIZE" },
-    "CamelRockerMQQueueOffset": { "index": 9, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"long", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Queue offset", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#QUEUE_OFFSET" },
-    "CamelRockerMQSysFlag": { "index": 10, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Sys flag", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#SYS_FLAG" },
-    "CamelRockerMQBornTimestamp": { "index": 11, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Born timestamp", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BORN_TIMESTAMP" },
-    "CamelRockerMQBornHost": { "index": 12, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"java.net.SocketAddress", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Born host", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BORN_HOST" },
-    "CamelRockerMQStoreTimestamp": { "index": 13, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Store timestamp", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_TIMESTAMP" },
-    "CamelRockerMQStoreHost": { "index": 14, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"java.net.SocketAddress", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Store host", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_HOST" },
-    "CamelRockerMQMsgId": { "index": 15, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Msg ID", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#MSG_ID" },
-    "CamelRockerMQCommitLogOffset": { "index": 16, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Commit log offset", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#COMMIT_LOG_OFFSET" },
-    "CamelRockerMQBodyCrc": { "index": 17, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Body CRC", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BODY_CRC" },
-    "CamelRockerMQReconsumeTimes": { "index": 18, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Reconsume times", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#RECONSUME_TIMES" },
-    "CamelRockerMQPreparedTransactionOffset": { "index": 19, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Prepard transaction offset", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#PREPARED_TRANSACTION_OFFSET"
 }
+    "CamelRocketMQTopic": { "index": 0, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Topic of message", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#TOPIC" },
+    "CamelRocketMQTag": { "index": 1, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Tag of message", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#TAG" },
+    "CamelRocketMQKey": { "index": 2, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "important": true, "description": "Key of message", 
"constantName": "org.apache.camel.component.rocketmq.RocketMQConstants#KEY" },
+    "CamelRocketMQOverrideTopicName": { "index": 3, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "If this header is set, the message will 
be routed to the topic specified by this header instead of the origin topic in 
endpoint.", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_TOPIC_NAME" },
+    "CamelRocketMQOverrideTag": { "index": 4, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "If this header is set, the message's tag will 
be set to value specified by this header instead of the sendTag defined in 
endpoint.", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_TAG" },
+    "CamelRocketMQOverrideMessageKey": { "index": 5, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Set keys for the message. When using 
in-out pattern, the value will be prepended to the generated keys", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#OVERRIDE_MESSAGE_KEY" },
+    "CamelRocketMQBrokerName": { "index": 6, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Broker name", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BROKER_NAME" },
+    "CamelRocketMQQueueId": { "index": 7, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": "int", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Queue ID", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#QUEUE_ID" },
+    "CamelRocketMQStoreSize": { "index": 8, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Store size", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_SIZE" },
+    "CamelRocketMQQueueOffset": { "index": 9, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"long", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Queue offset", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#QUEUE_OFFSET" },
+    "CamelRocketMQSysFlag": { "index": 10, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Sys flag", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#SYS_FLAG" },
+    "CamelRocketMQBornTimestamp": { "index": 11, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Born timestamp", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BORN_TIMESTAMP" },
+    "CamelRocketMQBornHost": { "index": 12, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"java.net.SocketAddress", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Born host", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BORN_HOST" },
+    "CamelRocketMQStoreTimestamp": { "index": 13, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Store timestamp", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_TIMESTAMP" },
+    "CamelRocketMQStoreHost": { "index": 14, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"java.net.SocketAddress", "deprecated": false, "deprecationNote": "", 
"autowired": false, "secret": false, "description": "Store host", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#STORE_HOST" },
+    "CamelRocketMQMsgId": { "index": 15, "kind": "header", "displayName": "", 
"group": "consumer", "label": "consumer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Msg ID", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#MSG_ID" },
+    "CamelRocketMQCommitLogOffset": { "index": 16, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Commit log offset", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#COMMIT_LOG_OFFSET" },
+    "CamelRocketMQBodyCrc": { "index": 17, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"int", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Body CRC", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#BODY_CRC" },
+    "CamelRocketMQReconsumeTimes": { "index": 18, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "int", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Reconsume times", "constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#RECONSUME_TIMES" },
+    "CamelRocketMQPreparedTransactionOffset": { "index": 19, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Prepard transaction offset", 
"constantName": 
"org.apache.camel.component.rocketmq.RocketMQConstants#PREPARED_TRANSACTION_OFFSET"
 }
   },
   "bodyTypes": {
     "consumerOut": { "carriers": [ "bytes" ], "javaType": "byte[]", 
"description": "The body of the RocketMQ message. The consumer does not reply: 
the body the route ends with is not sent back" },
@@ -89,7 +89,7 @@
     "replyToConsumerGroup": { "index": 13, "kind": "parameter", "displayName": 
"Reply To Consumer Group", "group": "producer", "label": "producer", 
"required": false, "type": "string", "javaType": "java.lang.String", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Consumer group name used for receiving response." },
     "replyToTopic": { "index": 14, "kind": "parameter", "displayName": "Reply 
To Topic", "group": "producer", "label": "producer", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "Topic used for receiving response when 
using in-out pattern." },
     "sendTag": { "index": 15, "kind": "parameter", "displayName": "Send Tag", 
"group": "producer", "label": "producer", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "Each message would be sent with this tag." },
-    "waitForSendResult": { "index": 16, "kind": "parameter", "displayName": 
"Wait For Send Result", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether waiting for send result before routing to next endpoint." },
+    "waitForSendResult": { "index": 16, "kind": "parameter", "displayName": 
"Wait For Send Result", "group": "producer", "label": "producer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": true, "description": 
"Whether waiting for send result before routing to next endpoint. When true, a 
failed send fails the exchange. When false, an InOnly exchange continues as 
soon as the message is handed to the Ro [...]
     "lazyStartProducer": { "index": 17, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
     "requestTimeoutCheckerIntervalMillis": { "index": 18, "kind": "parameter", 
"displayName": "Request Timeout Checker Interval Millis", "group": "advanced", 
"label": "advanced", "required": false, "type": "integer", "javaType": "long", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 1000, 
"description": "Check interval milliseconds of request timeout." },
     "requestTimeoutMillis": { "index": 19, "kind": "parameter", "displayName": 
"Request Timeout Millis", "group": "advanced", "label": "advanced", "required": 
false, "type": "integer", "javaType": "long", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 10000, "description": "Timeout 
milliseconds of receiving response when using in-out pattern." },
diff --git a/components/camel-rocketmq/src/main/docs/rocketmq-component.adoc 
b/components/camel-rocketmq/src/main/docs/rocketmq-component.adoc
index 0d76ac38adab..9ef81993f1c0 100644
--- a/components/camel-rocketmq/src/main/docs/rocketmq-component.adoc
+++ b/components/camel-rocketmq/src/main/docs/rocketmq-component.adoc
@@ -130,7 +130,7 @@ YAML::
 ----
 ====
 
-Setting specific headers can change routing behaviour. For example, if header 
`CamelRockerMQOverrideTopicName` was set,
+Setting specific headers can change routing behaviour. For example, if header 
`CamelRocketMQOverrideTopicName` was set,
 the message will be sent to `ACTUAL_TARGET` instead of `ORIGIN_TARGET`.
 
 [tabs]
@@ -140,9 +140,9 @@ Java::
 [source,java]
 ----
 from("rocketmq:FROM?consumerGroup=consumer")
-    .setHeader("CamelRockerMQOverrideTopicName", constant("ACTUAL_TARGET"))
-    .setHeader("CamelRockerMQOverrideTag", constant("OVERRIDE_TAG"))
-    .setHeader("CamelRockerMQOverrideMessageKey", 
constant("OVERRIDE_MESSAGE_KEY"))
+    .setHeader("CamelRocketMQOverrideTopicName", constant("ACTUAL_TARGET"))
+    .setHeader("CamelRocketMQOverrideTag", constant("OVERRIDE_TAG"))
+    .setHeader("CamelRocketMQOverrideMessageKey", 
constant("OVERRIDE_MESSAGE_KEY"))
     .to("rocketmq:ORIGIN_TARGET?producerGroup=producer")
     .to("log:RocketRoute?showAll=true");
 ----
@@ -153,13 +153,13 @@ XML::
 ----
 <route>
   <from uri="rocketmq:FROM?consumerGroup=consumer"/>
-  <setHeader name="CamelRockerMQOverrideTopicName">
+  <setHeader name="CamelRocketMQOverrideTopicName">
     <constant>ACTUAL_TARGET</constant>
   </setHeader>
-  <setHeader name="CamelRockerMQOverrideTag">
+  <setHeader name="CamelRocketMQOverrideTag">
     <constant>OVERRIDE_TAG</constant>
   </setHeader>
-  <setHeader name="CamelRockerMQOverrideMessageKey">
+  <setHeader name="CamelRocketMQOverrideMessageKey">
     <constant>OVERRIDE_MESSAGE_KEY</constant>
   </setHeader>
   <to uri="rocketmq:ORIGIN_TARGET?producerGroup=producer"/>
@@ -178,13 +178,13 @@ YAML::
         consumerGroup: consumer
       steps:
         - setHeader:
-            name: CamelRockerMQOverrideTopicName
+            name: CamelRocketMQOverrideTopicName
             constant: ACTUAL_TARGET
         - setHeader:
-            name: CamelRockerMQOverrideTag
+            name: CamelRocketMQOverrideTag
             constant: OVERRIDE_TAG
         - setHeader:
-            name: CamelRockerMQOverrideMessageKey
+            name: CamelRocketMQOverrideMessageKey
             constant: OVERRIDE_MESSAGE_KEY
         - to:
             uri: rocketmq:ORIGIN_TARGET
diff --git 
a/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQComponent.java
 
b/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQComponent.java
index 080755390007..3beea05fbdb7 100644
--- 
a/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQComponent.java
+++ 
b/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQComponent.java
@@ -68,8 +68,8 @@ public class RocketMQComponent extends DefaultComponent {
     @Metadata(label = "advanced", defaultValue = "1000")
     private long requestTimeoutCheckerIntervalMillis = 1000L;
 
-    @Metadata(label = "producer", defaultValue = "false")
-    private boolean waitForSendResult;
+    @Metadata(label = "producer", defaultValue = "true")
+    private boolean waitForSendResult = true;
 
     @Metadata(label = "secret", security = "secret")
     private String accessKey;
@@ -262,7 +262,9 @@ public class RocketMQComponent extends DefaultComponent {
     }
 
     /**
-     * Whether waiting for send result before routing to next endpoint.
+     * Whether waiting for send result before routing to next endpoint. When 
true, a failed send fails the exchange.
+     * When false, an InOnly exchange continues as soon as the message is 
handed to the RocketMQ client, and a failed
+     * send is only logged. An InOut exchange always waits for its reply.
      */
     public void setWaitForSendResult(boolean waitForSendResult) {
         this.waitForSendResult = waitForSendResult;
diff --git 
a/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQConstants.java
 
b/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQConstants.java
index 30cb4fd25ba8..b1cfc42b71d4 100644
--- 
a/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQConstants.java
+++ 
b/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQConstants.java
@@ -22,53 +22,53 @@ import org.apache.camel.spi.Metadata;
 public final class RocketMQConstants {
 
     @Metadata(label = "consumer", description = "Topic of message", javaType = 
"String")
-    public static final String TOPIC = "CamelRockerMQTopic";
+    public static final String TOPIC = "CamelRocketMQTopic";
     @Metadata(label = "consumer", description = "Tag of message", javaType = 
"String")
-    public static final String TAG = "CamelRockerMQTag";
+    public static final String TAG = "CamelRocketMQTag";
     @Metadata(label = "consumer", description = "Key of message", javaType = 
"String", important = true)
-    public static final String KEY = "CamelRockerMQKey";
+    public static final String KEY = "CamelRocketMQKey";
     @Metadata(label = "producer",
               description = "If this header is set, the message will be routed 
to the topic specified by this header\n" +
                             "instead of the origin topic in endpoint.",
               javaType = "String")
-    public static final String OVERRIDE_TOPIC_NAME = 
"CamelRockerMQOverrideTopicName";
+    public static final String OVERRIDE_TOPIC_NAME = 
"CamelRocketMQOverrideTopicName";
     @Metadata(label = "producer",
               description = "If this header is set, the message's tag will be 
set to value specified by this header\n" +
                             "instead of the sendTag defined in endpoint.",
               javaType = "String")
-    public static final String OVERRIDE_TAG = "CamelRockerMQOverrideTag";
+    public static final String OVERRIDE_TAG = "CamelRocketMQOverrideTag";
     @Metadata(label = "producer", description = "Set keys for the message. 
When using in-out pattern,\n" +
                                                 "the value will be prepended 
to the generated keys",
               javaType = "String")
-    public static final String OVERRIDE_MESSAGE_KEY = 
"CamelRockerMQOverrideMessageKey";
+    public static final String OVERRIDE_MESSAGE_KEY = 
"CamelRocketMQOverrideMessageKey";
     @Metadata(label = "consumer", description = "Broker name", javaType = 
"String")
-    public static final String BROKER_NAME = "CamelRockerMQBrokerName";
+    public static final String BROKER_NAME = "CamelRocketMQBrokerName";
     @Metadata(label = "consumer", description = "Queue ID", javaType = "int")
-    public static final String QUEUE_ID = "CamelRockerMQQueueId";
+    public static final String QUEUE_ID = "CamelRocketMQQueueId";
     @Metadata(label = "consumer", description = "Store size", javaType = "int")
-    public static final String STORE_SIZE = "CamelRockerMQStoreSize";
+    public static final String STORE_SIZE = "CamelRocketMQStoreSize";
     @Metadata(label = "consumer", description = "Queue offset", javaType = 
"long")
-    public static final String QUEUE_OFFSET = "CamelRockerMQQueueOffset";
+    public static final String QUEUE_OFFSET = "CamelRocketMQQueueOffset";
     @Metadata(label = "consumer", description = "Sys flag", javaType = "int")
-    public static final String SYS_FLAG = "CamelRockerMQSysFlag";
+    public static final String SYS_FLAG = "CamelRocketMQSysFlag";
     @Metadata(label = "consumer", description = "Born timestamp", javaType = 
"long")
-    public static final String BORN_TIMESTAMP = "CamelRockerMQBornTimestamp";
+    public static final String BORN_TIMESTAMP = "CamelRocketMQBornTimestamp";
     @Metadata(label = "consumer", description = "Born host", javaType = 
"java.net.SocketAddress")
-    public static final String BORN_HOST = "CamelRockerMQBornHost";
+    public static final String BORN_HOST = "CamelRocketMQBornHost";
     @Metadata(label = "consumer", description = "Store timestamp", javaType = 
"long")
-    public static final String STORE_TIMESTAMP = "CamelRockerMQStoreTimestamp";
+    public static final String STORE_TIMESTAMP = "CamelRocketMQStoreTimestamp";
     @Metadata(label = "consumer", description = "Store host", javaType = 
"java.net.SocketAddress")
-    public static final String STORE_HOST = "CamelRockerMQStoreHost";
+    public static final String STORE_HOST = "CamelRocketMQStoreHost";
     @Metadata(label = "consumer", description = "Msg ID", javaType = "String")
-    public static final String MSG_ID = "CamelRockerMQMsgId";
+    public static final String MSG_ID = "CamelRocketMQMsgId";
     @Metadata(label = "consumer", description = "Commit log offset", javaType 
= "long")
-    public static final String COMMIT_LOG_OFFSET = 
"CamelRockerMQCommitLogOffset";
+    public static final String COMMIT_LOG_OFFSET = 
"CamelRocketMQCommitLogOffset";
     @Metadata(label = "consumer", description = "Body CRC", javaType = "int")
-    public static final String BODY_CRC = "CamelRockerMQBodyCrc";
+    public static final String BODY_CRC = "CamelRocketMQBodyCrc";
     @Metadata(label = "consumer", description = "Reconsume times", javaType = 
"int")
-    public static final String RECONSUME_TIMES = "CamelRockerMQReconsumeTimes";
+    public static final String RECONSUME_TIMES = "CamelRocketMQReconsumeTimes";
     @Metadata(label = "consumer", description = "Prepard transaction offset", 
javaType = "long")
-    public static final String PREPARED_TRANSACTION_OFFSET = 
"CamelRockerMQPreparedTransactionOffset";
+    public static final String PREPARED_TRANSACTION_OFFSET = 
"CamelRocketMQPreparedTransactionOffset";
 
     private RocketMQConstants() {
     }
diff --git 
a/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQEndpoint.java
 
b/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQEndpoint.java
index 032e4673c6e5..89514140d664 100644
--- 
a/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQEndpoint.java
+++ 
b/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQEndpoint.java
@@ -83,8 +83,8 @@ public class RocketMQEndpoint extends DefaultEndpoint 
implements AsyncEndpoint,
     private long requestTimeoutMillis = 10000L;
     @UriParam(label = "advanced", defaultValue = "1000")
     private long requestTimeoutCheckerIntervalMillis = 1000L;
-    @UriParam(label = "producer")
-    private boolean waitForSendResult;
+    @UriParam(label = "producer", defaultValue = "true")
+    private boolean waitForSendResult = true;
     @UriParam(label = "security", security = "secret")
     private String accessKey;
     @UriParam(label = "security", security = "secret")
@@ -298,7 +298,9 @@ public class RocketMQEndpoint extends DefaultEndpoint 
implements AsyncEndpoint,
     }
 
     /**
-     * Whether waiting for send result before routing to next endpoint.
+     * Whether waiting for send result before routing to next endpoint. When 
true, a failed send fails the exchange.
+     * When false, an InOnly exchange continues as soon as the message is 
handed to the RocketMQ client, and a failed
+     * send is only logged. An InOut exchange always waits for its reply.
      */
     public void setWaitForSendResult(boolean waitForSendResult) {
         this.waitForSendResult = waitForSendResult;
diff --git 
a/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQProducer.java
 
b/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQProducer.java
index b825647ba207..989985a34be4 100644
--- 
a/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQProducer.java
+++ 
b/components/camel-rocketmq/src/main/java/org/apache/camel/component/rocketmq/RocketMQProducer.java
@@ -208,7 +208,27 @@ public class RocketMQProducer extends DefaultAsyncProducer 
{
         
message.setBody(exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class,
 exchange, in.getBody()));
         message.setKeys(in.getHeader(RocketMQConstants.OVERRIDE_MESSAGE_KEY, 
"", String.class));
         LOG.debug("RocketMQ Producer sending {}", message);
-        boolean waitForSendResult = getEndpoint().isWaitForSendResult();
+        if (!getEndpoint().isWaitForSendResult()) {
+            // do not wait: the exchange is done now, and the send result is 
only logged when it arrives
+            mqProducer.send(message, new SendCallback() {
+
+                @Override
+                public void onSuccess(SendResult sendResult) {
+                    if (SendStatus.SEND_OK.equals(sendResult.getSendStatus())) 
{
+                        LOG.debug("RocketMQ Producer sent {}", sendResult);
+                    } else {
+                        LOG.warn("RocketMQ Producer send was not ok (not 
waiting for the send result): {}", sendResult);
+                    }
+                }
+
+                @Override
+                public void onException(Throwable e) {
+                    LOG.warn("RocketMQ Producer send failed (not waiting for 
the send result): {}", e.getMessage(), e);
+                }
+            });
+            callback.done(true);
+            return true;
+        }
         mqProducer.send(message, new SendCallback() {
 
             @Override
@@ -216,17 +236,17 @@ public class RocketMQProducer extends 
DefaultAsyncProducer {
                 if (!SendStatus.SEND_OK.equals(sendResult.getSendStatus())) {
                     exchange.setException(new 
SendFailedException(sendResult.toString()));
                 }
-                callback.done(!waitForSendResult);
+                callback.done(false);
             }
 
             @Override
             public void onException(Throwable e) {
                 exchange.setException(e);
-                callback.done(!waitForSendResult);
+                callback.done(false);
             }
         });
-        // return false to wait send callback
-        return !waitForSendResult;
+        // return false to wait for the send callback
+        return false;
     }
 
     @Override
diff --git 
a/components/camel-rocketmq/src/test/java/org/apache/camel/component/rocketmq/RocketMQProducerSendFailureTest.java
 
b/components/camel-rocketmq/src/test/java/org/apache/camel/component/rocketmq/RocketMQProducerSendFailureTest.java
index 15504811ffdd..ed046280a333 100644
--- 
a/components/camel-rocketmq/src/test/java/org/apache/camel/component/rocketmq/RocketMQProducerSendFailureTest.java
+++ 
b/components/camel-rocketmq/src/test/java/org/apache/camel/component/rocketmq/RocketMQProducerSendFailureTest.java
@@ -16,17 +16,26 @@
  */
 package org.apache.camel.component.rocketmq;
 
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.apache.camel.AsyncProducer;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
+import org.apache.camel.support.DefaultExchange;
 import org.apache.camel.test.junit6.CamelTestSupport;
 import org.apache.rocketmq.client.exception.MQClientException;
 import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * A send that fails asynchronously (here: the client rejects an empty message 
before it contacts the name server) must
- * fail the exchange, also for an InOut exchange without replyToTopic.
+ * fail the exchange, also for an InOut exchange without replyToTopic. With 
waitForSendResult=false the exchange is done
+ * before the send result arrives, so the failure is only logged.
  */
 public class RocketMQProducerSendFailureTest extends CamelTestSupport {
 
@@ -39,6 +48,39 @@ public class RocketMQProducerSendFailureTest extends 
CamelTestSupport {
         assertInstanceOf(MQClientException.class, exchange.getException());
     }
 
+    @Test
+    public void testInOnlySendFailureWithWaitForSendResult() {
+        Exchange exchange = template.send(ROCKETMQ_URI + 
"&waitForSendResult=true", ExchangePattern.InOnly,
+                e -> e.getIn().setBody(""));
+
+        assertInstanceOf(MQClientException.class, exchange.getException());
+    }
+
+    @Test
+    public void testInOnlyWithoutWaitForSendResultIsDoneSynchronously() throws 
Exception {
+        AsyncProducer producer = context.getEndpoint(ROCKETMQ_URI + 
"&waitForSendResult=false").createAsyncProducer();
+        producer.start();
+        try {
+            Exchange exchange = new DefaultExchange(context, 
ExchangePattern.InOnly);
+            exchange.getIn().setBody("");
+            AtomicReference<Boolean> doneSync = new AtomicReference<>();
+            AtomicReference<Thread> callbackThread = new AtomicReference<>();
+
+            boolean sync = producer.process(exchange, d -> {
+                doneSync.set(d);
+                callbackThread.set(Thread.currentThread());
+            });
+
+            // a processor that returns true must have called the callback, 
with doneSync=true, before it returns
+            assertTrue(sync);
+            assertEquals(Boolean.TRUE, doneSync.get());
+            assertSame(Thread.currentThread(), callbackThread.get());
+            assertNull(exchange.getException());
+        } finally {
+            producer.stop();
+        }
+    }
+
     @Test
     public void testInOutSendFailureWithoutReplyToTopic() {
         Exchange exchange = template.send(ROCKETMQ_URI, ExchangePattern.InOut, 
e -> e.getIn().setBody(""));
diff --git 
a/core/camel-util/src/main/java/org/apache/camel/util/ImportantHeaderUtils.java 
b/core/camel-util/src/main/java/org/apache/camel/util/ImportantHeaderUtils.java
index 46f039972499..6ae07fca4887 100644
--- 
a/core/camel-util/src/main/java/org/apache/camel/util/ImportantHeaderUtils.java
+++ 
b/core/camel-util/src/main/java/org/apache/camel/util/ImportantHeaderUtils.java
@@ -49,7 +49,7 @@ public final class ImportantHeaderUtils {
                     "CamelNatsStatusCode",
                     "CamelNatsStatusError",
                     "CamelNettyRemoteAddress",
-                    "CamelRockerMQKey",
+                    "CamelRocketMQKey",
                     "CamelSplitIndex",
                     "CamelSplitSize",
                     "CamelSqlRowCount",
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
index 14d5cfb179a9..eddc889d1481 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc
@@ -775,6 +775,48 @@ default). It fails with a 
`java.util.concurrent.TimeoutException` when RabbitMQ
 and with an `org.springframework.amqp.AmqpTimeoutException` when RabbitMQ does 
not confirm it within `confirmTimeout`.
 Set `confirm=disabled` to send without waiting, as before.
 
+=== camel-rocketmq - the headers are named CamelRocketMQ, and 
waitForSendResult is true by default
+
+The header names of `camel-rocketmq` were misspelled `CamelRockerMQ...`; they 
are now `CamelRocketMQ...`. The Java
+field names of `RocketMQConstants` are unchanged; only the header string 
values have changed.
+
+[options="header"]
+|===
+| Previous value | New value
+| `CamelRockerMQTopic` | `CamelRocketMQTopic`
+| `CamelRockerMQTag` | `CamelRocketMQTag`
+| `CamelRockerMQKey` | `CamelRocketMQKey`
+| `CamelRockerMQOverrideTopicName` | `CamelRocketMQOverrideTopicName`
+| `CamelRockerMQOverrideTag` | `CamelRocketMQOverrideTag`
+| `CamelRockerMQOverrideMessageKey` | `CamelRocketMQOverrideMessageKey`
+| `CamelRockerMQBrokerName` | `CamelRocketMQBrokerName`
+| `CamelRockerMQQueueId` | `CamelRocketMQQueueId`
+| `CamelRockerMQStoreSize` | `CamelRocketMQStoreSize`
+| `CamelRockerMQQueueOffset` | `CamelRocketMQQueueOffset`
+| `CamelRockerMQSysFlag` | `CamelRocketMQSysFlag`
+| `CamelRockerMQBornTimestamp` | `CamelRocketMQBornTimestamp`
+| `CamelRockerMQBornHost` | `CamelRocketMQBornHost`
+| `CamelRockerMQStoreTimestamp` | `CamelRocketMQStoreTimestamp`
+| `CamelRockerMQStoreHost` | `CamelRocketMQStoreHost`
+| `CamelRockerMQMsgId` | `CamelRocketMQMsgId`
+| `CamelRockerMQCommitLogOffset` | `CamelRocketMQCommitLogOffset`
+| `CamelRockerMQBodyCrc` | `CamelRocketMQBodyCrc`
+| `CamelRockerMQReconsumeTimes` | `CamelRocketMQReconsumeTimes`
+| `CamelRockerMQPreparedTransactionOffset` | 
`CamelRocketMQPreparedTransactionOffset`
+|===
+
+Routes that use the constants (for example 
`setHeader(RocketMQConstants.OVERRIDE_TOPIC_NAME, ...)`) work without
+changes. Routes that use a header by its literal name (for example 
`CamelRockerMQOverrideTopicName` in an XML or YAML
+route, or `${header.CamelRockerMQKey}` in Simple) must be updated to the new 
name; the previous names are no longer
+read. The generated Endpoint DSL header accessors are renamed accordingly 
(`rockerMQTopic()` -> `rocketMQTopic()`,
+`rockerMQOverrideTopicName()` -> `rocketMQOverrideTopicName()`, and so on).
+
+The `waitForSendResult` option is now `true` by default. Before, it was 
`false`, but the producer still waited for the
+send result and failed the exchange when the send failed: it only reported the 
exchange as done synchronously while
+calling the callback later, which breaks the asynchronous routing contract. 
The default behaviour is therefore
+unchanged. With `waitForSendResult=false` an InOnly exchange now continues as 
soon as the message is handed to the
+RocketMQ client, and a failed send is only logged (at WARN) and no longer 
fails the exchange.
+
 === camel-azure-cosmosdb - the consumer starts the change feed processor again 
when its start fails
 
 When the change feed processor of an `azure-cosmosdb` consumer cannot start 
(Cosmos DB cannot be reached, the lease
diff --git 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/RocketmqComponentBuilderFactory.java
 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/RocketmqComponentBuilderFactory.java
index 1caba0bcfc32..4625a0aee239 100644
--- 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/RocketmqComponentBuilderFactory.java
+++ 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/RocketmqComponentBuilderFactory.java
@@ -300,11 +300,15 @@ public interface RocketmqComponentBuilderFactory {
     
         
         /**
-         * Whether waiting for send result before routing to next endpoint.
+         * Whether waiting for send result before routing to next endpoint. 
When
+         * true, a failed send fails the exchange. When false, an InOnly
+         * exchange continues as soon as the message is handed to the RocketMQ
+         * client, and a failed send is only logged. An InOut exchange always
+         * waits for its reply.
          * 
          * The option is a: &lt;code&gt;boolean&lt;/code&gt; type.
          * 
-         * Default: false
+         * Default: true
          * Group: producer
          * 
          * @param waitForSendResult the value to set
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/RocketMQEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/RocketMQEndpointBuilderFactory.java
index 0b6ca31023d6..274639a8e057 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/RocketMQEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/RocketMQEndpointBuilderFactory.java
@@ -539,11 +539,15 @@ public interface RocketMQEndpointBuilderFactory {
             return this;
         }
         /**
-         * Whether waiting for send result before routing to next endpoint.
+         * Whether waiting for send result before routing to next endpoint. 
When
+         * true, a failed send fails the exchange. When false, an InOnly
+         * exchange continues as soon as the message is handed to the RocketMQ
+         * client, and a failed send is only logged. An InOut exchange always
+         * waits for its reply.
          * 
          * The option is a: <code>boolean</code> type.
          * 
-         * Default: false
+         * Default: true
          * Group: producer
          * 
          * @param waitForSendResult the value to set
@@ -554,11 +558,15 @@ public interface RocketMQEndpointBuilderFactory {
             return this;
         }
         /**
-         * Whether waiting for send result before routing to next endpoint.
+         * Whether waiting for send result before routing to next endpoint. 
When
+         * true, a failed send fails the exchange. When false, an InOnly
+         * exchange continues as soon as the message is handed to the RocketMQ
+         * client, and a failed send is only logged. An InOut exchange always
+         * waits for its reply.
          * 
          * The option will be converted to a <code>boolean</code> type.
          * 
-         * Default: false
+         * Default: true
          * Group: producer
          * 
          * @param waitForSendResult the value to set
@@ -976,10 +984,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQTopic}.
+         * @return the name of the header {@code RocketMQTopic}.
          */
-        public String rockerMQTopic() {
-            return "CamelRockerMQTopic";
+        public String rocketMQTopic() {
+            return "CamelRocketMQTopic";
         }
         /**
          * Tag of message.
@@ -988,10 +996,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQTag}.
+         * @return the name of the header {@code RocketMQTag}.
          */
-        public String rockerMQTag() {
-            return "CamelRockerMQTag";
+        public String rocketMQTag() {
+            return "CamelRocketMQTag";
         }
         /**
          * Key of message.
@@ -1000,10 +1008,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQKey}.
+         * @return the name of the header {@code RocketMQKey}.
          */
-        public String rockerMQKey() {
-            return "CamelRockerMQKey";
+        public String rocketMQKey() {
+            return "CamelRocketMQKey";
         }
         /**
          * If this header is set, the message will be routed to the topic
@@ -1013,10 +1021,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: producer
          * 
-         * @return the name of the header {@code RockerMQOverrideTopicName}.
+         * @return the name of the header {@code RocketMQOverrideTopicName}.
          */
-        public String rockerMQOverrideTopicName() {
-            return "CamelRockerMQOverrideTopicName";
+        public String rocketMQOverrideTopicName() {
+            return "CamelRocketMQOverrideTopicName";
         }
         /**
          * If this header is set, the message's tag will be set to value
@@ -1026,10 +1034,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: producer
          * 
-         * @return the name of the header {@code RockerMQOverrideTag}.
+         * @return the name of the header {@code RocketMQOverrideTag}.
          */
-        public String rockerMQOverrideTag() {
-            return "CamelRockerMQOverrideTag";
+        public String rocketMQOverrideTag() {
+            return "CamelRocketMQOverrideTag";
         }
         /**
          * Set keys for the message. When using in-out pattern, the value will
@@ -1039,10 +1047,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: producer
          * 
-         * @return the name of the header {@code RockerMQOverrideMessageKey}.
+         * @return the name of the header {@code RocketMQOverrideMessageKey}.
          */
-        public String rockerMQOverrideMessageKey() {
-            return "CamelRockerMQOverrideMessageKey";
+        public String rocketMQOverrideMessageKey() {
+            return "CamelRocketMQOverrideMessageKey";
         }
         /**
          * Broker name.
@@ -1051,10 +1059,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQBrokerName}.
+         * @return the name of the header {@code RocketMQBrokerName}.
          */
-        public String rockerMQBrokerName() {
-            return "CamelRockerMQBrokerName";
+        public String rocketMQBrokerName() {
+            return "CamelRocketMQBrokerName";
         }
         /**
          * Queue ID.
@@ -1063,10 +1071,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQQueueId}.
+         * @return the name of the header {@code RocketMQQueueId}.
          */
-        public String rockerMQQueueId() {
-            return "CamelRockerMQQueueId";
+        public String rocketMQQueueId() {
+            return "CamelRocketMQQueueId";
         }
         /**
          * Store size.
@@ -1075,10 +1083,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQStoreSize}.
+         * @return the name of the header {@code RocketMQStoreSize}.
          */
-        public String rockerMQStoreSize() {
-            return "CamelRockerMQStoreSize";
+        public String rocketMQStoreSize() {
+            return "CamelRocketMQStoreSize";
         }
         /**
          * Queue offset.
@@ -1087,10 +1095,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQQueueOffset}.
+         * @return the name of the header {@code RocketMQQueueOffset}.
          */
-        public String rockerMQQueueOffset() {
-            return "CamelRockerMQQueueOffset";
+        public String rocketMQQueueOffset() {
+            return "CamelRocketMQQueueOffset";
         }
         /**
          * Sys flag.
@@ -1099,10 +1107,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQSysFlag}.
+         * @return the name of the header {@code RocketMQSysFlag}.
          */
-        public String rockerMQSysFlag() {
-            return "CamelRockerMQSysFlag";
+        public String rocketMQSysFlag() {
+            return "CamelRocketMQSysFlag";
         }
         /**
          * Born timestamp.
@@ -1111,10 +1119,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQBornTimestamp}.
+         * @return the name of the header {@code RocketMQBornTimestamp}.
          */
-        public String rockerMQBornTimestamp() {
-            return "CamelRockerMQBornTimestamp";
+        public String rocketMQBornTimestamp() {
+            return "CamelRocketMQBornTimestamp";
         }
         /**
          * Born host.
@@ -1123,10 +1131,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQBornHost}.
+         * @return the name of the header {@code RocketMQBornHost}.
          */
-        public String rockerMQBornHost() {
-            return "CamelRockerMQBornHost";
+        public String rocketMQBornHost() {
+            return "CamelRocketMQBornHost";
         }
         /**
          * Store timestamp.
@@ -1135,10 +1143,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQStoreTimestamp}.
+         * @return the name of the header {@code RocketMQStoreTimestamp}.
          */
-        public String rockerMQStoreTimestamp() {
-            return "CamelRockerMQStoreTimestamp";
+        public String rocketMQStoreTimestamp() {
+            return "CamelRocketMQStoreTimestamp";
         }
         /**
          * Store host.
@@ -1147,10 +1155,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQStoreHost}.
+         * @return the name of the header {@code RocketMQStoreHost}.
          */
-        public String rockerMQStoreHost() {
-            return "CamelRockerMQStoreHost";
+        public String rocketMQStoreHost() {
+            return "CamelRocketMQStoreHost";
         }
         /**
          * Msg ID.
@@ -1159,10 +1167,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQMsgId}.
+         * @return the name of the header {@code RocketMQMsgId}.
          */
-        public String rockerMQMsgId() {
-            return "CamelRockerMQMsgId";
+        public String rocketMQMsgId() {
+            return "CamelRocketMQMsgId";
         }
         /**
          * Commit log offset.
@@ -1171,10 +1179,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQCommitLogOffset}.
+         * @return the name of the header {@code RocketMQCommitLogOffset}.
          */
-        public String rockerMQCommitLogOffset() {
-            return "CamelRockerMQCommitLogOffset";
+        public String rocketMQCommitLogOffset() {
+            return "CamelRocketMQCommitLogOffset";
         }
         /**
          * Body CRC.
@@ -1183,10 +1191,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQBodyCrc}.
+         * @return the name of the header {@code RocketMQBodyCrc}.
          */
-        public String rockerMQBodyCrc() {
-            return "CamelRockerMQBodyCrc";
+        public String rocketMQBodyCrc() {
+            return "CamelRocketMQBodyCrc";
         }
         /**
          * Reconsume times.
@@ -1195,10 +1203,10 @@ public interface RocketMQEndpointBuilderFactory {
          * 
          * Group: consumer
          * 
-         * @return the name of the header {@code RockerMQReconsumeTimes}.
+         * @return the name of the header {@code RocketMQReconsumeTimes}.
          */
-        public String rockerMQReconsumeTimes() {
-            return "CamelRockerMQReconsumeTimes";
+        public String rocketMQReconsumeTimes() {
+            return "CamelRocketMQReconsumeTimes";
         }
         /**
          * Prepard transaction offset.
@@ -1208,10 +1216,10 @@ public interface RocketMQEndpointBuilderFactory {
          * Group: consumer
          * 
          * @return the name of the header {@code
-         * RockerMQPreparedTransactionOffset}.
+         * RocketMQPreparedTransactionOffset}.
          */
-        public String rockerMQPreparedTransactionOffset() {
-            return "CamelRockerMQPreparedTransactionOffset";
+        public String rocketMQPreparedTransactionOffset() {
+            return "CamelRocketMQPreparedTransactionOffset";
         }
     }
     static RocketMQEndpointBuilder endpointBuilder(String componentName, 
String path) {
diff --git 
a/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQBrokerContainer.java
 
b/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQBrokerContainer.java
index 482c07eb6498..1e4ea814ad43 100644
--- 
a/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQBrokerContainer.java
+++ 
b/test-infra/camel-test-infra-rocketmq/src/main/java/org/apache/camel/test/infra/rocketmq/services/RocketMQBrokerContainer.java
@@ -16,6 +16,12 @@
  */
 package org.apache.camel.test.infra.rocketmq.services;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 
 import org.apache.camel.test.infra.common.services.ContainerEnvironmentUtil;
@@ -24,29 +30,73 @@ import org.testcontainers.containers.BindMode;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.Network;
 import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.images.builder.Transferable;
 
 public class RocketMQBrokerContainer extends 
GenericContainer<RocketMQBrokerContainer> {
 
+    private static final String BROKER_CONF
+            = "/opt/rocketmq-" + 
RocketMQContainerInfraService.ROCKETMQ_VERSION + "/conf/broker.conf";
+
+    private final String confName;
+    private final boolean fixedPort;
+
     public RocketMQBrokerContainer(Network network, String confName, boolean 
fixedPort) {
         super(RocketMQContainerInfraService.ROCKETMQ_IMAGE);
+        this.confName = confName;
+        this.fixedPort = fixedPort;
 
-        if (!fixedPort) {
+        withEnv("NAMESRV_ADDR", "nameserver:9876");
+        if (fixedPort) {
+            ContainerEnvironmentUtil.configurePorts(this, fixedPort,
+                    
ContainerEnvironmentUtil.PortConfig.primary(RocketMQProperties.ROCKETMQ_BROKER1_PORT),
+                    
ContainerEnvironmentUtil.PortConfig.secondary(RocketMQProperties.ROCKETMQ_BROKER2_PORT),
+                    
ContainerEnvironmentUtil.PortConfig.secondary(RocketMQProperties.ROCKETMQ_BROKER3_PORT));
+            withClasspathResourceMapping(confName + "/" + confName + ".conf", 
BROKER_CONF, BindMode.READ_WRITE);
+        } else {
             withNetwork(network);
         }
-        ContainerEnvironmentUtil.configurePorts(this, fixedPort,
-                
ContainerEnvironmentUtil.PortConfig.primary(RocketMQProperties.ROCKETMQ_BROKER1_PORT),
-                
ContainerEnvironmentUtil.PortConfig.secondary(RocketMQProperties.ROCKETMQ_BROKER2_PORT),
-                
ContainerEnvironmentUtil.PortConfig.secondary(RocketMQProperties.ROCKETMQ_BROKER3_PORT));
-        withEnv("NAMESRV_ADDR", "nameserver:9876");
-        withClasspathResourceMapping(confName + "/" + confName + ".conf",
-                "/opt/rocketmq-" + 
RocketMQContainerInfraService.ROCKETMQ_VERSION + "/conf/broker.conf",
-                BindMode.READ_WRITE);
 
         withTmpFs(Collections.singletonMap("/home/rocketmq/store", "rw"));
         withTmpFs(Collections.singletonMap("/home/rocketmq/logs", "rw"));
-        withCommand("sh", "mqbroker",
-                "-c", "/opt/rocketmq-" + 
RocketMQContainerInfraService.ROCKETMQ_VERSION + "/conf/broker.conf");
+        withCommand("sh", "mqbroker", "-c", BROKER_CONF);
 
         waitingFor(Wait.forListeningPort());
     }
+
+    @Override
+    public void start() {
+        if (!fixedPort) {
+            // the broker registers its address with the name server, and the 
clients connect to that address: by default
+            // it is the container IP, which a Docker Desktop host cannot 
reach. So the broker listens on a free host port,
+            // bound to the same port in the container, and registers the 
docker host as its address.
+            int port = findFreePort();
+            withExposedPorts(port);
+            addFixedExposedPort(port, port);
+            String conf = readConf() + "\nlistenPort = " + port + "\nbrokerIP1 
= " + getHost() + "\n";
+            withCopyToContainer(Transferable.of(conf), BROKER_CONF);
+        }
+        super.start();
+    }
+
+    private String readConf() {
+        String resource = confName + "/" + confName + ".conf";
+        try (InputStream is = 
RocketMQBrokerContainer.class.getClassLoader().getResourceAsStream(resource)) {
+            if (is == null) {
+                throw new IllegalStateException("Broker configuration not 
found on the classpath: " + resource);
+            }
+            return new String(is.readAllBytes(), StandardCharsets.UTF_8);
+        } catch (IOException e) {
+            throw new IllegalStateException("Failed to read the broker 
configuration " + resource, e);
+        }
+    }
+
+    private static int findFreePort() {
+        try (ServerSocket socket = new ServerSocket()) {
+            socket.setReuseAddress(true);
+            socket.bind(new InetSocketAddress((InetAddress) null, 0), 1);
+            return socket.getLocalPort();
+        } catch (IOException e) {
+            throw new IllegalStateException("Failed to find a free port", e);
+        }
+    }
 }

Reply via email to