[jboss-svn-commits] JBL Code SVN: r22477 - in labs/jbossesb/workspace/skeagh/commons/src: test/java/org/jboss/esb/jms and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Sep 7 05:35:49 EDT 2008


Author: tfennelly
Date: 2008-09-07 05:35:45 -0400 (Sun, 07 Sep 2008)
New Revision: 22477

Added:
   labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/JMSTestRunner.java
   labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/MockMessageListener.java
Modified:
   labs/jbossesb/workspace/skeagh/commons/src/main/java/org/jboss/esb/jms/AbstractMessageListener.java
   labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/MessageSendAndListenTest.java
Log:
More JMS Tests.
Added the JMSTestRunner.

Modified: labs/jbossesb/workspace/skeagh/commons/src/main/java/org/jboss/esb/jms/AbstractMessageListener.java
===================================================================
--- labs/jbossesb/workspace/skeagh/commons/src/main/java/org/jboss/esb/jms/AbstractMessageListener.java	2008-09-07 08:51:41 UTC (rev 22476)
+++ labs/jbossesb/workspace/skeagh/commons/src/main/java/org/jboss/esb/jms/AbstractMessageListener.java	2008-09-07 09:35:45 UTC (rev 22477)
@@ -28,12 +28,26 @@
  * Abstract JMS Listener.
  * <p/>
  * Manages destination connection, close and cleanup.
