[jboss-cvs] JBoss Messaging SVN: r4138 - in projects/jms-perf: src/java/jms and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Apr 30 08:32:56 EDT 2008


Author: jmesnil
Date: 2008-04-30 08:32:56 -0400 (Wed, 30 Apr 2008)
New Revision: 4138

Added:
   projects/jms-perf/src/java/jms/ActiveMQPerfTest.java
   projects/jms-perf/src/java/jms/JBMessagingPerfTest.java
   projects/jms-perf/src/java/jms/QpidPerfTest.java
Modified:
   projects/jms-perf/build.xml
   projects/jms-perf/src/java/jms/ActiveMQCheckTest.java
   projects/jms-perf/src/java/jms/JBMessagingCheckTest.java
   projects/jms-perf/src/java/jms/JMSTestBase.java
   projects/jms-perf/src/java/jms/QpidCheckTest.java
Log:
* added perf test for JBoss Messaging / ActiveMQ / Qpid

Modified: projects/jms-perf/build.xml
===================================================================
--- projects/jms-perf/build.xml	2008-04-29 19:21:30 UTC (rev 4137)
+++ projects/jms-perf/build.xml	2008-04-30 12:32:56 UTC (rev 4138)
@@ -50,16 +50,14 @@
           - jms.provider.test -> the JUnit test classname             
          - - - - - - - - - - - - - - - - - -->
     <target name="jms-provider-test">
-		<junit fork="true">
+		<junit fork="true" showoutput="true">
 			<jvmarg value="-server"/>
 			<jvmarg value="-Djms.server.host=${jms.server.host}"/>
 			<!--
 			<jvmarg value="-agentlib:yjpagent"/>
 			-->
     		<classpath refid="${jms.provider.classpath}" />
-	   		<test name="${jms.provider.test}">
-				<formatter type="brief" usefile="false"/>	   			
-   			</test>
+	   		<test name="${jms.provider.test}" />
 		</junit>
     </target>
 
@@ -72,6 +70,15 @@
     <target name="all-check" description="--> Check all providers by sending/receiving a single message on a queue"
     	depends="jbmessaging-check, activemq-check, qpid-check" />
 
+	<!-- ================================= 
+          target: all-perf 
+          
+          Run perf tests for all providers
+          by sending/receiving many message on a queue             
+         ================================= -->
+    <target name="all-perf" description="--> Run perf tests on all providers"
+		depends="jbmessaging-perf, activemq-perf, qpid-perf" />
+
     <!-- ================================= 
 	      JBoss Messaging 2.0 alpha 
          ================================= -->
@@ -92,7 +99,15 @@
 		</antcall>
     </target>
 
-    <!-- ================================= 
+	<target name="jbmessaging-perf" depends="compile" description="--> perf JBoss Messaging">
+    	<echo>JBMESSAGING_HOME=${jbmessaging.home}</echo>
+		<antcall target="jms-provider-test">
+			<param name="jms.provider.classpath" value="jbmessaging.classpath" />
+			<param name="jms.provider.test" value="jms.JBMessagingPerfTest" />
+		</antcall>
+    </target>
+
+	<!-- ================================= 
 	      ActiveMQ 
          ================================= -->
 
@@ -110,6 +125,14 @@
 		</antcall>
     </target>
 	
+	<target name="activemq-perf" depends="compile" description="--> perf ActiveMQ">
+    	<echo>ACTIVEMQ_HOME=${activemq.home}</echo>
+		<antcall target="jms-provider-test">
+			<param name="jms.provider.classpath" value="activemq.classpath" />
+			<param name="jms.provider.test" value="jms.ActiveMQPerfTest" />
+		</antcall>
+    </target>
+	
     <!-- ================================= 
 	      Qpid 
          ================================= -->
@@ -129,4 +152,11 @@
 		</antcall>
     </target>
 
