/*
* � 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);
}
}