+ * <p/>
+ * A message selector can be set on the listener by simply specifying a "{@link #MESSAGE_SELECTOR messageSelector}"
+ * property in the supplied properties set.  For Topic subscribers, the "{@link #NO_LOCAL noLocal}" parameter can be
+ * set in the same way, by specifying a "{@link #NO_LOCAL noLocal}" property in the properties set ("true"/"false" - default "true"). See
+ * <a href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/jms/TopicSession.html#createSubscriber(javax.jms.Topic,%20java.lang.String,%20boolean)">TopicSession.html.createSubscriber Javadocs.</a>
  *
  * @author <a href="mailto:tom.fennelly at jboss.com">tom.fennelly at jboss.com</a>
  */
 public abstract class AbstractMessageListener extends AbstractMessageHandler implements MessageListener
 {
     /**
+     * Message selector property key.
+     */
+    public static final String MESSAGE_SELECTOR = "messageSelector";
+    /**
+     * "noLocal" selector property key (Topics only).
+     */
+    public static final String NO_LOCAL = "noLocal";
+
+    /**
      * Logger.
      */
     private Logger logger;
@@ -41,6 +55,10 @@
      * JMS Listener.
      */
     private MessageConsumer messageConsumer;
+    /**
+     * JNDI properties.
+     */
+    private Properties properties;
 
     /**
      * Public constructor.
@@ -54,6 +72,7 @@
     {
         super(destinationName, jndiProperties);
         logger = Logger.getLogger(getClass());
+        this.properties = jndiProperties;
     }
 
     /**
@@ -65,16 +84,31 @@
     {
         try
         {
+            String messageSelector = properties.getProperty(MESSAGE_SELECTOR);
+
             logger.debug("Attempting to connect listener '" + getClass().getName() + "' to JMS Destination '" + getDestinationName() + "'.");
 
             // Bind "this" listener to the destination...
             if (getDestination() instanceof Topic)
             {
-                messageConsumer = ((TopicSession) getSession()).createSubscriber((Topic) getDestination());
+                if (messageSelector == null)
+                {
+                    messageConsumer = ((TopicSession) getSession()).createSubscriber((Topic) getDestination());
+                } else
+                {
+                    boolean noLocal = !properties.getProperty(NO_LOCAL, "true").equals("false");
+                    messageConsumer = ((TopicSession) getSession()).createSubscriber((Topic) getDestination(), messageSelector, noLocal);
+                }
                 messageConsumer.setMessageListener(this);
             } else
             {
-                messageConsumer = ((QueueSession) getSession()).createReceiver((Queue) getDestination());
+                if (messageSelector == null)
+                {
+                    messageConsumer = ((QueueSession) getSession()).createReceiver((Queue) getDestination());
+                } else
+                {
+                    messageConsumer = ((QueueSession) getSession()).createReceiver((Queue) getDestination(), messageSelector);
+                }
                 messageConsumer.setMessageListener(this);
             }
 
@@ -112,6 +146,7 @@
 
     /**
      * Is the handler connected.
+     *
      * @return True if the connector is connected, otherwise false.
      */
     public final boolean isConnected()

Added: labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/JMSTestRunner.java
===================================================================
--- labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/JMSTestRunner.java	                        (rev 0)
+++ labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/JMSTestRunner.java	2008-09-07 09:35:45 UTC (rev 22477)
@@ -0,0 +1,72 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright XXXX, Red Hat Middleware LLC, and others contributors as indicated
+ * by the @authors tag. All rights reserved.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * (C) 2005-2008, JBoss Inc.
+ */
+package org.jboss.esb.jms;
+
+import org.apache.activemq.broker.BrokerService;
+import org.apache.activemq.jndi.ActiveMQInitialContextFactory;
+
+import javax.naming.Context;
+import java.io.File;
+import java.util.Properties;
+
+/**
+ * Starts a JMS broker and makes sure it gets shutdown.
+ * <p/>
+ * Search for usages.
+ *
+ * @author <a href="mailto:tom.fennelly at jboss.com">tom.fennelly at jboss.com</a>
+ */
+public abstract class JMSTestRunner
+{
+    private Properties jndiProperties;
+    private String providerUrl;
+
+    public JMSTestRunner(String providerUrl)
+    {
+        jndiProperties = new Properties();
+        jndiProperties.setProperty(Context.INITIAL_CONTEXT_FACTORY, ActiveMQInitialContextFactory.class.getName());
+        jndiProperties.setProperty(Context.PROVIDER_URL, providerUrl);
+        this.providerUrl = providerUrl;
+    }
+
+    public Properties getJndiProperties()
+    {
+        return (Properties) jndiProperties.clone();
+    }
+
+    public void run() throws Exception
+    {
+        BrokerService broker = new BrokerService();
+
+        // configure the broker
+        broker.setDataDirectory(new File("./target/activeMQData"));
+        broker.addConnector(providerUrl);
+
+        broker.start();
+
+        try {
+            test();
+        } finally {
+            broker.stop();
+        }
+    }
+
+    public abstract void test() throws Exception;
+}


Property changes on: labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/JMSTestRunner.java
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/MessageSendAndListenTest.java
===================================================================
--- labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/MessageSendAndListenTest.java	2008-09-07 08:51:41 UTC (rev 22476)
+++ labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/MessageSendAndListenTest.java	2008-09-07 09:35:45 UTC (rev 22477)
@@ -20,16 +20,11 @@
 package org.jboss.esb.jms;
 
 import junit.framework.TestCase;
-import org.apache.activemq.broker.BrokerService;
-import org.apache.activemq.jndi.ActiveMQInitialContextFactory;
 
-import javax.naming.Context;
 import javax.jms.*;
 import java.util.Properties;
 import java.util.List;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.io.File;
 
 /**
  * JMS Send and listen tests.
@@ -38,80 +33,136 @@
  */
 public class MessageSendAndListenTest extends TestCase
 {
-
     private static final String TEST_PROVIDER_URL = "tcp://localhost:61717";    
-    private Properties jndiProperties;
 
-    protected void setUp() throws Exception
+    public void test_Topic_noselector() throws Exception
     {
-        jndiProperties = new Properties();
-        jndiProperties.setProperty(Context.INITIAL_CONTEXT_FACTORY, ActiveMQInitialContextFactory.class.getName());
-        jndiProperties.setProperty(Context.PROVIDER_URL, TEST_PROVIDER_URL);
+        test_Destination_noselector(Topic.class, "jbossesb.testTopic");
     }
 
-    public void test_Topic() throws Exception
+    public void test_Queue_noselector() throws Exception
     {
-        test_Destination(Topic.class, "jbossesb.testTopic");
+        test_Destination_noselector(Queue.class, "jbossesb.testQueue");
     }
 
-    public void test_Queue() throws Exception
+    public void test_Topic_withselector() throws Exception
     {
-        test_Destination(Queue.class, "jbossesb.testQueue");
+        test_Destination_withselector(Topic.class, "jbossesb.testTopic");
     }
 
-    public void test_Destination(Class<? extends Destination> destType, String destName) throws Exception
+    public void test_Queue_withselector() throws Exception
     {
-        BrokerService broker = new BrokerService();
+        test_Destination_withselector(Queue.class, "jbossesb.testQueue");
+    }
 
-        // configure the broker
-        broker.setDataDirectory(new File("./target/activeMQData"));
-        broker.addConnector(TEST_PROVIDER_URL);
+    private void test_Destination_noselector(final Class<? extends Destination> destType, final String destName) throws Exception
+    {
+        new JMSTestRunner(TEST_PROVIDER_URL) {
+            public void test() throws Exception
+            {
+                Properties jndiProperties = getJndiProperties();
 
-        broker.start();
+                if(destType == Topic.class) {
+                    jndiProperties.setProperty("topic." + destName, destName);
+                } else {
+                    jndiProperties.setProperty("queue." + destName, destName);
+                }
 
-        try{
-            final List<TextMessage> messagesReceived = new ArrayList<TextMessage>();
+                MockMessageListener listener = new MockMessageListener(destName, jndiProperties, null);
 
-            if(destType == Topic.class) {
-                jndiProperties.setProperty("topic." + destName, destName);
-            } else {
-                jndiProperties.setProperty("queue." + destName, destName);
+                listener.connect();
+                assertTrue(destType.isAssignableFrom(listener.getDestination().getClass()));
+                try {
+                    MessageSender sender = new MessageSender(destName, jndiProperties);
+                    List<String> messagesSent = Arrays.asList(new String[] {"message 1", "message 2", "message 3"});
+
+                    sender.connect();
+                    assertTrue(destType.isAssignableFrom(sender.getDestination().getClass()));
+                    try {
+                        for (String message : messagesSent)
+                        {
+                            sender.send(sender.getSession().createTextMessage(message));
+                        }
+                    } finally {
+                        sender.close();
+                    }
+
+                    Thread.sleep(1000);
+                    assertEquals(3, listener.messagesReceived.size());
+                    assertTrue(messagesSent.contains(listener.messagesReceived.get(0).getText()));
+                    assertTrue(messagesSent.contains(listener.messagesReceived.get(1).getText()));
+                    assertTrue(messagesSent.contains(listener.messagesReceived.get(2).getText()));
+                } finally {
+                    listener.close();
+                }
             }
+        }.run();
+    }
 
-            AbstractMessageListener listener = new AbstractMessageListener(destName, jndiProperties) {
-                public void onMessage(Message message)
-                {
-                    messagesReceived.add((TextMessage) message);
+    private void test_Destination_withselector(final Class<? extends Destination> destType, final String destName) throws Exception
+    {
+        new JMSTestRunner(TEST_PROVIDER_URL) {
+            public void test() throws Exception
+            {
+                Properties jndiProperties = getJndiProperties();
+
+                if(destType == Topic.class) {
+                    jndiProperties.setProperty("topic." + destName, destName);
+                } else {
+                    jndiProperties.setProperty("queue." + destName, destName);
                 }
-            };
 
-            listener.connect();
-            assertTrue(destType.isAssignableFrom(listener.getDestination().getClass()));
-            try {
-                MessageSender sender = new MessageSender(destName, jndiProperties);
-                List<String> messagesSent = Arrays.asList(new String[] {"message 1", "message 2", "message 2"});
+                MockMessageListener service1 = new MockMessageListener(destName, jndiProperties, "serviceId='service1'");
+                MockMessageListener service2 = new MockMessageListener(destName, jndiProperties, "serviceId='service2'");
+                List<String> service1Messages = Arrays.asList(new String[] {"message 1", "message 2", "message 3"});
+                List<String> service2Messages = Arrays.asList(new String[] {"message 4", "message 5", "message 6"});
 
-                sender.connect();
-                assertTrue(destType.isAssignableFrom(sender.getDestination().getClass()));
+                service1.connect();
                 try {
-                    for (String message : messagesSent)
-                    {
-                        sender.send(sender.getSession().createTextMessage(message));
+                    service2.connect();
+                    try {
+                        MessageSender sender = new MessageSender(destName, jndiProperties);
+
+                        sender.connect();
+                        try {
+                            for (String message : service1Messages)
+                            {
+                                send(sender, message, "service1");
+                            }
+                            for (String message : service2Messages)
+                            {
+                                send(sender, message, "service2");
+                            }
+                        } finally {
+                            sender.close();
+                        }
+
+                        Thread.sleep(1000);
+
+                        assertEquals(3, service1.messagesReceived.size());
+                        assertTrue(service1Messages.contains(service1.messagesReceived.get(0).getText()));
+                        assertTrue(service1Messages.contains(service1.messagesReceived.get(1).getText()));
+                        assertTrue(service1Messages.contains(service1.messagesReceived.get(2).getText()));
+
+                        assertEquals(3, service2.messagesReceived.size());
+                        assertTrue(service2Messages.contains(service2.messagesReceived.get(0).getText()));
+                        assertTrue(service2Messages.contains(service2.messagesReceived.get(1).getText()));
+                        assertTrue(service2Messages.contains(service2.messagesReceived.get(2).getText()));
+                    } finally {
+                        service2.close();
                     }
                 } finally {
-                    sender.close();
+                    service1.close();
                 }
-
-                Thread.sleep(1000);
-                assertEquals(3, messagesReceived.size());
-                assertTrue(messagesSent.contains(messagesReceived.get(0).getText()));
-                assertTrue(messagesSent.contains(messagesReceived.get(1).getText()));
-                assertTrue(messagesSent.contains(messagesReceived.get(2).getText()));
-            } finally {
-                listener.close();
             }
-        } finally {
-            broker.stop();
-        }
+        }.run();
     }
+
+    private void send(MessageSender sender, String message, String service)
+            throws JMSException
+    {
+        TextMessage jmsMessage = sender.getSession().createTextMessage(message);
+        jmsMessage.setStringProperty("serviceId", service);
+        sender.send(jmsMessage);
+    }
 }

Added: labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/MockMessageListener.java
===================================================================
--- labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/MockMessageListener.java	                        (rev 0)
+++ labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/MockMessageListener.java	2008-09-07 09:35:45 UTC (rev 22477)
@@ -0,0 +1,54 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright XXXX, Red Hat Middleware LLC, and others contributors as indicated
+ * by the @authors tag. All rights reserved.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * (C) 2005-2008, JBoss Inc.
+ */
+package org.jboss.esb.jms;
+
+import javax.jms.TextMessage;
+import javax.jms.Message;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Properties;
+
+/**
+ * Mock MessageListener implementation.
+ * @author <a href="mailto:tom.fennelly at jboss.com">tom.fennelly at jboss.com</a>
+*/
+class MockMessageListener extends AbstractMessageListener {
+    
+    public final List<TextMessage> messagesReceived = new ArrayList<TextMessage>();
+
+    protected MockMessageListener(final String destinationName, final Properties jndiProperties, final String selector)
+    {
+        super(destinationName, addSelector(jndiProperties, selector));
+    }
+
+    public void onMessage(Message message)
+    {
+        messagesReceived.add((TextMessage) message);
+    }
+
+    private static Properties addSelector(Properties jndiProperties, String selector)
+    {
+        if(selector != null) {
+            jndiProperties = (Properties) jndiProperties.clone();
+            jndiProperties.setProperty(AbstractMessageListener.MESSAGE_SELECTOR, selector);
+        }
+        return jndiProperties;
+    }
+}


Property changes on: labs/jbossesb/workspace/skeagh/commons/src/test/java/org/jboss/esb/jms/MockMessageListener.java
___________________________________________________________________
Name: svn:eol-style
   + native




More information about the jboss-svn-commits mailing list