TransactedChat.java Source code

Java tutorial

Introduction

Here is the source code for TransactedChat.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
    
Writing a Basic JMS Application using
- Publish and Subscribe
- Transacted Sessions
- Multiple Sessions
    
Run this program to publish and subscribe to the specified topic.
Messages are buffered and sent when a specific string is seen ("COMMIT").
Messages buffered can be discarded by entering a specified string ("CANCEL").
    
Usage:
  java TransactedChat -b <broker:port> -u <username> -p <password>
  -b broker:port points to your message broker
                 Default: tcp://localhost:61616
  -u username    must be unique (but is not checked)
  -p password    password for user (not checked)
    
Suggested demonstration:
  - In a console window with the environment set, start this
application. In other console windows start other sessions
under different user names. For example:
   java TransactedChat -u ADMINISTRATION
   java TransactedChat -u FACILITIES
  - Type some text and then press Enter.
  - Repeat to create a batch of messages.
  - Send the batched messages by entering the text "COMMIT"
  - Discard the batched messages by entering the text "CANCEL"
    
    
*/
import org.apache.activemq.*;

public class TransactedChat implements javax.jms.MessageListener {
    private static final String APP_TOPIC = "jms.samples.chat";
    private static final String DEFAULT_BROKER_NAME = "tcp://localhost:61616";
    private static final String DEFAULT_PASSWORD = "password";

    private javax.jms.Connection connect = null;
    private javax.jms.Session publishSession = null;
    private javax.jms.Session subscribeSession = null;
    private javax.jms.MessageProducer publisher = null;

    /** Create JMS client for publishing and subscribing to messages. */
    private void chatter(String broker, String username, String password) {
        // Create a connection.
        try {
            javax.jms.ConnectionFactory factory;
            factory = new ActiveMQConnectionFactory(username, password, broker);
            connect = factory.createConnection(username, password);
            // We want to be able up commit/rollback messages published,
            // but not affect messages consumed. Therefore, we need two sessions.
            publishSession = connect.createSession(true, javax.jms.Session.AUTO_ACKNOWLEDGE);
            subscribeSession = connect.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
        } catch (javax.jms.JMSException jmse) {
            System.err.println("error: Cannot connect to Broker - " + broker);
            jmse.printStackTrace();
            System.exit(1);
        }

        // Create Publisher and Subscriber to 'chat' topics
        try {
            javax.jms.Topic topic = subscribeSession.createTopic(APP_TOPIC);
            javax.jms.MessageConsumer subscriber = subscribeSession.createConsumer(topic);
            subscriber.setMessageListener(this);
            publisher = publishSession.createProducer(topic);
            // Now start the Connection
            connect.start();
        } catch (javax.jms.JMSException jmse) {
            jmse.printStackTrace();
        }

        try {
            // Read all standard input and send it as a message.
            java.io.BufferedReader stdin = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
            boolean showMessage = true;
            while (true) {
                if (showMessage) {
                    System.out.println("TransactedChat application:");
                    System.out.println("===========================");
                    System.out.println("The application user " + username + " connects to the broker at "
                            + DEFAULT_BROKER_NAME + ".");
                    System.out.println("The application will stage messages to the " + APP_TOPIC
                            + " topic until you either commit them or roll them back.");
                    System.out.println(
                            "The application also subscribes to that topic to consume any committed messages published there.\n");
                    System.out.println("1. Enter text to publish and then press Enter to stage the message.");
                    System.out.println("2. Add a few messages to the transaction batch.");
                    System.out.println("3. Then, either:");
                    System.out.println(
                            "     o Enter the text 'COMMIT', and press Enter to publish all the staged messages.");
                    System.out.println(
                            "     o Enter the text 'CANCEL', and press Enter to drop the staged messages waiting to be sent.");
                    showMessage = false;
                }
                String s = stdin.readLine();

                if (s == null)
                    exit();
                else if (s.trim().equals("CANCEL")) {
                    // Rollback the messages. A new transaction is implicitly
                    // started for following messages.
                    System.out.println("Cancelling messages...");
                    publishSession.rollback();
                    System.out.println("Staged messages have been cleared.");
                    showMessage = false; // don't show the help message again.
                } else if (s.length() > 0)
                    // See if we should send the messages
                    if (s.trim().equals("COMMIT")) {
                        // Commit (send) the messages. A new transaction is
                        // implicitly  started for following messages.
                        System.out.println("Committing messages... ");
                        publishSession.commit();
                        System.out.println("Staged messages have all been sent.");
                        showMessage = false; // dont't show the help message again.
                    } else {
                        javax.jms.TextMessage msg = publishSession.createTextMessage();
                        msg.setText(username + ": " + s);
                        // Publish the message persistently
                        publisher.send(msg);
                    }
            }
        } catch (java.io.IOException ioe) {
            ioe.printStackTrace();
        } catch (javax.jms.JMSException jmse) {
            jmse.printStackTrace();
        }
    }

    /**
     * Handle the message
     * (as specified in the javax.jms.MessageListener interface).
     */
    public void onMessage(javax.jms.Message aMessage) {
        try {
            // Cast the message as a text message.
            javax.jms.TextMessage textMessage = (javax.jms.TextMessage) aMessage;

            // This handler reads a single String from the
            // message and prints it to the standard output.
            try {
                String string = textMessage.getText();
                System.out.println(string);
            } catch (javax.jms.JMSException jmse) {
                jmse.printStackTrace();
            }
        } catch (java.lang.RuntimeException rte) {
            rte.printStackTrace();
        }
    }

    /** Cleanup resources cleanly and exit. */
    private void exit() {
        try {
            publishSession.rollback(); // Rollback any uncommitted messages.
            connect.close();
        } catch (javax.jms.JMSException jmse) {
            jmse.printStackTrace();
        }

        System.exit(0);
    }

    //
    // NOTE: the remainder of this sample deals with reading arguments
    // and does not utilize any JMS classes or code.
    //

    /** Main program entry point. */
    public static void main(String argv[]) {

        // Is there anything to do?
        if (argv.length == 0) {
            printUsage();
            System.exit(1);
        }

        // Values to be read from parameters
        String broker = DEFAULT_BROKER_NAME;
        String username = null;
        String password = DEFAULT_PASSWORD;

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

            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("-h")) {
                printUsage();
                System.exit(1);
            }

            // Invalid argument
            System.err.println("error: unexpected argument: " + arg);
            printUsage();
            System.exit(1);
        }

        // Check values read in.
        if (username == null) {
            System.err.println("error: user name must be supplied");
            printUsage();
        }

        // Start the JMS client for the "chat".
        TransactedChat chat = new TransactedChat();
        chat.chatter(broker, username, password);

    }

    /** Prints the usage. */
    private static void printUsage() {

        StringBuffer use = new StringBuffer();
        use.append("usage: java TransactedChat (options) ...\n\n");
        use.append("options:\n");
        use.append("  -b name:port Specify name:port of broker.\n");
        use.append("               Default broker: " + DEFAULT_BROKER_NAME + "\n");
        use.append("  -u name      Specify unique user name. (Required)\n");
        use.append("  -p password  Specify password for user.\n");
        use.append("               Default password: " + DEFAULT_PASSWORD + "\n");
        use.append("  -h           This help screen.\n");
        System.err.println(use);
    }
}