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 2009/03/16 14:45:34 UTC

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

Author: davsclaus
Date: Mon Mar 16 13:45:33 2009
New Revision: 754889

URL: http://svn.apache.org/viewvc?rev=754889&view=rev
Log:
CAMEL-898: Introduced JmsMessageType to allow end users to control whuich JMS message type is used for sending jms messages. 

Added:
    camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java   (with props)
    camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsMessageTypeTest.java   (with props)
Removed:
    camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/CamelMessageListener.java
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/JmsConfiguration.java
    camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConstants.java
    camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java
    camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/discovery/JmsDiscoveryTest.java
    camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/discovery/MyService.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=754889&r1=754888&r2=754889&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 Mar 16 13:45:33 2009
@@ -36,7 +36,6 @@
 import javax.jms.Session;
 import javax.jms.StreamMessage;
 import javax.jms.TextMessage;
-import javax.xml.transform.TransformerException;
 
 import org.w3c.dom.Node;
 
@@ -44,13 +43,16 @@
 import org.apache.camel.Exchange;
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.component.file.GenericFile;
-import org.apache.camel.converter.jaxp.XmlConverter;
 import org.apache.camel.spi.HeaderFilterStrategy;
 import org.apache.camel.util.CamelContextHelper;
 import org.apache.camel.util.ExchangeHelper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import static org.apache.camel.component.jms.JmsMessageType.Bytes;
