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

acosentino 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 f45d00b5ddb CAMEL-20565 - Azure servicebus dead-lettering (#13507)
f45d00b5ddb is described below

commit f45d00b5ddb60ca0559773cb8a5157281fccb5bf
Author: Romain Pfund <44622509+romain-pf...@users.noreply.github.com>
AuthorDate: Wed Mar 20 09:59:31 2024 +0100

    CAMEL-20565 - Azure servicebus dead-lettering (#13507)
    
    * Add DeadLettering config
    
    * DeadLettering message
    
    * DeadLettering generated files
    
    * Use stacktrace in errordescription
    
    * Check if subqueue is set
    
    * Use ObjectHelper
    
    ---------
    
    Co-authored-by: Romain Pfund <rpf...@hotela.ch>
---
 .../servicebus/ServiceBusComponentConfigurer.java  |  6 ++
 .../servicebus/ServiceBusEndpointConfigurer.java   |  6 ++
 .../servicebus/ServiceBusEndpointUriFactory.java   |  3 +-
 .../azure/servicebus/azure-servicebus.json         | 82 +++++++++++-----------
 .../azure/servicebus/ServiceBusConfiguration.java  | 14 ++++
 .../azure/servicebus/ServiceBusConsumer.java       | 21 +++++-
 .../AzureServicebusComponentBuilderFactory.java    |  1 +
 7 files changed, 91 insertions(+), 42 deletions(-)

diff --git 
a/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusComponentConfigurer.java
 
b/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusComponentConfigurer.java
index c322856c874..2f6bbe2d17f 100644
--- 
a/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusComponentConfigurer.java
+++ 
b/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusComponentConfigurer.java
@@ -48,6 +48,8 @@ public class ServiceBusComponentConfigurer extends 
PropertyConfigurerSupport imp
         case "credentialType": 
getOrCreateConfiguration(target).setCredentialType(property(camelContext, 
org.apache.camel.component.azure.servicebus.CredentialType.class, value)); 
return true;
         case "disableautocomplete":
         case "disableAutoComplete": 
getOrCreateConfiguration(target).setDisableAutoComplete(property(camelContext, 
boolean.class, value)); return true;
+        case "enabledeadlettering":
+        case "enableDeadLettering": 
getOrCreateConfiguration(target).setEnableDeadLettering(property(camelContext, 
boolean.class, value)); return true;
         case "fullyqualifiednamespace":
         case "fullyQualifiedNamespace": 
getOrCreateConfiguration(target).setFullyQualifiedNamespace(property(camelContext,
 java.lang.String.class, value)); return true;
         case "lazystartproducer":
@@ -114,6 +116,8 @@ public class ServiceBusComponentConfigurer extends 
PropertyConfigurerSupport imp
         case "credentialType": return 
org.apache.camel.component.azure.servicebus.CredentialType.class;
         case "disableautocomplete":
         case "disableAutoComplete": return boolean.class;
+        case "enabledeadlettering":
+        case "enableDeadLettering": return boolean.class;
         case "fullyqualifiednamespace":
         case "fullyQualifiedNamespace": return java.lang.String.class;
         case "lazystartproducer":
@@ -176,6 +180,8 @@ public class ServiceBusComponentConfigurer extends 
PropertyConfigurerSupport imp
         case "credentialType": return 
getOrCreateConfiguration(target).getCredentialType();
         case "disableautocomplete":
         case "disableAutoComplete": return 
getOrCreateConfiguration(target).isDisableAutoComplete();
+        case "enabledeadlettering":
+        case "enableDeadLettering": return 
getOrCreateConfiguration(target).isEnableDeadLettering();
         case "fullyqualifiednamespace":
         case "fullyQualifiedNamespace": return 
getOrCreateConfiguration(target).getFullyQualifiedNamespace();
         case "lazystartproducer":
diff --git 
a/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusEndpointConfigurer.java
 
b/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusEndpointConfigurer.java
index d2501cd900b..057f4c12227 100644
--- 
a/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusEndpointConfigurer.java
+++ 
b/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusEndpointConfigurer.java
@@ -38,6 +38,8 @@ public class ServiceBusEndpointConfigurer extends 
PropertyConfigurerSupport impl
         case "credentialType": 
target.getConfiguration().setCredentialType(property(camelContext, 
org.apache.camel.component.azure.servicebus.CredentialType.class, value)); 
return true;
         case "disableautocomplete":
         case "disableAutoComplete": 
target.getConfiguration().setDisableAutoComplete(property(camelContext, 
boolean.class, value)); return true;
+        case "enabledeadlettering":
+        case "enableDeadLettering": 
target.getConfiguration().setEnableDeadLettering(property(camelContext, 
boolean.class, value)); return true;
         case "exceptionhandler":
         case "exceptionHandler": 
target.setExceptionHandler(property(camelContext, 
org.apache.camel.spi.ExceptionHandler.class, value)); return true;
         case "exchangepattern":
@@ -105,6 +107,8 @@ public class ServiceBusEndpointConfigurer extends 
PropertyConfigurerSupport impl
         case "credentialType": return 
org.apache.camel.component.azure.servicebus.CredentialType.class;
         case "disableautocomplete":
         case "disableAutoComplete": return boolean.class;
+        case "enabledeadlettering":
+        case "enableDeadLettering": return boolean.class;
         case "exceptionhandler":
         case "exceptionHandler": return 
org.apache.camel.spi.ExceptionHandler.class;
         case "exchangepattern":
@@ -168,6 +172,8 @@ public class ServiceBusEndpointConfigurer extends 
PropertyConfigurerSupport impl
         case "credentialType": return 
target.getConfiguration().getCredentialType();
         case "disableautocomplete":
         case "disableAutoComplete": return 
target.getConfiguration().isDisableAutoComplete();
+        case "enabledeadlettering":
+        case "enableDeadLettering": return 
target.getConfiguration().isEnableDeadLettering();
         case "exceptionhandler":
         case "exceptionHandler": return target.getExceptionHandler();
         case "exchangepattern":
diff --git 
a/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusEndpointUriFactory.java
 
b/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusEndpointUriFactory.java
index e83b2e872d2..68496939042 100644
--- 
a/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusEndpointUriFactory.java
+++ 
b/components/camel-azure/camel-azure-servicebus/src/generated/java/org/apache/camel/component/azure/servicebus/ServiceBusEndpointUriFactory.java
@@ -21,7 +21,7 @@ public class ServiceBusEndpointUriFactory extends 
org.apache.camel.support.compo
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(29);
+        Set<String> props = new HashSet<>(30);
         props.add("amqpRetryOptions");
         props.add("amqpTransportType");
         props.add("binary");
@@ -31,6 +31,7 @@ public class ServiceBusEndpointUriFactory extends 
org.apache.camel.support.compo
         props.add("consumerOperation");
         props.add("credentialType");
         props.add("disableAutoComplete");
+        props.add("enableDeadLettering");
         props.add("exceptionHandler");
         props.add("exchangePattern");
         props.add("fullyQualifiedNamespace");
diff --git 
a/components/camel-azure/camel-azure-servicebus/src/generated/resources/META-INF/org/apache/camel/component/azure/servicebus/azure-servicebus.json
 
b/components/camel-azure/camel-azure-servicebus/src/generated/resources/META-INF/org/apache/camel/component/azure/servicebus/azure-servicebus.json
index a74ccb77a6b..72b04bd2499 100644
--- 
a/components/camel-azure/camel-azure-servicebus/src/generated/resources/META-INF/org/apache/camel/component/azure/servicebus/azure-servicebus.json
+++ 
b/components/camel-azure/camel-azure-servicebus/src/generated/resources/META-INF/org/apache/camel/component/azure/servicebus/azure-servicebus.json
@@ -32,25 +32,26 @@
     "bridgeErrorHandler": { "index": 6, "kind": "property", "displayName": 
"Bridge Error Handler", "group": "consumer", "label": "consumer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Allows for bridging the consumer to the Camel routing Error Handler, which 
mean any exceptions (if possible) occurred while the Camel consumer is trying 
to pickup incoming messages, or the like [...]
     "consumerOperation": { "index": 7, "kind": "property", "displayName": 
"Consumer Operation", "group": "consumer", "label": "consumer", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.ServiceBusConsumerOperationDefinition",
 "enum": [ "receiveMessages", "peekMessages" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "receiveMessages", 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusCon [...]
     "disableAutoComplete": { "index": 8, "kind": "property", "displayName": 
"Disable Auto Complete", "group": "consumer", "label": "consumer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Disables auto-complete 
and auto-abandon of received message [...]
-    "maxAutoLockRenewDuration": { "index": 9, "kind": "property", 
"displayName": "Max Auto Lock Renew Duration", "group": "consumer", "label": 
"consumer", "required": false, "type": "object", "javaType": 
"java.time.Duration", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "5m", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the amount of time 
to continue au [...]
-    "peekNumMaxMessages": { "index": 10, "kind": "property", "displayName": 
"Peek Num Max Messages", "group": "consumer", "label": "consumer", "required": 
false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Set the max number of 
messages to be peeked during the peek operation." },
-    "prefetchCount": { "index": 11, "kind": "property", "displayName": 
"Prefetch Count", "group": "consumer", "label": "consumer", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the prefetch count 
of the receiver. For both PEEK_LOCK PEEK_LOCK and RECEIVE_AND_DELETE RECEI [...]
-    "receiverAsyncClient": { "index": 12, "kind": "property", "displayName": 
"Receiver Async Client", "group": "consumer", "label": "consumer", "required": 
false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusReceiverAsyncClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets th [...]
-    "serviceBusReceiveMode": { "index": 13, "kind": "property", "displayName": 
"Service Bus Receive Mode", "group": "consumer", "label": "consumer", 
"required": false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.models.ServiceBusReceiveMode", "enum": [ 
"PEEK_LOCK", "RECEIVE_AND_DELETE" ], "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "PEEK_LOCK", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", "con 
[...]
-    "subQueue": { "index": 14, "kind": "property", "displayName": "Sub Queue", 
"group": "consumer", "label": "consumer", "required": false, "type": "object", 
"javaType": "com.azure.messaging.servicebus.models.SubQueue", "enum": [ "NONE", 
"DEAD_LETTER_QUEUE", "TRANSFER_DEAD_LETTER_QUEUE" ], "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "descriptio [...]
-    "subscriptionName": { "index": 15, "kind": "property", "displayName": 
"Subscription Name", "group": "consumer", "label": "consumer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the name of the 
subscription in the topic to listen to. topicOrQueueName an [...]
-    "reconnectDelay": { "index": 16, "kind": "property", "displayName": 
"Reconnect Delay", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "integer", "javaType": "int", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 5000, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "If the consumer has 
connection failure to Azure Servic [...]
-    "binary": { "index": 17, "kind": "property", "displayName": "Binary", 
"group": "producer", "label": "producer", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Set binary mode. If 
true, message body will be sent as byte. By default, it is false." },
-    "lazyStartProducer": { "index": 18, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "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 producer may otherwise fai [...]
-    "producerOperation": { "index": 19, "kind": "property", "displayName": 
"Producer Operation", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.ServiceBusProducerOperationDefinition",
 "enum": [ "sendMessages", "scheduleMessages" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "sendMessages", 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConf [...]
-    "scheduledEnqueueTime": { "index": 20, "kind": "property", "displayName": 
"Scheduled Enqueue Time", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": "java.time.OffsetDateTime", "deprecated": 
false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets OffsetDateTime at 
which the message should appear in the S [...]
-    "senderAsyncClient": { "index": 21, "kind": "property", "displayName": 
"Sender Async Client", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusSenderAsyncClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets SenderAs [...]
-    "serviceBusTransactionContext": { "index": 22, "kind": "property", 
"displayName": "Service Bus Transaction Context", "group": "producer", "label": 
"producer", "required": false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusTransactionContext", "deprecated": 
false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Represents  [...]
-    "autowiredEnabled": { "index": 23, "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  [...]
-    "connectionString": { "index": 24, "kind": "property", "displayName": 
"Connection String", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": true, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the connection 
string for a Service Bus namespace or a specific Service Bus  [...]
-    "credentialType": { "index": 25, "kind": "property", "displayName": 
"Credential Type", "group": "security", "label": "security", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.CredentialType", "enum": [ 
"AZURE_IDENTITY", "CONNECTION_STRING", "TOKEN_CREDENTIAL" ], "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": 
"CONNECTION_STRING", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfi [...]
-    "fullyQualifiedNamespace": { "index": 26, "kind": "property", 
"displayName": "Fully Qualified Namespace", "group": "security", "label": 
"security", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Fully Qualified 
Namespace of the service bus" },
-    "tokenCredential": { "index": 27, "kind": "property", "displayName": 
"Token Credential", "group": "security", "label": "security", "required": 
false, "type": "object", "javaType": 
"com.azure.core.credential.TokenCredential", "deprecated": false, "autowired": 
false, "secret": true, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "A TokenCredential for 
Azure AD authentication." }
+    "enableDeadLettering": { "index": 9, "kind": "property", "displayName": 
"Enable Dead Lettering", "group": "consumer", "label": "consumer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Enable application level 
deadlettering to the subscription  [...]
+    "maxAutoLockRenewDuration": { "index": 10, "kind": "property", 
"displayName": "Max Auto Lock Renew Duration", "group": "consumer", "label": 
"consumer", "required": false, "type": "object", "javaType": 
"java.time.Duration", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "5m", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the amount of time 
to continue a [...]
+    "peekNumMaxMessages": { "index": 11, "kind": "property", "displayName": 
"Peek Num Max Messages", "group": "consumer", "label": "consumer", "required": 
false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Set the max number of 
messages to be peeked during the peek operation." },
+    "prefetchCount": { "index": 12, "kind": "property", "displayName": 
"Prefetch Count", "group": "consumer", "label": "consumer", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the prefetch count 
of the receiver. For both PEEK_LOCK PEEK_LOCK and RECEIVE_AND_DELETE RECEI [...]
+    "receiverAsyncClient": { "index": 13, "kind": "property", "displayName": 
"Receiver Async Client", "group": "consumer", "label": "consumer", "required": 
false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusReceiverAsyncClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets th [...]
+    "serviceBusReceiveMode": { "index": 14, "kind": "property", "displayName": 
"Service Bus Receive Mode", "group": "consumer", "label": "consumer", 
"required": false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.models.ServiceBusReceiveMode", "enum": [ 
"PEEK_LOCK", "RECEIVE_AND_DELETE" ], "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "PEEK_LOCK", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", "con 
[...]
+    "subQueue": { "index": 15, "kind": "property", "displayName": "Sub Queue", 
"group": "consumer", "label": "consumer", "required": false, "type": "object", 
"javaType": "com.azure.messaging.servicebus.models.SubQueue", "enum": [ "NONE", 
"DEAD_LETTER_QUEUE", "TRANSFER_DEAD_LETTER_QUEUE" ], "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "descriptio [...]
+    "subscriptionName": { "index": 16, "kind": "property", "displayName": 
"Subscription Name", "group": "consumer", "label": "consumer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the name of the 
subscription in the topic to listen to. topicOrQueueName an [...]
+    "reconnectDelay": { "index": 17, "kind": "property", "displayName": 
"Reconnect Delay", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "integer", "javaType": "int", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 5000, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "If the consumer has 
connection failure to Azure Servic [...]
+    "binary": { "index": 18, "kind": "property", "displayName": "Binary", 
"group": "producer", "label": "producer", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Set binary mode. If 
true, message body will be sent as byte. By default, it is false." },
+    "lazyStartProducer": { "index": 19, "kind": "property", "displayName": 
"Lazy Start Producer", "group": "producer", "label": "producer", "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 producer may otherwise fai [...]
+    "producerOperation": { "index": 20, "kind": "property", "displayName": 
"Producer Operation", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.ServiceBusProducerOperationDefinition",
 "enum": [ "sendMessages", "scheduleMessages" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "sendMessages", 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConf [...]
+    "scheduledEnqueueTime": { "index": 21, "kind": "property", "displayName": 
"Scheduled Enqueue Time", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": "java.time.OffsetDateTime", "deprecated": 
false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets OffsetDateTime at 
which the message should appear in the S [...]
+    "senderAsyncClient": { "index": 22, "kind": "property", "displayName": 
"Sender Async Client", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusSenderAsyncClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets SenderAs [...]
+    "serviceBusTransactionContext": { "index": 23, "kind": "property", 
"displayName": "Service Bus Transaction Context", "group": "producer", "label": 
"producer", "required": false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusTransactionContext", "deprecated": 
false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Represents  [...]
+    "autowiredEnabled": { "index": 24, "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  [...]
+    "connectionString": { "index": 25, "kind": "property", "displayName": 
"Connection String", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": true, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the connection 
string for a Service Bus namespace or a specific Service Bus  [...]
+    "credentialType": { "index": 26, "kind": "property", "displayName": 
"Credential Type", "group": "security", "label": "security", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.CredentialType", "enum": [ 
"AZURE_IDENTITY", "CONNECTION_STRING", "TOKEN_CREDENTIAL" ], "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": 
"CONNECTION_STRING", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfi [...]
+    "fullyQualifiedNamespace": { "index": 27, "kind": "property", 
"displayName": "Fully Qualified Namespace", "group": "security", "label": 
"security", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Fully Qualified 
Namespace of the service bus" },
+    "tokenCredential": { "index": 28, "kind": "property", "displayName": 
"Token Credential", "group": "security", "label": "security", "required": 
false, "type": "object", "javaType": 
"com.azure.core.credential.TokenCredential", "deprecated": false, "autowired": 
false, "secret": true, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "A TokenCredential for 
Azure AD authentication." }
   },
   "headers": {
     "CamelAzureServiceBusApplicationProperties": { "index": 0, "kind": 
"header", "displayName": "", "group": "common", "label": "common", "required": 
false, "javaType": "Map<String, Object>", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
application properties (also known as custom properties) on messages sent and 
received by the producer and consumer, respectively.", "constantName": 
"org.apache.camel.component.azure.servicebus.Servi [...]
@@ -88,26 +89,27 @@
     "serviceBusType": { "index": 5, "kind": "parameter", "displayName": 
"Service Bus Type", "group": "common", "label": "common", "required": true, 
"type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.ServiceBusType", "enum": [ 
"queue", "topic" ], "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "defaultValue": "queue", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": " [...]
     "consumerOperation": { "index": 6, "kind": "parameter", "displayName": 
"Consumer Operation", "group": "consumer", "label": "consumer", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.ServiceBusConsumerOperationDefinition",
 "enum": [ "receiveMessages", "peekMessages" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "receiveMessages", 
"configurationClass": "org.apache.camel.component.azure.servicebus.ServiceBusCo 
[...]
     "disableAutoComplete": { "index": 7, "kind": "parameter", "displayName": 
"Disable Auto Complete", "group": "consumer", "label": "consumer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Disables auto-complete 
and auto-abandon of received messag [...]
-    "maxAutoLockRenewDuration": { "index": 8, "kind": "parameter", 
"displayName": "Max Auto Lock Renew Duration", "group": "consumer", "label": 
"consumer", "required": false, "type": "object", "javaType": 
"java.time.Duration", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "5m", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the amount of time 
to continue a [...]
-    "peekNumMaxMessages": { "index": 9, "kind": "parameter", "displayName": 
"Peek Num Max Messages", "group": "consumer", "label": "consumer", "required": 
false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Set the max number of 
messages to be peeked during the peek operation." },
-    "prefetchCount": { "index": 10, "kind": "parameter", "displayName": 
"Prefetch Count", "group": "consumer", "label": "consumer", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the prefetch count 
of the receiver. For both PEEK_LOCK PEEK_LOCK and RECEIVE_AND_DELETE RECE [...]
-    "receiverAsyncClient": { "index": 11, "kind": "parameter", "displayName": 
"Receiver Async Client", "group": "consumer", "label": "consumer", "required": 
false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusReceiverAsyncClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets t [...]
-    "serviceBusReceiveMode": { "index": 12, "kind": "parameter", 
"displayName": "Service Bus Receive Mode", "group": "consumer", "label": 
"consumer", "required": false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.models.ServiceBusReceiveMode", "enum": [ 
"PEEK_LOCK", "RECEIVE_AND_DELETE" ], "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "PEEK_LOCK", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", "co [...]
-    "subQueue": { "index": 13, "kind": "parameter", "displayName": "Sub 
Queue", "group": "consumer", "label": "consumer", "required": false, "type": 
"object", "javaType": "com.azure.messaging.servicebus.models.SubQueue", "enum": 
[ "NONE", "DEAD_LETTER_QUEUE", "TRANSFER_DEAD_LETTER_QUEUE" ], "deprecated": 
false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "descripti [...]
-    "subscriptionName": { "index": 14, "kind": "parameter", "displayName": 
"Subscription Name", "group": "consumer", "label": "consumer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the name of the 
subscription in the topic to listen to. topicOrQueueName a [...]
-    "bridgeErrorHandler": { "index": 15, "kind": "parameter", "displayName": 
"Bridge Error Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions (if possible) occurred 
while the Camel consumer is trying to pickup incoming [...]
-    "exceptionHandler": { "index": 16, "kind": "parameter", "displayName": 
"Exception Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
let the consumer use a custom ExceptionHandler. Notice if the option 
bridgeErrorHandler is enabled then this option is not in use. By de [...]
-    "exchangePattern": { "index": 17, "kind": "parameter", "displayName": 
"Exchange Pattern", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the exchange pattern when the consumer creates an exchange." },
-    "reconnectDelay": { "index": 18, "kind": "parameter", "displayName": 
"Reconnect Delay", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "integer", "javaType": "int", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 5000, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "If the consumer has 
connection failure to Azure Servi [...]
-    "binary": { "index": 19, "kind": "parameter", "displayName": "Binary", 
"group": "producer", "label": "producer", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Set binary mode. If 
true, message body will be sent as byte. By default, it is false." },
-    "producerOperation": { "index": 20, "kind": "parameter", "displayName": 
"Producer Operation", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.ServiceBusProducerOperationDefinition",
 "enum": [ "sendMessages", "scheduleMessages" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "sendMessages", 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusCon [...]
-    "scheduledEnqueueTime": { "index": 21, "kind": "parameter", "displayName": 
"Scheduled Enqueue Time", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": "java.time.OffsetDateTime", "deprecated": 
false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets OffsetDateTime at 
which the message should appear in the  [...]
-    "senderAsyncClient": { "index": 22, "kind": "parameter", "displayName": 
"Sender Async Client", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusSenderAsyncClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets SenderA [...]
-    "serviceBusTransactionContext": { "index": 23, "kind": "parameter", 
"displayName": "Service Bus Transaction Context", "group": "producer", "label": 
"producer", "required": false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusTransactionContext", "deprecated": 
false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Represents [...]
-    "lazyStartProducer": { "index": 24, "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 [...]
-    "connectionString": { "index": 25, "kind": "parameter", "displayName": 
"Connection String", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": true, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the connection 
string for a Service Bus namespace or a specific Service Bus [...]
-    "credentialType": { "index": 26, "kind": "parameter", "displayName": 
"Credential Type", "group": "security", "label": "security", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.CredentialType", "enum": [ 
"AZURE_IDENTITY", "CONNECTION_STRING", "TOKEN_CREDENTIAL" ], "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": 
"CONNECTION_STRING", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConf [...]
-    "fullyQualifiedNamespace": { "index": 27, "kind": "parameter", 
"displayName": "Fully Qualified Namespace", "group": "security", "label": 
"security", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Fully Qualified 
Namespace of the service bus" },
-    "tokenCredential": { "index": 28, "kind": "parameter", "displayName": 
"Token Credential", "group": "security", "label": "security", "required": 
false, "type": "object", "javaType": 
"com.azure.core.credential.TokenCredential", "deprecated": false, "autowired": 
false, "secret": true, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "A TokenCredential for 
Azure AD authentication." }
+    "enableDeadLettering": { "index": 8, "kind": "parameter", "displayName": 
"Enable Dead Lettering", "group": "consumer", "label": "consumer", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Enable application level 
deadlettering to the subscription [...]
+    "maxAutoLockRenewDuration": { "index": 9, "kind": "parameter", 
"displayName": "Max Auto Lock Renew Duration", "group": "consumer", "label": 
"consumer", "required": false, "type": "object", "javaType": 
"java.time.Duration", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": "5m", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the amount of time 
to continue a [...]
+    "peekNumMaxMessages": { "index": 10, "kind": "parameter", "displayName": 
"Peek Num Max Messages", "group": "consumer", "label": "consumer", "required": 
false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Set the max number of 
messages to be peeked during the peek operation." },
+    "prefetchCount": { "index": 11, "kind": "parameter", "displayName": 
"Prefetch Count", "group": "consumer", "label": "consumer", "required": false, 
"type": "integer", "javaType": "int", "deprecated": false, "autowired": false, 
"secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the prefetch count 
of the receiver. For both PEEK_LOCK PEEK_LOCK and RECEIVE_AND_DELETE RECE [...]
+    "receiverAsyncClient": { "index": 12, "kind": "parameter", "displayName": 
"Receiver Async Client", "group": "consumer", "label": "consumer", "required": 
false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusReceiverAsyncClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets t [...]
+    "serviceBusReceiveMode": { "index": 13, "kind": "parameter", 
"displayName": "Service Bus Receive Mode", "group": "consumer", "label": 
"consumer", "required": false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.models.ServiceBusReceiveMode", "enum": [ 
"PEEK_LOCK", "RECEIVE_AND_DELETE" ], "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": "PEEK_LOCK", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", "co [...]
+    "subQueue": { "index": 14, "kind": "parameter", "displayName": "Sub 
Queue", "group": "consumer", "label": "consumer", "required": false, "type": 
"object", "javaType": "com.azure.messaging.servicebus.models.SubQueue", "enum": 
[ "NONE", "DEAD_LETTER_QUEUE", "TRANSFER_DEAD_LETTER_QUEUE" ], "deprecated": 
false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "descripti [...]
+    "subscriptionName": { "index": 15, "kind": "parameter", "displayName": 
"Subscription Name", "group": "consumer", "label": "consumer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the name of the 
subscription in the topic to listen to. topicOrQueueName a [...]
+    "bridgeErrorHandler": { "index": 16, "kind": "parameter", "displayName": 
"Bridge Error Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions (if possible) occurred 
while the Camel consumer is trying to pickup incoming [...]
+    "exceptionHandler": { "index": 17, "kind": "parameter", "displayName": 
"Exception Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
let the consumer use a custom ExceptionHandler. Notice if the option 
bridgeErrorHandler is enabled then this option is not in use. By de [...]
+    "exchangePattern": { "index": 18, "kind": "parameter", "displayName": 
"Exchange Pattern", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the exchange pattern when the consumer creates an exchange." },
+    "reconnectDelay": { "index": 19, "kind": "parameter", "displayName": 
"Reconnect Delay", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "integer", "javaType": "int", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 5000, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "If the consumer has 
connection failure to Azure Servi [...]
+    "binary": { "index": 20, "kind": "parameter", "displayName": "Binary", 
"group": "producer", "label": "producer", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Set binary mode. If 
true, message body will be sent as byte. By default, it is false." },
+    "producerOperation": { "index": 21, "kind": "parameter", "displayName": 
"Producer Operation", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.ServiceBusProducerOperationDefinition",
 "enum": [ "sendMessages", "scheduleMessages" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "sendMessages", 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusCon [...]
+    "scheduledEnqueueTime": { "index": 22, "kind": "parameter", "displayName": 
"Scheduled Enqueue Time", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": "java.time.OffsetDateTime", "deprecated": 
false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets OffsetDateTime at 
which the message should appear in the  [...]
+    "senderAsyncClient": { "index": 23, "kind": "parameter", "displayName": 
"Sender Async Client", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusSenderAsyncClient", "deprecated": 
false, "deprecationNote": "", "autowired": true, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets SenderA [...]
+    "serviceBusTransactionContext": { "index": 24, "kind": "parameter", 
"displayName": "Service Bus Transaction Context", "group": "producer", "label": 
"producer", "required": false, "type": "object", "javaType": 
"com.azure.messaging.servicebus.ServiceBusTransactionContext", "deprecated": 
false, "autowired": false, "secret": false, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Represents [...]
+    "lazyStartProducer": { "index": 25, "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 [...]
+    "connectionString": { "index": 26, "kind": "parameter", "displayName": 
"Connection String", "group": "security", "label": "security", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": true, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Sets the connection 
string for a Service Bus namespace or a specific Service Bus [...]
+    "credentialType": { "index": 27, "kind": "parameter", "displayName": 
"Credential Type", "group": "security", "label": "security", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.azure.servicebus.CredentialType", "enum": [ 
"AZURE_IDENTITY", "CONNECTION_STRING", "TOKEN_CREDENTIAL" ], "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": 
"CONNECTION_STRING", "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConf [...]
+    "fullyQualifiedNamespace": { "index": 28, "kind": "parameter", 
"displayName": "Fully Qualified Namespace", "group": "security", "label": 
"security", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "Fully Qualified 
Namespace of the service bus" },
+    "tokenCredential": { "index": 29, "kind": "parameter", "displayName": 
"Token Credential", "group": "security", "label": "security", "required": 
false, "type": "object", "javaType": 
"com.azure.core.credential.TokenCredential", "deprecated": false, "autowired": 
false, "secret": true, "configurationClass": 
"org.apache.camel.component.azure.servicebus.ServiceBusConfiguration", 
"configurationField": "configuration", "description": "A TokenCredential for 
Azure AD authentication." }
   }
 }
diff --git 
a/components/camel-azure/camel-azure-servicebus/src/main/java/org/apache/camel/component/azure/servicebus/ServiceBusConfiguration.java
 
b/components/camel-azure/camel-azure-servicebus/src/main/java/org/apache/camel/component/azure/servicebus/ServiceBusConfiguration.java
index 07bbb044eca..5c526276a26 100644
--- 
a/components/camel-azure/camel-azure-servicebus/src/main/java/org/apache/camel/component/azure/servicebus/ServiceBusConfiguration.java
+++ 
b/components/camel-azure/camel-azure-servicebus/src/main/java/org/apache/camel/component/azure/servicebus/ServiceBusConfiguration.java
@@ -68,6 +68,8 @@ public class ServiceBusConfiguration implements Cloneable {
     private String subscriptionName;
     @UriParam(label = "consumer")
     private boolean disableAutoComplete;
+    @UriParam(label = "consumer")
+    private boolean enableDeadLettering;
     @UriParam(label = "consumer", defaultValue = "PEEK_LOCK")
     private ServiceBusReceiveMode serviceBusReceiveMode = 
ServiceBusReceiveMode.PEEK_LOCK;
     @UriParam(label = "consumer", defaultValue = "5m")
@@ -211,6 +213,18 @@ public class ServiceBusConfiguration implements Cloneable {
         this.disableAutoComplete = disableAutoComplete;
     }
 
+    /**
+     * Enable application level deadlettering to the subscription deadletter 
subqueue if deadletter related headers are
+     * set.
+     */
+    public boolean isEnableDeadLettering() {
+        return enableDeadLettering;
+    }
+
+    public void setEnableDeadLettering(boolean enableDeadLettering) {
+        this.enableDeadLettering = enableDeadLettering;
+    }
+
     /**
      * Sets the receive mode for the receiver.
      */
diff --git 
a/components/camel-azure/camel-azure-servicebus/src/main/java/org/apache/camel/component/azure/servicebus/ServiceBusConsumer.java
 
b/components/camel-azure/camel-azure-servicebus/src/main/java/org/apache/camel/component/azure/servicebus/ServiceBusConsumer.java
index d00b30fe8f5..80ebd449cbc 100644
--- 
a/components/camel-azure/camel-azure-servicebus/src/main/java/org/apache/camel/component/azure/servicebus/ServiceBusConsumer.java
+++ 
b/components/camel-azure/camel-azure-servicebus/src/main/java/org/apache/camel/component/azure/servicebus/ServiceBusConsumer.java
@@ -16,11 +16,15 @@
  */
 package org.apache.camel.component.azure.servicebus;
 
+import java.util.Arrays;
 import java.util.EnumMap;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import com.azure.messaging.servicebus.ServiceBusReceivedMessage;
 import com.azure.messaging.servicebus.ServiceBusReceiverAsyncClient;
+import com.azure.messaging.servicebus.models.DeadLetterOptions;
+import com.azure.messaging.servicebus.models.SubQueue;
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.Exchange;
 import org.apache.camel.Message;
@@ -228,8 +232,23 @@ public class ServiceBusConsumer extends DefaultConsumer {
             if (cause != null) {
                 getExceptionHandler().handleException("Error during processing 
exchange.", exchange, cause);
             }
+
             if (!getConfiguration().isDisableAutoComplete()) {
-                
clientWrapper.abandon(message).subscribeOn(Schedulers.boundedElastic()).subscribe();
+                if (getConfiguration().isEnableDeadLettering() && 
(ObjectHelper.isEmpty(getConfiguration().getSubQueue()) ||
+                        ObjectHelper.equal(getConfiguration().getSubQueue(), 
SubQueue.NONE))) {
+                    DeadLetterOptions deadLetterOptions = new 
DeadLetterOptions();
+                    if (cause != null) {
+                        deadLetterOptions
+                                .setDeadLetterReason(String.format("%s: %s", 
cause.getClass().getName(), cause.getMessage()));
+                        
deadLetterOptions.setDeadLetterErrorDescription(Arrays.stream(cause.getStackTrace())
+                                .map(StackTraceElement::toString)
+                                .collect(Collectors.joining("\n")));
+                    }
+                    clientWrapper.deadLetter(message, 
deadLetterOptions).subscribeOn(Schedulers.boundedElastic()).subscribe();
+                } else {
+                    
clientWrapper.abandon(message).subscribeOn(Schedulers.boundedElastic()).subscribe();
+                }
+
             }
         }
     }
diff --git 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureServicebusComponentBuilderFactory.java
 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureServicebusComponentBuilderFactory.java
index 4146ed9bc09..925f0796013 100644
--- 
a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureServicebusComponentBuilderFactory.java
+++ 
b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AzureServicebusComponentBuilderFactory.java
@@ -582,6 +582,7 @@ public interface AzureServicebusComponentBuilderFactory {
             case "bridgeErrorHandler": ((ServiceBusComponent) 
component).setBridgeErrorHandler((boolean) value); return true;
             case "consumerOperation": 
getOrCreateConfiguration((ServiceBusComponent) 
component).setConsumerOperation((org.apache.camel.component.azure.servicebus.ServiceBusConsumerOperationDefinition)
 value); return true;
             case "disableAutoComplete": 
getOrCreateConfiguration((ServiceBusComponent) 
component).setDisableAutoComplete((boolean) value); return true;
+            case "enableDeadLettering": 
getOrCreateConfiguration((ServiceBusComponent) 
component).setEnableDeadLettering((boolean) value); return true;
             case "maxAutoLockRenewDuration": 
getOrCreateConfiguration((ServiceBusComponent) 
component).setMaxAutoLockRenewDuration((java.time.Duration) value); return true;
             case "peekNumMaxMessages": 
getOrCreateConfiguration((ServiceBusComponent) 
component).setPeekNumMaxMessages((java.lang.Integer) value); return true;
             case "prefetchCount": 
getOrCreateConfiguration((ServiceBusComponent) 
component).setPrefetchCount((int) value); return true;

Reply via email to