+	<target name="qpid-perf" depends="compile" description="--> perf Qpid">
+    	<echo>QPID_HOME=${qpid.home}</echo>
+		<antcall target="jms-provider-test">
+			<param name="jms.provider.classpath" value="qpid.classpath" />
+			<param name="jms.provider.test" value="jms.QpidPerfTest" />
+		</antcall>
+    </target>
 </project>

Modified: projects/jms-perf/src/java/jms/ActiveMQCheckTest.java
===================================================================
--- projects/jms-perf/src/java/jms/ActiveMQCheckTest.java	2008-04-29 19:21:30 UTC (rev 4137)
+++ projects/jms-perf/src/java/jms/ActiveMQCheckTest.java	2008-04-30 12:32:56 UTC (rev 4138)
@@ -8,8 +8,6 @@
 
 import java.util.Properties;
 
-import javax.naming.Context;
-
 public class ActiveMQCheckTest extends JMSTestBase
 {
    // Constants -----------------------------------------------------
@@ -24,12 +22,7 @@
 
    public void testSingleMessage() throws Exception
    {
-      Properties props = new Properties();
-      props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
-            "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
-      props.setProperty(Context.PROVIDER_URL, "tcp://" + SERVER_HOST + ":61616");
-      props.setProperty("queue.MyQueue", QUEUE);
-      
+      Properties props = getActiveMQProperties();
       sendAndReceiveSingleMessage(props);
       
       System.out.println("ActiveMQ [OK]");

Added: projects/jms-perf/src/java/jms/ActiveMQPerfTest.java
===================================================================
--- projects/jms-perf/src/java/jms/ActiveMQPerfTest.java	                        (rev 0)
+++ projects/jms-perf/src/java/jms/ActiveMQPerfTest.java	2008-04-30 12:32:56 UTC (rev 4138)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package jms;
+
+import java.util.Properties;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Session;
+
+public class ActiveMQPerfTest extends JMSTestBase
+{
+   // Constants -----------------------------------------------------
+
+   // Attributes ----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   // Public --------------------------------------------------------
+
+   public void testAutoAck_NonPersistent() throws Exception
+   {
+      Properties props = getActiveMQProperties();
+      sendAndReceiveManyMessages(props, Session.AUTO_ACKNOWLEDGE, DeliveryMode.NON_PERSISTENT);
+      
+      System.out.println("ActiveMQ [OK]");
+   }
+
+   public void testClientAck_NonPersistent() throws Exception
+   {
+      Properties props = getActiveMQProperties();
+      sendAndReceiveManyMessages(props, Session.CLIENT_ACKNOWLEDGE, DeliveryMode.NON_PERSISTENT);
+      
+      System.out.println("ActiveMQ [OK]");
+   }
+
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}

Modified: projects/jms-perf/src/java/jms/JBMessagingCheckTest.java
===================================================================
--- projects/jms-perf/src/java/jms/JBMessagingCheckTest.java	2008-04-29 19:21:30 UTC (rev 4137)
+++ projects/jms-perf/src/java/jms/JBMessagingCheckTest.java	2008-04-30 12:32:56 UTC (rev 4138)
@@ -8,8 +8,6 @@
 
 import java.util.Properties;
 
-import javax.naming.Context;
-
 public class JBMessagingCheckTest extends JMSTestBase
 {
    // Constants -----------------------------------------------------
@@ -24,12 +22,7 @@
 
    public void testSingleMessage() throws Exception
    {
-      Properties props = new Properties();      
-      props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
-            "org.jnp.interfaces.NamingContextFactory");
-      props.setProperty(Context.PROVIDER_URL, "jnp://" + SERVER_HOST + ":1099");
-      props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
-      
+      Properties props = getJBMessagingProperties();      
       sendAndReceiveSingleMessage(props);
       
       System.out.println("JBoss Messaging [OK]");

Added: projects/jms-perf/src/java/jms/JBMessagingPerfTest.java
===================================================================
--- projects/jms-perf/src/java/jms/JBMessagingPerfTest.java	                        (rev 0)
+++ projects/jms-perf/src/java/jms/JBMessagingPerfTest.java	2008-04-30 12:32:56 UTC (rev 4138)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package jms;
+
+import java.util.Properties;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Session;
+
+public class JBMessagingPerfTest extends JMSTestBase
+{
+   // Constants -----------------------------------------------------
+
+   // Attributes ----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   // Public --------------------------------------------------------
+
+   public void testAutoAck_NonPersistent() throws Exception
+   {
+      Properties props = getJBMessagingProperties();
+      sendAndReceiveManyMessages(props, Session.AUTO_ACKNOWLEDGE, DeliveryMode.NON_PERSISTENT);
+      
+      System.out.println("JBMessaging [OK]");
+   }
+
+   public void testClientAck_NonPersistent() throws Exception
+   {
+      Properties props = getJBMessagingProperties();
+      sendAndReceiveManyMessages(props, Session.CLIENT_ACKNOWLEDGE, DeliveryMode.NON_PERSISTENT);
+      
+      System.out.println("JBMessaging [OK]");
+   }
+
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}

Modified: projects/jms-perf/src/java/jms/JMSTestBase.java
===================================================================
--- projects/jms-perf/src/java/jms/JMSTestBase.java	2008-04-29 19:21:30 UTC (rev 4137)
+++ projects/jms-perf/src/java/jms/JMSTestBase.java	2008-04-30 12:32:56 UTC (rev 4138)
@@ -6,18 +6,24 @@
  */
 package jms;
 
+import java.util.Enumeration;
 import java.util.Properties;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
+import javax.jms.DeliveryMode;
 import javax.jms.ExceptionListener;
 import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
+import javax.jms.MessageListener;
 import javax.jms.MessageProducer;
 import javax.jms.Queue;
+import javax.jms.QueueBrowser;
 import javax.jms.Session;
 import javax.jms.TextMessage;
+import javax.naming.Context;
 import javax.naming.InitialContext;
 
 import junit.framework.TestCase;
@@ -30,6 +36,8 @@
    protected static final String QUEUE = "MyQueue";
    private static final String TEXT = "hello, world!";
    protected static final String SERVER_HOST;
+   private static final int DURATION = 10000;
+   private static final int WARMUP = DURATION / 10;
 
    // Attributes ----------------------------------------------------
 
@@ -41,19 +49,55 @@
       System.out.println("Connecting to JMS Server on " + SERVER_HOST);
    }
 
+   protected static Properties getActiveMQProperties()
+   {
+      Properties props = new Properties();
+      props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
+            "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
+      props
+            .setProperty(Context.PROVIDER_URL, "tcp://" + SERVER_HOST
+                  + ":61616");
+      props.setProperty("queue.MyQueue", QUEUE);
+      return props;
+   }
+
+   protected static Properties getJBMessagingProperties()
+   {
+      Properties props = new Properties();
+      props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
+            "org.jnp.interfaces.NamingContextFactory");
+      props.setProperty(Context.PROVIDER_URL, "jnp://" + SERVER_HOST + ":1099");
+      props.setProperty(Context.URL_PKG_PREFIXES,
+            "org.jboss.naming:org.jnp.interfaces");
+      return props;
+   }
+
+   protected static Properties getQpidProperties()
+   {
+      Properties props = new Properties();
+      props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
+            "org.apache.qpid.jndi.PropertiesFileInitialContextFactory");
+      props.setProperty("connectionfactory.ConnectionFactory",
+            "amqp://guest:guest@/test?brokerlist='tcp://" + SERVER_HOST
+                  + ":5672'");
+      props.setProperty("queue.MyQueue", "example.MyQueue");
+      return props;
+   }
+
    // Constructors --------------------------------------------------
 
    // Public --------------------------------------------------------
 
    public void sendAndReceiveSingleMessage(Properties props) throws Exception
    {
-      javax.naming.Context ctx = new InitialContext(props);
+      Context ctx = new InitialContext(props);
 
       Queue queue = (Queue) ctx.lookup(QUEUE);
-
+      info("got queue");
       ConnectionFactory factory = (ConnectionFactory) ctx
             .lookup(CONNECTION_FACTORY);
       Connection conn = factory.createConnection();
+      info("created connection");
       conn.setExceptionListener(new ExceptionListener()
       {
          public void onException(JMSException e)
@@ -62,27 +106,144 @@
          }
       });
       Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+      // assertQueueIsEmpty(session, queue);