+import static org.apache.camel.component.jms.JmsMessageType.Map;
+import static org.apache.camel.component.jms.JmsMessageType.Object;
+import static org.apache.camel.component.jms.JmsMessageType.Text;
 
 /**
  * A Strategy used to convert between a Camel {@link JmsExchange} and {@link JmsMessage}
@@ -61,7 +63,6 @@
 public class JmsBinding {
     private static final transient Log LOG = LogFactory.getLog(JmsBinding.class);
     private JmsEndpoint endpoint;
-    private XmlConverter xmlConverter = new XmlConverter();
     private HeaderFilterStrategy headerFilterStrategy;
 
     public JmsBinding() {
@@ -137,8 +138,7 @@
                 String name = names.nextElement().toString();
                 try {
                     Object value = jmsMessage.getObjectProperty(name);
-                    if (headerFilterStrategy != null
-                            && headerFilterStrategy.applyFilterToExternalHeaders(name, value)) {
+                    if (headerFilterStrategy != null && headerFilterStrategy.applyFilterToExternalHeaders(name, value)) {
                         continue;
                     }
 
@@ -186,7 +186,7 @@
     public Message makeJmsMessage(Exchange exchange, org.apache.camel.Message camelMessage, Session session)
         throws JMSException {
         Message answer = null;
-        boolean alwaysCopy = (endpoint != null) ? endpoint.getConfiguration().isAlwaysCopyMessage() : false;
+        boolean alwaysCopy = (endpoint != null) && endpoint.getConfiguration().isAlwaysCopyMessage();
         if (!alwaysCopy && camelMessage instanceof JmsMessage) {
             JmsMessage jmsMessage = (JmsMessage)camelMessage;
             if (!jmsMessage.shouldCreateNewMessage()) {
@@ -194,7 +194,7 @@
             }
         }
         if (answer == null) {
-            answer = createJmsMessage(camelMessage.getBody(), session, exchange.getContext());
+            answer = createJmsMessage(camelMessage.getBody(), camelMessage.getHeaders(), session, exchange.getContext());
             appendJmsProperties(answer, exchange, camelMessage);
         }
         return answer;
@@ -291,46 +291,71 @@
         return null;
     }
 
-    protected Message createJmsMessage(Object body, Session session, CamelContext context)
-        throws JMSException {
-        if (body instanceof Node) {
-            // lets convert the document to a String format
-            try {
-                body = xmlConverter.toString((Node)body);
-            } catch (TransformerException e) {
-                JMSException jmsException = new JMSException(e.getMessage());
-                jmsException.setLinkedException(e);
-                throw jmsException;
+    protected Message createJmsMessage(Object body, Map<String, Object> headers, Session session, CamelContext context) throws JMSException {
+        JmsMessageType type = null;
+
+        // check if header have a type set, if so we force to use it
+        if (headers.containsKey(JmsConstants.JMS_MESSAGE_TYPE)) {
+            type = context.getTypeConverter().convertTo(JmsMessageType.class, headers.get(JmsConstants.JMS_MESSAGE_TYPE));
+        } else if (endpoint != null && endpoint.getConfiguration().getJmsMessageType() != null) {
+            // force a specific type from the endpoint configuration
+            type = endpoint.getConfiguration().getJmsMessageType();
+        } else {
+            // let body deterime the type
+            if (body instanceof Node || body instanceof String) {
+                type = Text;
+            } else if (body instanceof byte[] || body instanceof GenericFile || body instanceof File || body instanceof Reader
+                    || body instanceof InputStream || body instanceof ByteBuffer) {
+                type = Bytes;
+            } else if (body instanceof Map) {
+                type = Map;
+            } else if (body instanceof Serializable) {
+                type = Object;
             }
         }
-        if (body instanceof byte[]) {
-            BytesMessage result = session.createBytesMessage();
-            result.writeBytes((byte[])body);
-            return result;
-        }
-        if (body instanceof Map) {
-            MapMessage result = session.createMapMessage();
-            Map<?, ?> map = (Map<?, ?>)body;
-            try {
-                populateMapMessage(result, map, context);
-                return result;
-            } catch (JMSException e) {
-                // if MapMessage creation failed then fall back to Object Message
-                LOG.warn("Cannot populate MapMessage will fall back to ObjectMessage, cause by: " + e.getMessage());
+
+        // create the JmsMessage based on the type
+        if (type != null) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("Using JmsMessageType: " + type);
+            }
+
+            switch (type) {
+            case Text: {
+                TextMessage message = session.createTextMessage();
+                String payload = context.getTypeConverter().convertTo(String.class, body);
+                message.setText(payload);
+                return message;
+            }
+            case Bytes: {
+                BytesMessage message = session.createBytesMessage();
+                byte[] payload = context.getTypeConverter().convertTo(byte[].class, body);
+                message.writeBytes(payload);
+                return message;
+            }
+            case Map: {
+                MapMessage message = session.createMapMessage();
+                Map payload = context.getTypeConverter().convertTo(Map.class, body);
+                populateMapMessage(message, payload, context);
+                return message;
+            }
+            case Object:
+                return session.createObjectMessage((Serializable)body);
+            case Strem:
+                // TODO: Stream is not supported
+                break;
+            default:
+                break;
             }
         }
-        if (body instanceof String) {
-            return session.createTextMessage((String)body);
-        }
-        if (body instanceof GenericFile || body instanceof File || body instanceof Reader || body instanceof InputStream || body instanceof ByteBuffer) {
-            BytesMessage result = session.createBytesMessage();
-            byte[] bytes = context.getTypeConverter().convertTo(byte[].class, body);
-            result.writeBytes(bytes);
-            return result;
-        }
-        if (body instanceof Serializable) {
-            return session.createObjectMessage((Serializable)body);
+
+        // TODO: should we throw an exception instead?
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("Could not determine specific JmsMessage type to use from body."
+                    + " Will use generic JmsMessage. Body class: " + body.getClass().getCanonicalName());
         }
+
+        // return a default message
         return session.createMessage();
     }
 

Modified: camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java?rev=754889&r1=754888&r2=754889&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java (original)
+++ camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java Mon Mar 16 13:45:33 2009
@@ -131,6 +131,7 @@
     private String replyToTempDestinationAffinity = REPLYTO_TEMP_DEST_AFFINITY_PER_ENDPOINT;
     private String replyToDestination;
     private String replyToDestinationSelectorName;
+    private JmsMessageType jmsMessageType;
 
     public JmsConfiguration() {
     }
@@ -1144,4 +1145,12 @@
             setAlwaysCopyMessage(true);
         }
     }
+
+    public JmsMessageType getJmsMessageType() {
+        return jmsMessageType;
+    }
+
+    public void setJmsMessageType(JmsMessageType jmsMessageType) {
+        this.jmsMessageType = jmsMessageType;
+    }
 }

Modified: camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConstants.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConstants.java?rev=754889&r1=754888&r2=754889&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConstants.java (original)
+++ camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConstants.java Mon Mar 16 13:45:33 2009
@@ -17,7 +17,7 @@
 package org.apache.camel.component.jms;
 
 /**
- * Constants
+ * JMS constants
  */
 public final class JmsConstants {
 
@@ -25,6 +25,8 @@
 
     public static final String JMS_DESTINATION = "JMSDestination";
 
+    public static final String JMS_MESSAGE_TYPE = "CamelJmsMessageType";
+
     private JmsConstants() {
         // utility class
     }

Modified: camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java?rev=754889&r1=754888&r2=754889&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java (original)
+++ camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsEndpoint.java Mon Mar 16 13:45:33 2009
@@ -763,6 +763,14 @@
         getConfiguration().setUseVersion102(useVersion102);
     }
 
+    public JmsMessageType getJmsMessageType() {
+        return getConfiguration().getJmsMessageType();
+    }
+
+    public void setJmsMessageType(JmsMessageType jmsMessageType) {
+        getConfiguration().setJmsMessageType(jmsMessageType);
+    }
+
     // Implementation methods
     //-------------------------------------------------------------------------
 

