/*
* � 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
Subscribe
When you run this program, it will
subscribe to any group of messages specified
in a properties file. [See comments in
MessageMonitor.properties for information on
this file.]
Every message topic being monitored will be
displayed to a Java window.
Usage:
java MessageMonitor
Suggested demonstration:
- Start one instance of this application:
java MessageMonitor
- Run one or more Chat and/or DurableChat window(s).
- Enter messages on the various chat windows.
- Watch the MessageMonitor display the messages.
*/
import org.apache.activemq.*;
import javax.swing.JTextArea;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import javax.swing.text.Highlighter;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.BadLocationException;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.BevelBorder;
import javax.swing.border.SoftBevelBorder;
import java.awt.Toolkit;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.jms.Topic;
import javax.jms.Session;
import javax.jms.Connection;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import java.io.FileInputStream;
import java.util.Vector;
import java.util.Properties;
import java.util.StringTokenizer;
public class MessageMonitor
extends JFrame
{
private static final String DEFAULT_PROPERTIES_FILE = "MessageMonitor.properties";
String propertiesFile = DEFAULT_PROPERTIES_FILE;
String brokerHostPort = "localhost";
String connectID = "MessageMonitor";
String userID = "Administrator";
String subscriptionTopics = "jms.samples.chat";
String textFontName = "Dialog";
String textFontStyle = "PLAIN";
String textFontSize = "12";
String title = "MessageMonitor";
JTextArea textArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(textArea);
JButton clearButton = new JButton("Clear");
Connection connection = null;
Session session = null;
private String user = ActiveMQConnection.DEFAULT_USER;
private String password = ActiveMQConnection.DEFAULT_PASSWORD;
private String url = ActiveMQConnection.DEFAULT_BROKER_URL;
/** Constructor for MessageMonitor window. */
public MessageMonitor()
{
loadProperties();
setTitle(title);
// Connect to Message Broker
try
{
javax.jms.ConnectionFactory factory;
factory = new ActiveMQConnectionFactory(user, password, url);
connection = factory.createConnection (userID, password);
session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
}
catch (javax.jms.JMSException jmse)
{
System.err.println("Cannot connect to Broker");
jmse.printStackTrace();
System.exit(1);
}
// Subscribe to Topics
StringTokenizer topics = new StringTokenizer(subscriptionTopics, ",");
while (topics.hasMoreTokens())
{
try
{
String topicName = topics.nextToken();
System.out.println ("Subscribing to: " + topicName);
new Subscription(session.createTopic(topicName));
}
catch (javax.jms.JMSException jmse)
{
jmse.printStackTrace();
}
}
// Set up the viewing area.
textArea.setEditable(false);
scrollPane.setBorder(new CompoundBorder(new EmptyBorder(6,6,6,6),
new SoftBevelBorder(BevelBorder.LOWERED)));
getContentPane().add(scrollPane,BorderLayout.CENTER);
getContentPane().add(clearButton,BorderLayout.SOUTH);
clearButton.addActionListener(new OnClear());
// Start the connection so that we can now receive messages.
try
{
connection.start();
}
catch (javax.jms.JMSException jmse)
{
System.err.println("Cannot start connection");
jmse.printStackTrace();
System.exit(1);
}
}
/** Class to handle the subsciption to messages. */
public class Subscription implements javax.jms.MessageListener
{
public Subscription(Topic topic)
{
try
{
topicSubscriber = session.createConsumer(topic);
topicSubscriber.setMessageListener(this);
}
catch (javax.jms.JMSException jmse)
{
jmse.printStackTrace();
}
}
/**
* Handle the text message
* (as specified in the javax.jms.MessageListener interface).
*/
public void onMessage(javax.jms.Message message)
{
String msgBody = null;
String msgClass = null;
if (message instanceof javax.jms.TextMessage)
{
msgClass = "javax.jms.TextMessage";
try
{
msgBody = ((javax.jms.TextMessage)message).getText();
}
catch (javax.jms.JMSException jmse)
{
msgBody = "";
}
}
else
{
return;
}
try
{
textArea.append("\n");
textArea.append("-----------------------------------------------------------------------------------------------------\n");
// textArea.append("Class: " + msgClass + "\n");
textArea.append("The following message, received on topic " + ((Topic)message.getJMSDestination()).getTopicName() + ", was sent by\n");
//textArea.append("\n");
textArea.append(msgBody);
// Ensure Appended Text is Visible
Rectangle area = textArea.modelToView(textArea.getText().length());
if (area != null) textArea.scrollRectToVisible(area);
}
catch (javax.jms.JMSException jmse)
{
jmse.printStackTrace();
}
catch (BadLocationException ble)
{
ble.printStackTrace();
}
}
MessageConsumer topicSubscriber = null;
}
//
// 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[] args)
{
// There should be no arguments to this program.
if (args.length > 0) {
printUsage();
System.exit(1);
}
MessageMonitor messageMonitor = new MessageMonitor();
messageMonitor.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
screenSize.height = screenSize.height / 2 ;
screenSize.width = screenSize.width / 2 ;
messageMonitor.setSize(screenSize);
messageMonitor.setVisible(true);
}
/** Prints the usage. */
private static void printUsage()
{
StringBuffer use = new StringBuffer();
use.append("\nusage: MessageMonitor\n\n");
use.append("Properties for this sample can be set in a properties file.\n");
String dfltFile = System.getProperty("propertiesFile", DEFAULT_PROPERTIES_FILE);
use.append("[Default file: " + dfltFile +"]\n\n");
System.out.print(use);
}
/** Load the window and JMS properties from a file. */
private void loadProperties()
{
try
{
Properties properties = new Properties();
propertiesFile = System.getProperty("propertiesFile", propertiesFile);
properties.load(new FileInputStream(propertiesFile));
// Connection Properties
brokerHostPort = properties.getProperty("brokerHostPort",brokerHostPort).trim();
connectID = properties.getProperty("connectID",connectID).trim();
userID = properties.getProperty("userID",userID).trim();
password = properties.getProperty("password",password).trim();
// Subscription Properties
subscriptionTopics = properties.getProperty("subscriptionTopics", subscriptionTopics).trim();
// Text Properties
textFontName = properties.getProperty("textFontName", textFontName).trim();
textFontStyle = properties.getProperty("textFontSize", textFontStyle).trim();
textFontSize = properties.getProperty("textFontSize", textFontSize).trim();
// Window Properties
title = properties.getProperty("title", title).trim();
}
catch (java.io.FileNotFoundException fnfe)
{
System.out.println (propertiesFile + " not found: using defaults"); // Use Defaults
}
catch (java.io.IOException ioe)
{
ioe.printStackTrace();
}
}
/** Class to handle the "Clear" button action. */
public class OnClear implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
textArea.setText("");
}
}
}