+      info("created session");
       MessageProducer producer = session.createProducer(queue);
+      producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
       MessageConsumer consumer = session.createConsumer(queue);
 
       conn.start();
+      info("started connection");
 
       producer.send(session.createTextMessage(TEXT));
+      info("sent message");
 
       Message message = consumer.receive(5000);
       assertNotNull(message);
+      info("received message");
       assertTrue(message instanceof TextMessage);
       TextMessage msg = (TextMessage) message;
       assertEquals(TEXT, msg.getText());
 
+      //assertQueueIsEmpty(session, queue);
+      conn.stop();
       conn.close();
    }
 
+   protected void sendAndReceiveManyMessages(Properties props, final int ackMode, int deliveryMode)
+         throws Exception
+   {
+      Context ctx = new InitialContext(props);
+
+      Queue queue = (Queue) ctx.lookup(QUEUE);
+      
+      ConnectionFactory factory = (ConnectionFactory) ctx
+            .lookup(CONNECTION_FACTORY);
+      Connection conn = factory.createConnection();
+      info("created connection");
+      conn.setExceptionListener(new ExceptionListener()
+      {
+         public void onException(JMSException e)
+         {
+            e.printStackTrace();
+         }
+      });
+      conn.start();
+      info("started connection");
+
+      Session session = conn.createSession(false, ackMode);
+      info("created session");
+      // assertQueueIsEmpty(session, queue);
+
+      MessageConsumer consumer = session.createConsumer(queue);
+
+      final AtomicLong receivedCountDuringWarmup = new AtomicLong(0);
+      final AtomicLong receivedCountAfterWarmup = new AtomicLong(0);
+
+      final long start = System.currentTimeMillis();
+
+      consumer.setMessageListener(new MessageListener()
+      {
+         public void onMessage(Message msg)
+         {
+            if (System.currentTimeMillis() - start < WARMUP)
+               receivedCountDuringWarmup.incrementAndGet();
+            else
+               receivedCountAfterWarmup.incrementAndGet();
+            
+            if (ackMode == Session.CLIENT_ACKNOWLEDGE)
+            {
+               try
+               {
+                  msg.acknowledge();
+               } catch (JMSException e)
+               {
+                  e.printStackTrace();
+               }
+            }
+         }
+      });
+
+      MessageProducer producer = session.createProducer(queue);
+      producer.setDeliveryMode(deliveryMode);
+      Message message = session.createTextMessage(TEXT);
+
+      long sentCount = 0;
+      while (System.currentTimeMillis() - start < DURATION)
+      {
+         producer.send(message);
+         sentCount++;
+      }
+      info("sent " + sentCount + " messages");
+      while ((receivedCountDuringWarmup.get() + receivedCountAfterWarmup
+            .get()) < sentCount)
+      {
+         Thread.yield();
+      }
+
+      assertEquals(sentCount, receivedCountDuringWarmup.longValue()
+            + receivedCountAfterWarmup.longValue());
+      //assertQueueIsEmpty(session, queue);
+
+      long duration = System.currentTimeMillis() - start - WARMUP;
+      display(sentCount, receivedCountAfterWarmup.longValue(), duration);
+      
+      conn.stop();
+      conn.close();
+   }
+
    // Package protected ---------------------------------------------
 
    // Protected -----------------------------------------------------
 
    // Private -------------------------------------------------------
 
