QueueRoundTrip.java Source code

Java tutorial

Introduction

Here is the source code for QueueRoundTrip.java

Source

/*
 *  2001-2009, Progress Software Corporation and/or its subsidiaries or affiliates.  All rights reserved.
 *
 * 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.
     
Sample Application
    
Queue/PTP
Send and receive using multiple sessions and a temporary queue
    
This sample shows the round trip time for a message being sent to the broker
and received. A temporary queue is used to guarantee that each instance of this
sample receives its own messages only.
    
Usage:
    
java QueueRoundTrip -b <broker:port> -u <username> -p <password> -n <numTests> -h
    Optional Parameters:
    -b  broker:port    Broker name and port of your message server
                        Default: tcp://localhost:61616
    -u  username       Default: user (username required)
    -p  password       Default: password (not checked)
    -n  numTests       The number of messages to be sent/received
                       Default: 100
    -h                 Prints help screen.
 */
import org.apache.activemq.*;

public class QueueRoundTrip {
    private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
    private static final String DEFAULT_PASSWORD = "password";
    private static final String DEFAULT_USER_NAME = "user";
    private static final int DEFAULT_NUM_TESTS = 100;

    private static final int msgSize = 1400;
    private static byte[] msgBody = new byte[msgSize];

    private javax.jms.ConnectionFactory factory = null;
    private javax.jms.Connection connection = null;
    private javax.jms.Session sendSession = null;
    private javax.jms.Session receiveSession = null;
    private javax.jms.MessageProducer sender = null;
    private javax.jms.MessageConsumer receiver = null;

    private void QueueRoundTripper(String broker, String username, String password, int numTests) {

        try {
            //Set up two sessions, one for sending and the other for receiving
            factory = new ActiveMQConnectionFactory(username, password, broker);
            connection = factory.createConnection(username, password);
            sendSession = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
            receiveSession = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
        } catch (javax.jms.JMSException jmse) {
            System.err.println("error: Cannot connect to broker- " + broker + ".\n");
            jmse.printStackTrace();
            System.exit(1);
        }

        try {
            //Set up a temporary Queue:
            javax.jms.TemporaryQueue tempQueue = sendSession.createTemporaryQueue();
            receiver = receiveSession.createConsumer(tempQueue);
            sender = sendSession.createProducer(tempQueue);
            connection.start();
        } catch (javax.jms.JMSException jmse) {
            System.err.println("error: Connection couldn't be started.\n");
            jmse.printStackTrace();
            System.exit(1);
        }

        //Send messages using Temporary Queue:
        try {
            System.out.println("QueueRoundTrip application:");
            System.out.println("===========================");
            System.out.println("Sending Messages to Temporary Queue...");

            //create a message to send
            javax.jms.BytesMessage msg = sendSession.createBytesMessage();
            msg.writeBytes(msgBody);

            //send and receive the message the specified number of times:
            long time = System.currentTimeMillis();
            for (int i = 0; i < numTests; i++) {
                sender.send(msg);
                msg = (javax.jms.BytesMessage) receiver.receive();
            }
            time = System.currentTimeMillis() - time;

            System.out.println("\nTime for " + numTests + " sends and receives:\t\t" + time + "ms\n"
                    + "Average Time per message:\t\t\t" + (float) time / (float) numTests + "ms\n");
            System.out.println("\n\nPress Enter to close this window.");
            java.io.BufferedReader stdin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
            stdin.readLine();
            System.exit(0);
        }

        catch (javax.jms.JMSException jmse) {
            System.err.println("error: message not sent/received.\n");
            jmse.printStackTrace();
            System.exit(1);
        }

        catch (java.io.IOException ioe) {
            ioe.printStackTrace();
        }

    }

    /** Cleanup resources and then exit. */
    private void exit() {
        try {
            connection.close();
        } catch (javax.jms.JMSException jmse) {
            jmse.printStackTrace();
        }

        System.exit(0);
    }

    public static void main(String argv[]) {
        // Values to be read from parameters
        String broker = DEFAULT_BROKER_NAME;
        String username = DEFAULT_USER_NAME;
        String password = DEFAULT_PASSWORD;
        int numTests = DEFAULT_NUM_TESTS;

        // Check parameters
        if (argv.length > 0) {
            for (int i = 0; i < argv.length; i++) {
                String arg = argv[i];

                // Options
                if (!arg.startsWith("-")) {
                    System.err.println("error: unexpected argument - " + arg);
                    printUsage();
                    System.exit(1);
                } else {
                    if (arg.equals("-b")) {
                        if (i == argv.length - 1 || argv[i + 1].startsWith("-")) {
                            System.err.println("error: missing broker name:port");
                            System.exit(1);
                        }
                        broker = argv[++i];
                        continue;
                    }

                    if (arg.equals("-u")) {
                        if (i == argv.length - 1 || argv[i + 1].startsWith("-")) {
                            System.err.println("error: missing user name");
                            System.exit(1);
                        }
                        username = argv[++i];
                        continue;
                    }

                    if (arg.equals("-p")) {
                        if (i == argv.length - 1 || argv[i + 1].startsWith("-")) {
                            System.err.println("error: missing password");
                            System.exit(1);
                        }
                        password = argv[++i];
                        continue;
                    }
                    if (arg.equals("-n")) {
                        if (i == argv.length - 1 || argv[i + 1].startsWith("-")) {
                            System.err.println("error: missing number of test to run.");
                            System.exit(1);
                        }
                        numTests = (new Integer(argv[++i])).intValue();
                        continue;
                    }

                    if (arg.equals("-h")) {
                        printUsage();
                        System.exit(1);
                    }
                }
            }
        }

        // create the payload
        byte charToWrite = (0x30);
        for (int i = 0; i < msgSize; i++) {
            msgBody[i] = charToWrite;
            charToWrite = (byte) ((int) charToWrite + (int) 0x01);
            if (charToWrite == (0x39)) {
                charToWrite = (0x30);
            }
        }

        // Start the JMS client for the test.
        QueueRoundTrip queueRoundTripper = new QueueRoundTrip();
        queueRoundTripper.QueueRoundTripper(broker, username, password, numTests);

    }

    private static void printUsage() {
        StringBuffer use = new StringBuffer();

        use.append("Usage:\n");
        use.append("java QueueRoundTrip (options)...\n\n");
        use.append("options:\n");
        use.append("-b  broker:port    Broker name and port of your message server\n");
        use.append("                   Default: tcp://localhost:61616\n");
        use.append("-u  username       Default: user (username required)\n");
        use.append("-p  password       Default: password (not checked)\n");
        use.append("-n  numTests       The number of messages to be sent/received\n");
        use.append("                   Default: 100\n");
        use.append("-h                 This help screen");
        System.err.println(use);
    }

}