Added: camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java?rev=754889&view=auto
==============================================================================
--- camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java (added)
+++ camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java Mon Mar 16 13:45:33 2009
@@ -0,0 +1,28 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jms;
+
+/**
+ * Enum for different {@link javax.jms.Message} types.
+ *
+ * @version $Revision$
+ */
+public enum JmsMessageType {
+
+    Bytes, Map, Object, Strem, Text
+
+}

Propchange: camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageType.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsMessageTypeTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsMessageTypeTest.java?rev=754889&view=auto
==============================================================================
--- camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsMessageTypeTest.java (added)
+++ camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsMessageTypeTest.java Mon Mar 16 13:45:33 2009
@@ -0,0 +1,238 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.jms;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import javax.jms.ConnectionFactory;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.TypeConverter;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import static org.apache.camel.component.jms.JmsComponent.jmsComponentClientAcknowledge;
+import static org.apache.camel.component.jms.JmsConstants.JMS_MESSAGE_TYPE;
+
+/**
+ * @version $Revision$
+ */
+public class JmsMessageTypeTest extends ContextTestSupport {
+
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext camelContext = super.createCamelContext();
+
+        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
+        camelContext.addComponent("jms", jmsComponentClientAcknowledge(connectionFactory));
+
+        camelContext.getTypeConverterRegistry().addTypeConverter(byte[].class, MyFooBean.class, new MyFooBean());
+        camelContext.getTypeConverterRegistry().addTypeConverter(String.class, MyFooBean.class, new MyFooBean());
+        camelContext.getTypeConverterRegistry().addTypeConverter(Map.class, MyFooBean.class, new MyFooBean());
+
+        return camelContext;
+    }
+
+    public void testHeaderTextType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Hello World");
+        // we use Text type then it should be a String
+        mock.message(0).body().isInstanceOf(String.class);
+
+        template.sendBodyAndHeader("direct:foo", new MyFooBean("World"), JMS_MESSAGE_TYPE, "Text");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testConvertTextType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Hello World");
+        // we use Text type then it should be a String
+        mock.message(0).body().isInstanceOf(String.class);
+
+        // we send an object and fore it to use Text type
+        template.sendBody("direct:text", new MyFooBean("World"));
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testTextType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Hello World");
+        // we use Text type then it should be a String
+        mock.message(0).body().isInstanceOf(String.class);
+
+        // we send an object and fore it to use Text type
+        template.sendBody("direct:text", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHeaderBytesType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Bye World".getBytes());
+        mock.message(0).body().isInstanceOf(byte[].class);
+
+        template.sendBodyAndHeader("direct:foo", new MyFooBean("World"), JMS_MESSAGE_TYPE, "Bytes");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testConvertBytesType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Bye World".getBytes());
+        mock.message(0).body().isInstanceOf(byte[].class);
+
+        // we send an object and fore it to use Bytes type
+        template.sendBody("direct:bytes", new MyFooBean("World"));
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testBytesType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived("Bye World".getBytes());
+        mock.message(0).body().isInstanceOf(byte[].class);
+
+        // we send an object and fore it to use Text type
+        template.sendBody("direct:bytes", "Bye World".getBytes());
+
+        assertMockEndpointsSatisfied();
+    }
+
+    public void testHeaderMapType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(Map.class);
+
+        template.sendBodyAndHeader("direct:foo", new MyFooBean("Claus"), JMS_MESSAGE_TYPE, "Map");
+
+        assertMockEndpointsSatisfied();
+
+        assertEquals("Claus", mock.getExchanges().get(0).getIn().getBody(Map.class).get("name"));
+    }
+
+    public void testConvertMapType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(Map.class);
+
+        template.sendBody("direct:map", new MyFooBean("Claus"));
+
+        assertMockEndpointsSatisfied();
+
+        assertEquals("Claus", mock.getExchanges().get(0).getIn().getBody(Map.class).get("name"));
+    }
+
+    public void testMapType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        mock.message(0).body().isInstanceOf(Map.class);
+
+        Map body = new HashMap();
+        body.put("name", "Claus");
+
+        template.sendBody("direct:map", body);
+
+        assertMockEndpointsSatisfied();
+
+        assertEquals("Claus", mock.getExchanges().get(0).getIn().getBody(Map.class).get("name"));
+    }
+
+    public void testHeaderObjectType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        // we use Text type then it should be a String
+        mock.message(0).body().isInstanceOf(MyFooBean.class);
+
+        // we send an object and fore it to use Text type
+        template.sendBodyAndHeader("direct:foo", new MyFooBean("James"), JMS_MESSAGE_TYPE, "Object");
+
+        assertMockEndpointsSatisfied();
+
+        assertEquals("James", mock.getExchanges().get(0).getIn().getBody(MyFooBean.class).getName());
+    }
+
+    public void testObjectType() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(1);
+        // we use Text type then it should be a String
+        mock.message(0).body().isInstanceOf(MyFooBean.class);
+
+        // we send an object and fore it to use Text type
+        template.sendBody("direct:object", new MyFooBean("James"));
+
+        assertMockEndpointsSatisfied();
+
+        assertEquals("James", mock.getExchanges().get(0).getIn().getBody(MyFooBean.class).getName());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:text").to("jms:queue:foo?jmsMessageType=Text");
+                from("direct:bytes").to("jms:queue:foo?jmsMessageType=Bytes");
+                from("direct:map").to("jms:queue:foo?jmsMessageType=Map");
+                from("direct:object").to("jms:queue:foo?jmsMessageType=Object");
+
+                from("direct:foo").to("jms:queue:foo");
+
+                from("jms:queue:foo").to("mock:result");
+            }
+        };
+    }
+
+    public static final class MyFooBean implements TypeConverter, Serializable {
+
+        private String name;
+
+        private MyFooBean() {
+        }
+
+        private MyFooBean(String name) {
+            this.name = name;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        @SuppressWarnings("unchecked")
+        public <T> T convertTo(Class<T> type, Object value) {
+            if (type.isAssignableFrom(String.class)) {
+                return (T) ("Hello " + ((MyFooBean)value).getName());
+            }
+            if (type.isAssignableFrom(byte[].class)) {
+                return (T) ("Bye " + ((MyFooBean)value).getName()).getBytes();
+            }
+            if (type.isAssignableFrom(Map.class)) {
+                Map<String, Object> map = new HashMap<String, Object>();
+                map.put("name", ((MyFooBean)value).getName());
+                return (T) map;
+            }
+            return null;
+        }
+
+        public <T> T convertTo(Class<T> type, Exchange exchange, Object value) {
+            return convertTo(type, value);
+        }
+    }
+}