+   private void info(String info)
+   {
+      if (false)
+         System.out.println(info);
+   }
+
+   private void assertQueueIsEmpty(Session session, Queue queue) throws Exception
+   {
+      QueueBrowser browser = session.createBrowser(queue);
+      Enumeration enumeration = browser.getEnumeration();
+      if (enumeration.hasMoreElements())
+      {
+         fail(queue + "is not empty");
+      }
+      browser.close();
+      info(queue + " is empty");
+   }
+
+   private void display(long requestCount, long responseCount, long periodInMs)
+   {
+      String name = getName().replace("test", "").replace('_', ' ');
+      double rate = 1000 * (double) responseCount / periodInMs;
+      System.out.format(
+            "\n%-32s: %6.0f inv./s (%8d inv. in %5d ms, sent %8d)\n", name,
+            rate, responseCount, periodInMs, requestCount);
+   }
+
    // Inner classes -------------------------------------------------
 }

Modified: projects/jms-perf/src/java/jms/QpidCheckTest.java
===================================================================
--- projects/jms-perf/src/java/jms/QpidCheckTest.java	2008-04-29 19:21:30 UTC (rev 4137)
+++ projects/jms-perf/src/java/jms/QpidCheckTest.java	2008-04-30 12:32:56 UTC (rev 4138)
@@ -8,8 +8,6 @@
 
 import java.util.Properties;
 
