[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