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 2011/06/13 20:04:12 UTC

svn commit: r1135203 - in /camel/trunk/components/camel-jms/src: main/java/org/apache/camel/component/jms/ test/java/org/apache/camel/component/jms/

Author: davsclaus
Date: Mon Jun 13 18:04:11 2011
New Revision: 1135203

URL: http://svn.apache.org/viewvc?rev=1135203&view=rev
Log:
CAMEL-4100: camel-jms now supports delivery mode as PERSISTENT / NON_PERSISTENT as well.

Modified:
    camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
    camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
    camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsProducerWithJMSHeaderTest.java
    camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteDeliveryModePreserveQoSTest.java

Modified: camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java?rev=1135203&r1=1135202&r2=1135203&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java (original)
+++ camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java Mon Jun 13 18:04:11 2011
@@ -308,9 +308,7 @@ public class JmsBinding {
             } else if (headerName.equals("JMSPriority")) {
                 jmsMessage.setJMSPriority(ExchangeHelper.convertToType(exchange, Integer.class, headerValue));
             } else if (headerName.equals("JMSDeliveryMode")) {
-                Integer deliveryMode = ExchangeHelper.convertToType(exchange, Integer.class, headerValue);
-                jmsMessage.setJMSDeliveryMode(deliveryMode);
-                jmsMessage.setIntProperty(JmsConstants.JMS_DELIVERY_MODE, deliveryMode);
+                JmsMessageHelper.setJMSDeliveryMode(exchange, jmsMessage, headerValue);
             } else if (headerName.equals("JMSExpiration")) {
                 jmsMessage.setJMSExpiration(ExchangeHelper.convertToType(exchange, Long.class, headerValue));
             } else {
@@ -350,7 +348,7 @@ public class JmsBinding {
         if (headerName.startsWith("JMSX")) {
             return false;
         }
-        // IBM WebSphereMQ uses JMS_IBM as special headers
+        // vendors will use JMS_XXX as their special headers (where XXX is vendor name, such as JMS_IBM)
         if (headerName.startsWith("JMS_")) {
             return false;
         }

Modified: camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java?rev=1135203&r1=1135202&r2=1135203&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java (original)
+++ camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java Mon Jun 13 18:04:11 2011
@@ -20,10 +20,14 @@ import java.util.Enumeration;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import javax.jms.DeliveryMode;
 import javax.jms.Destination;
 import javax.jms.JMSException;
 import javax.jms.Message;
 
+import org.apache.camel.Exchange;
+import org.apache.camel.NoTypeConversionAvailableException;
+import org.apache.camel.util.ExchangeHelper;
 import org.apache.camel.util.ObjectHelper;
 
 import static org.apache.camel.component.jms.JmsConfiguration.QUEUE_PREFIX;
@@ -214,4 +218,42 @@ public final class JmsMessageHelper {
         return null;
     }
 
+    /**
+     * Sets the JMSDeliveryMode on the message.
+     *
+     * @param exchange the exchange
+     * @param message  the message
+     * @param deliveryMode  the delivery mode, either as a String or integer
+     * @throws javax.jms.JMSException is thrown if error setting the delivery mode
+     */
+    public static void setJMSDeliveryMode(Exchange exchange, Message message, Object deliveryMode) throws JMSException {
+        int mode = Message.DEFAULT_DELIVERY_MODE;
+
+        if (deliveryMode instanceof String) {
+            String s = (String) deliveryMode;
+            if ("PERSISTENT".equalsIgnoreCase(s)) {
+                mode = DeliveryMode.PERSISTENT;
+            } else if ("NON_PERSISTENT".equalsIgnoreCase(s)) {
+                mode = DeliveryMode.NON_PERSISTENT;
+            } else {
+                // it may be a number in the String so try that
+                Integer value = ExchangeHelper.convertToType(exchange, Integer.class, deliveryMode);
+                if (value != null) {
+                    mode = value;
+                } else {
+                    throw new IllegalArgumentException("Unknown delivery mode with value: " + deliveryMode);
+                }
+            }
+        } else {
+            // fallback and try to convert to a number
+            Integer value = ExchangeHelper.convertToType(exchange, Integer.class, deliveryMode);
+            if (value != null) {
+                mode = value;
+            }
+        }
+
+        message.setJMSDeliveryMode(mode);
+        message.setIntProperty(JmsConstants.JMS_DELIVERY_MODE, mode);
+    }
+
 }

Modified: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsProducerWithJMSHeaderTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsProducerWithJMSHeaderTest.java?rev=1135203&r1=1135202&r2=1135203&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsProducerWithJMSHeaderTest.java (original)
+++ camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsProducerWithJMSHeaderTest.java Mon Jun 13 18:04:11 2011
@@ -96,6 +96,17 @@ public class JmsProducerWithJMSHeaderTes
     }
 
     @Test
+    public void testInOnlyJMSDeliveryModeAsString() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.message(0).header("JMSDeliveryMode").isEqualTo(1);
+
+        template.sendBodyAndHeader("activemq:queue:foo?preserveMessageQos=true", "Hello World", "JMSDeliveryMode", "NON_PERSISTENT");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Test
     public void testInOnlyJMSExpiration() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:result");
         mock.expectedMessageCount(1);

Modified: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteDeliveryModePreserveQoSTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteDeliveryModePreserveQoSTest.java?rev=1135203&r1=1135202&r2=1135203&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteDeliveryModePreserveQoSTest.java (original)
+++ camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsRouteDeliveryModePreserveQoSTest.java Mon Jun 13 18:04:11 2011
@@ -60,6 +60,20 @@ public class JmsRouteDeliveryModePreserv
         assertEquals(DeliveryMode.NON_PERSISTENT, map.get("JMSDeliveryMode"));
     }
 
+    public void testSendNonPersistentAsString() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:bar");
+        mock.expectedBodiesReceived("Hello World");
+
+        template.sendBodyAndHeader("activemq:queue:foo?preserveMessageQos=true", "Hello World", "JMSDeliveryMode", "NON_PERSISTENT");
+
+        assertMockEndpointsSatisfied();
+
+        // should preserve non persistent
+        Map map = mock.getReceivedExchanges().get(0).getIn().getHeaders();
+        assertNotNull(map);
+        assertEquals(DeliveryMode.NON_PERSISTENT, map.get("JMSDeliveryMode"));
+    }
+
     public void testSendPersistent() throws Exception {
         MockEndpoint mock = getMockEndpoint("mock:bar");
         mock.expectedBodiesReceived("Hello World");
@@ -74,6 +88,20 @@ public class JmsRouteDeliveryModePreserv
         assertEquals(DeliveryMode.PERSISTENT, map.get("JMSDeliveryMode"));
     }
 
+    public void testSendPersistentAsString() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:bar");
+        mock.expectedBodiesReceived("Hello World");
+
+        template.sendBodyAndHeader("activemq:queue:foo?preserveMessageQos=true", "Hello World", "JMSDeliveryMode", "PERSISTENT");
+
+        assertMockEndpointsSatisfied();
+
+        // should preserve persistent
+        Map map = mock.getReceivedExchanges().get(0).getIn().getHeaders();
+        assertNotNull(map);
+        assertEquals(DeliveryMode.PERSISTENT, map.get("JMSDeliveryMode"));
+    }
+
     protected CamelContext createCamelContext() throws Exception {
         deleteDirectory("activemq-data");
         CamelContext camelContext = super.createCamelContext();