-import javax.naming.Context;
-
 public class QpidCheckTest extends JMSTestBase
 {
    // Constants -----------------------------------------------------
@@ -24,12 +22,7 @@
 
    public void testSingleMessage() throws Exception
    {
-      Properties props = new Properties();
-      props.setProperty(Context.INITIAL_CONTEXT_FACTORY,
-      "org.apache.qpid.jndi.PropertiesFileInitialContextFactory");
-      props.setProperty("connectionfactory.ConnectionFactory", "amqp://guest:guest@/test?brokerlist='tcp://" + SERVER_HOST + ":5672'");
-      props.setProperty("queue.MyQueue", "example.MyQueue");
-
+      Properties props = getQpidProperties();
       sendAndReceiveSingleMessage(props);
       
       System.out.println("Qpid [OK]");

Added: projects/jms-perf/src/java/jms/QpidPerfTest.java
===================================================================
--- projects/jms-perf/src/java/jms/QpidPerfTest.java	                        (rev 0)
+++ projects/jms-perf/src/java/jms/QpidPerfTest.java	2008-04-30 12:32:56 UTC (rev 4138)
@@ -0,0 +1,49 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package jms;
+
+import java.util.Properties;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Session;
+
+public class QpidPerfTest extends JMSTestBase
+{
+   // Constants -----------------------------------------------------
+
+   // Attributes ----------------------------------------------------
+
+   // Static --------------------------------------------------------
+
+   // Constructors --------------------------------------------------
+
+   // Public --------------------------------------------------------
+
+   public void testAutoAck_NonPersistent() throws Exception
+   {
+      Properties props = getQpidProperties();
+      sendAndReceiveManyMessages(props, Session.AUTO_ACKNOWLEDGE, DeliveryMode.NON_PERSISTENT);
+      
+      System.out.println("Qpid [OK]");
+   }
+
+   public void testClientAck_NonPersistent() throws Exception
+   {
+      Properties props = getQpidProperties();
+      sendAndReceiveManyMessages(props, Session.CLIENT_ACKNOWLEDGE, DeliveryMode.NON_PERSISTENT);
+      
+      System.out.println("Qpid [OK]");
+   }
+
+   // Package protected ---------------------------------------------
+
+   // Protected -----------------------------------------------------
+
+   // Private -------------------------------------------------------
+
+   // Inner classes -------------------------------------------------
+}




More information about the jboss-cvs-commits mailing list