You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/10/04 14:10:17 UTC

[camel] branch master updated: CAMEL-13270: camel-rabbitmq allow headers that RabbitMQ accepts. Also allow all x- header types.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new c1ef085  CAMEL-13270: camel-rabbitmq allow headers that RabbitMQ accepts. Also allow all x- header types.
c1ef085 is described below

commit c1ef08583d4643334044442770deec6241658ba1
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Fri Oct 4 16:09:55 2019 +0200

    CAMEL-13270: camel-rabbitmq allow headers that RabbitMQ accepts. Also allow all x- header types.
---
 .../camel-rabbitmq/src/main/docs/rabbitmq-component.adoc | 15 +++++++++++----
 .../component/rabbitmq/RabbitMQMessageConverter.java     | 16 ++++++++++++++--
 2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/components/camel-rabbitmq/src/main/docs/rabbitmq-component.adoc b/components/camel-rabbitmq/src/main/docs/rabbitmq-component.adoc
index d5a5310..5cb1860 100644
--- a/components/camel-rabbitmq/src/main/docs/rabbitmq-component.adoc
+++ b/components/camel-rabbitmq/src/main/docs/rabbitmq-component.adoc
@@ -289,9 +289,12 @@ To connect to RabbitMQ you can setup a `ConnectionFactory` (same as with JMS) wi
   <property name="username" value="camel"/>
   <property name="password" value="bugsbunny"/>
 </bean>
+----
 
 And then refer to the connection factory in the endpoint uri as shown below:
 
+[source,xml]
+----
 <camelContext>
   <route>
     <from uri="direct:rabbitMQEx2"/>
@@ -382,7 +385,7 @@ camel exchange then they will be set on the RabbitMQ message.
 Headers are set by the consumer once the message is received. The
 producer will also set the headers for downstream processors once the
 exchange has taken place. Any headers set prior to production that the
-producer sets will be overriden.
+producer sets will be overridden.
 
 == Message Body
 
@@ -399,6 +402,7 @@ routing key B,
 [source,java]
 ----
 from("rabbitmq:A?routingKey=B")
+  .to("log:cheese");
 ----
 
 To receive messages from a queue with a single thread with auto
@@ -407,13 +411,15 @@ acknowledge disabled.
 [source,java]
 ----
 from("rabbitmq:A?routingKey=B&threadPoolSize=1&autoAck=false")
+  .to("log:cheese");
 ----
 
 To send messages to an exchange called C
 
 [source,java]
 ----
-to("rabbitmq:C")
+from("direct:foo")
+  .to("rabbitmq:C");
 ----
 
 Declaring a headers exchange and queue
@@ -421,15 +427,16 @@ Declaring a headers exchange and queue
 [source,java]
 ----
 from("rabbitmq:ex?exchangeType=headers&queue=q&bindingArgs=#bindArgs")
+  .to("log:cheese");
 ----
 
 and place corresponding `Map<String, Object>` with the id of "bindArgs" in the Registry.
 
-For example declaring a method in spring
+For example declaring a method in Spring
 
 [source,java]
 ----
-@Bean(name="bindArgs")
+@Bean(name = "bindArgs")
 public Map<String, Object> bindArgsBuilder() {
     return Collections.singletonMap("foo", "bar");
 }
diff --git a/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQMessageConverter.java b/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQMessageConverter.java
index 0bbfd20..91172ad 100644
--- a/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQMessageConverter.java
+++ b/components/camel-rabbitmq/src/main/java/org/apache/camel/component/rabbitmq/RabbitMQMessageConverter.java
@@ -20,8 +20,11 @@ import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.ObjectInputStream;
+import java.math.BigDecimal;
+import java.sql.Timestamp;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import com.rabbitmq.client.AMQP;
@@ -166,7 +169,7 @@ public class RabbitMQMessageConverter {
         // TODO: Add support for a HeaderFilterStrategy. See: org.apache.camel.component.jms.JmsBinding#shouldOutputHeader
         for (Map.Entry<String, Object> header : headers.entrySet()) {
             // filter header values.
-            Object value = getValidRabbitMQHeaderValue(header.getValue());
+            Object value = getValidRabbitMQHeaderValue(header.getKey(), header.getValue());
 
             // additionaly filter out the OVERRIDE header so it does not propagate
             if ((value != null || isAllowNullHeaders()) && !header.getKey().equals(RabbitMQConstants.EXCHANGE_OVERRIDE_NAME)) {
@@ -205,7 +208,12 @@ public class RabbitMQMessageConverter {
      * @return the value to use, <tt>null</tt> to ignore this header
      * @see com.rabbitmq.client.impl.Frame#fieldValueSize
      */
-    private Object getValidRabbitMQHeaderValue(Object headerValue) {
+    private Object getValidRabbitMQHeaderValue(String headerKey, Object headerValue) {
+        // accept all x- headers
+        if (headerKey.startsWith("x-") || headerKey.startsWith("X-")) {
+            return headerKey;
+        }
+
         if (headerValue instanceof String) {
             return headerValue;
         } else if (headerValue instanceof Number) {
@@ -218,6 +226,10 @@ public class RabbitMQMessageConverter {
             return headerValue;
         } else if (headerValue instanceof LongString) {
             return headerValue;
+        } else if (headerValue instanceof Map) {
+            return headerValue;
+        } else if (headerValue instanceof List) {
+            return headerValue;
         }
 
         return null;