Hi,

I would like to contribute a very simple patch file to
org.apache.camel.component.rabbitmq.RabbitMQDeclareSupport

I am interested in the following configuration to actually perform the
binding while skipping the declarations (or demanding they exist passively).

- declare = true
- skipQueueDeclare = true
- skipExchangeDeclare = true
- skipQueueBind = false

I am not entirely sure this micro-patch requires testing or documentation
changes.

Also, this is my first contribution/patch. If there are any remarks or
guidelines that I am missing, please let me know so I can improve it.
I am carrying out the change on branch main (dc66701db86).

Addendum:
I would like to know if this change could possibly be backported to older
versions, eg: v3.11.x.
diff --git 
components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQDeclareSupport.java
 
components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQDeclareSupport.java
index d69c554d04c..1ad4bb11a36 100644
--- 
components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQDeclareSupport.java
+++ 
components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQDeclareSupport.java
@@ -57,6 +57,11 @@ public class RabbitMQDeclareSupport {
             // declare
             declareAndBindQueue(channel, endpoint.getQueue(), 
endpoint.getExchangeName(), endpoint.getRoutingKey(),
                     resolvedQueueArguments(), endpoint.getBindingArgs());
+        } else if (shouldBindQueue()) {
+            // we skipped declarations because they should exist, but we still
+            // want to bind both. Forced passive declaration
+            passivelyDeclareExchangeAndQueueAndBindThem(channel, 
endpoint.getQueue(), endpoint.getExchangeName(),
+                    endpoint.getRoutingKey(), endpoint.getBindingArgs());
         }
     }
 
@@ -150,6 +155,18 @@ public class RabbitMQDeclareSupport {
         }
     }
 
+    private void passivelyDeclareExchangeAndQueueAndBindThem(
+            final Channel channel, final String queue, final String exchange, 
final String routingKey,
+            final Map<String, Object> bindingArgs)
+
+            throws IOException {
+
+        //if (!endpoint.isPassive()) { log.warn("Forcing passive because 
declaration was skipped"); }
+        channel.exchangeDeclarePassive(exchange);
+        channel.queueDeclarePassive(queue);
+        channel.queueBind(queue, exchange, emptyIfNull(routingKey), 
bindingArgs);
+    }
+
     private String emptyIfNull(final String routingKey) {
         return routingKey == null ? "" : routingKey;
     }

Reply via email to