Propchange: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsMessageTypeTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/JmsMessageTypeTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/discovery/JmsDiscoveryTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/discovery/JmsDiscoveryTest.java?rev=754889&r1=754888&r2=754889&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/discovery/JmsDiscoveryTest.java (original)
+++ camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/discovery/JmsDiscoveryTest.java Mon Mar 16 13:45:33 2009
@@ -18,7 +18,6 @@
 
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.jms.ConnectionFactory;
 import javax.naming.Context;
 
@@ -26,6 +25,7 @@
 import org.apache.camel.CamelContext;
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
 import static org.apache.camel.component.jms.JmsComponent.jmsComponentClientAcknowledge;
 
 /**
@@ -35,13 +35,10 @@
     protected MyRegistry registry = new MyRegistry();
 
     public void testDiscovery() throws Exception {
-        // lets wait to see if we get 3 services
-        for (int i = 0; i < 15; i++) {
-            Thread.sleep(1000);
-            if (registry.getServices().size() == 3) {
-                break;
-            }
-        }
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMessageCount(3);
+
+        assertMockEndpointsSatisfied();
 
         Map<String, Map> map = new HashMap<String, Map>(registry.getServices());
         assertEquals("Size of map: " + map, 3, map.size());
@@ -70,12 +67,12 @@
         return new RouteBuilder() {
             public void configure() throws Exception {
                 // lets setup the heartbeats
-                from("bean:service1?method=status").to("activemq:topic:registry.heartbeats");
-                from("bean:service2?method=status").to("activemq:topic:registry.heartbeats");
-                from("bean:service3?method=status").to("activemq:topic:registry.heartbeats");
+                from("bean:service1?method=status?delay=5000&exchangePattern=InOnly").to("activemq:topic:registry.heartbeats");
+                from("bean:service2?method=status?delay=5000&exchangePattern=InOnly").to("activemq:topic:registry.heartbeats");
+                from("bean:service3?method=status?delay=5000&exchangePattern=InOnly").to("activemq:topic:registry.heartbeats");
 
-                from("activemq:topic:registry.heartbeats?cacheLevelName=CACHE_CONSUMER").to("bean:registry?method=onEvent");
+                from("activemq:topic:registry.heartbeats?cacheLevelName=CACHE_CONSUMER").to("bean:registry?method=onEvent", "mock:result");
             }
         };
     }
-}
\ No newline at end of file
+}

Modified: camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/discovery/MyService.java
URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/discovery/MyService.java?rev=754889&r1=754888&r2=754889&view=diff
==============================================================================
--- camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/discovery/MyService.java (original)
+++ camel/trunk/components/camel-jms/src/test/java/org/apache/camel/component/jms/discovery/MyService.java Mon Mar 16 13:45:33 2009
@@ -33,7 +33,7 @@
     public Map status() {
         Map answer = new HashMap();
         answer.put("name", name);
-        answer.put("time", new Date());
+        answer.put("time", new Date().getTime());
         return answer;
     }
 }