From b8facc37b4ecb58fed3da08b5ba507222d977b68 Mon Sep 17 00:00:00 2001 From: "Frederick G. Oconer" Date: Wed, 31 May 2006 04:39:26 +0000 Subject: [PATCH] Module for performance testing. Temporarily used Tools from activemq-optional. git-svn-id: https://svn.apache.org/repos/asf/incubator/activemq/trunk@410428 13f79535-47bb-0310-9956-ffa450edef68 --- activemq-perftest/pom.xml | 47 ++++++ .../apache/activemq/tool/ConsumerTool.java | 140 ++++++++++++++++++ .../apache/activemq/tool/ProducerTool.java | 133 +++++++++++++++++ .../org/apache/activemq/tool/ToolSupport.java | 84 +++++++++++ .../src/main/resources/config/activemq.xml | 94 ++++++++++++ 5 files changed, 498 insertions(+) create mode 100644 activemq-perftest/pom.xml create mode 100644 activemq-perftest/src/main/java/org/apache/activemq/tool/ConsumerTool.java create mode 100644 activemq-perftest/src/main/java/org/apache/activemq/tool/ProducerTool.java create mode 100644 activemq-perftest/src/main/java/org/apache/activemq/tool/ToolSupport.java create mode 100644 activemq-perftest/src/main/resources/config/activemq.xml diff --git a/activemq-perftest/pom.xml b/activemq-perftest/pom.xml new file mode 100644 index 0000000000..c8207bc745 --- /dev/null +++ b/activemq-perftest/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + + activemq-parent + incubator-activemq + 4.0-SNAPSHOT + + + activemq-perftest + jar + ActiveMQ :: Performance Test + Performance Testing Framework for ActiveMQ + + + + junit + junit + 3.8.1 + test + + + incubator-activemq + activemq-core + 4.0-SNAPSHOT + provided + + + incubator-activemq + activemq-console + 4.0-SNAPSHOT + + + + + + + incubator-activemq + maven-perf-plugin + 4.0-SNAPSHOT + + + + + \ No newline at end of file diff --git a/activemq-perftest/src/main/java/org/apache/activemq/tool/ConsumerTool.java b/activemq-perftest/src/main/java/org/apache/activemq/tool/ConsumerTool.java new file mode 100644 index 0000000000..914f9ee631 --- /dev/null +++ b/activemq-perftest/src/main/java/org/apache/activemq/tool/ConsumerTool.java @@ -0,0 +1,140 @@ +/** + * + * Copyright 2005-2006 The Apache Software Foundation + * + * Licensed 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.activemq.tool; + +import javax.jms.Connection; +import javax.jms.JMSException; +import javax.jms.Message; +import javax.jms.MessageConsumer; +import javax.jms.MessageListener; +import javax.jms.Session; +import javax.jms.TextMessage; +import javax.jms.Topic; +import java.io.IOException; + +/** + * A simple tool for consuming messages + * + * @version $Revision$ + */ +public class ConsumerTool extends ToolSupport implements MessageListener { + + protected int count = 0; + protected int dumpCount = 10; + protected boolean verbose = true; + protected int maxiumMessages = 0; + private boolean pauseBeforeShutdown; + + + public static void main(String[] args) { + ConsumerTool tool = new ConsumerTool(); + if (args.length > 0) { + tool.url = args[0]; + } + if (args.length > 1) { + tool.topic = args[1].equalsIgnoreCase("true"); + } + if (args.length > 2) { + tool.subject = args[2]; + } + if (args.length > 3) { + tool.durable = args[3].equalsIgnoreCase("true"); + } + if (args.length > 4) { + tool.maxiumMessages = Integer.parseInt(args[4]); + } + tool.run(); + } + + public void run() { + try { + System.out.println("Connecting to URL: " + url); + System.out.println("Consuming " + (topic ? "topic" : "queue") + ": " + subject); + System.out.println("Using " + (durable ? "durable" : "non-durable") + " subscription"); + + Connection connection = createConnection(); + Session session = createSession(connection); + MessageConsumer consumer = null; + if (durable && topic) { + consumer = session.createDurableSubscriber((Topic) destination, consumerName); + } + else { + consumer = session.createConsumer(destination); + } + if (maxiumMessages <= 0) { + consumer.setMessageListener(this); + } + connection.start(); + + if (maxiumMessages > 0) { + consumeMessagesAndClose(connection, session, consumer); + } + } + catch (Exception e) { + System.out.println("Caught: " + e); + e.printStackTrace(); + } + } + + public void onMessage(Message message) { + try { + if (message instanceof TextMessage) { + TextMessage txtMsg = (TextMessage) message; + if (verbose) { + + String msg = txtMsg.getText(); + if( msg.length() > 50 ) + msg = msg.substring(0, 50)+"..."; + + System.out.println("Received: " + msg); + } + } + else { + if (verbose) { + System.out.println("Received: " + message); + } + } + /* + if (++count % dumpCount == 0) { + dumpStats(connection); + } + */ + } + catch (JMSException e) { + System.out.println("Caught: " + e); + e.printStackTrace(); + } + } + + + protected void consumeMessagesAndClose(Connection connection, Session session, MessageConsumer consumer) throws JMSException, IOException { + System.out.println("We are about to wait until we consume: " + maxiumMessages + " message(s) then we will shutdown"); + + for (int i = 0; i < maxiumMessages; i++) { + Message message = consumer.receive(); + onMessage(message); + } + System.out.println("Closing connection"); + consumer.close(); + session.close(); + connection.close(); + if (pauseBeforeShutdown) { + System.out.println("Press return to shut down"); + System.in.read(); + } + } +} \ No newline at end of file diff --git a/activemq-perftest/src/main/java/org/apache/activemq/tool/ProducerTool.java b/activemq-perftest/src/main/java/org/apache/activemq/tool/ProducerTool.java new file mode 100644 index 0000000000..e8275dee58 --- /dev/null +++ b/activemq-perftest/src/main/java/org/apache/activemq/tool/ProducerTool.java @@ -0,0 +1,133 @@ +/** + * + * Copyright 2005-2006 The Apache Software Foundation + * + * Licensed 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.activemq.tool; + +import java.util.Date; + +import javax.jms.Connection; +import javax.jms.DeliveryMode; +import javax.jms.JMSException; +import javax.jms.MessageProducer; +import javax.jms.Session; +import javax.jms.TextMessage; + +/** + * A simple tool for publishing messages + * + * @version $Revision$ + */ +public class ProducerTool extends ToolSupport { + + protected int messageCount = 10; + protected long sleepTime = 0L; + protected boolean verbose = true; + protected int messageSize = 255; + + public static void main(String[] args) { + runTool(args, new ProducerTool()); + } + + protected static void runTool(String[] args, ProducerTool tool) { + if (args.length > 0) { + tool.url = args[0]; + } + if (args.length > 1) { + tool.topic = args[1].equalsIgnoreCase("true"); + } + if (args.length > 2) { + tool.subject = args[2]; + } + if (args.length > 3) { + tool.durable = args[3].equalsIgnoreCase("true"); + } + if (args.length > 4) { + tool.messageCount = Integer.parseInt(args[4]); + } + if (args.length > 5) { + tool.messageSize = Integer.parseInt(args[5]); + } + tool.run(); + } + + public void run() { + try { + System.out.println("Connecting to URL: " + url); + System.out.println("Publishing a Message with size "+messageSize+" to " + (topic ? "topic" : "queue") + ": " + subject); + System.out.println("Using " + (durable ? "durable" : "non-durable") + " publishing"); + + Connection connection = createConnection(); + Session session = createSession(connection); + MessageProducer producer = createProducer(session); + //connection.start(); + + sendLoop(session, producer); + + System.out.println("Done."); + close(connection, session); + } + catch (Exception e) { + System.out.println("Caught: " + e); + e.printStackTrace(); + } + } + + protected MessageProducer createProducer(Session session) throws JMSException { + MessageProducer producer = session.createProducer(destination); + if (durable) { + producer.setDeliveryMode(DeliveryMode.PERSISTENT); + } + else { + producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); + } + return producer; + } + + protected void sendLoop(Session session, MessageProducer producer) throws Exception { + + for (int i = 0; i < messageCount; i++) { + + + TextMessage message = session.createTextMessage(createMessageText(i)); + + if (verbose) { + String msg = message.getText(); + if( msg.length() > 50 ) + msg = msg.substring(0, 50)+"..."; + System.out.println("Sending message: " + msg); + } + + producer.send(message); + Thread.sleep(sleepTime); + } + producer.send(session.createMessage()); + } + + /** + * @param i + * @return + */ + private String createMessageText(int index) { + StringBuffer buffer = new StringBuffer(messageSize); + buffer.append("Message: " + index + " sent at: " + new Date()); + if( buffer.length() > messageSize ) { + return buffer.substring(0, messageSize); + } + for( int i=buffer.length(); i < messageSize; i++) + buffer.append(' '); + return buffer.toString(); + } +} \ No newline at end of file diff --git a/activemq-perftest/src/main/java/org/apache/activemq/tool/ToolSupport.java b/activemq-perftest/src/main/java/org/apache/activemq/tool/ToolSupport.java new file mode 100644 index 0000000000..04e196244f --- /dev/null +++ b/activemq-perftest/src/main/java/org/apache/activemq/tool/ToolSupport.java @@ -0,0 +1,84 @@ +/** + * + * Copyright 2005-2006 The Apache Software Foundation + * + * Licensed 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.activemq.tool; + +import org.apache.activemq.ActiveMQConnection; +import org.apache.activemq.ActiveMQConnectionFactory; +import org.apache.activemq.util.IndentPrinter; + +import javax.jms.Connection; +import javax.jms.Destination; +import javax.jms.JMSException; +import javax.jms.Session; + +/** + * Abstract base class useful for implementation inheritence + * + * @version $Revision$ + */ +public class ToolSupport { + + + protected Destination destination; + protected String subject = "TOOL.DEFAULT"; + protected boolean topic = true; + protected String user = ActiveMQConnection.DEFAULT_USER; + protected String pwd = ActiveMQConnection.DEFAULT_PASSWORD; + protected String url = ActiveMQConnection.DEFAULT_BROKER_URL; + protected boolean transacted = false; + protected boolean durable = false; + protected String clientID = getClass().getName(); + protected int ackMode = Session.AUTO_ACKNOWLEDGE; + protected String consumerName = "James"; + + + protected Session createSession(Connection connection) throws Exception { + if (durable) { + connection.setClientID(clientID); + } + Session session = connection.createSession(transacted, ackMode); + if (topic) { + destination = session.createTopic(subject); + } + else { + destination = session.createQueue(subject); + } + return session; + } + + protected Connection createConnection() throws JMSException, Exception { + ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, pwd, url); + return connectionFactory.createConnection(); + } + + protected void close(Connection connection, Session session) throws JMSException { + // lets dump the stats + dumpStats(connection); + + if (session != null) { + session.close(); + } + if (connection != null) { + connection.close(); + } + } + + protected void dumpStats(Connection connection) { + ActiveMQConnection c = (ActiveMQConnection) connection; + c.getConnectionStats().dump(new IndentPrinter()); + } +} \ No newline at end of file diff --git a/activemq-perftest/src/main/resources/config/activemq.xml b/activemq-perftest/src/main/resources/config/activemq.xml new file mode 100644 index 0000000000..a635966307 --- /dev/null +++ b/activemq-perftest/src/main/resources/config/activemq.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +