This example illustrates how JMS (Java Message Service) API can be used in a Java applet : Java Message Service JMS « J2EE « Java






This example illustrates how JMS (Java Message Service) API can be used in a Java applet

 

/*
 * @(#)MQApplet.java  1.1 10/10/03
 *
 * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license
 * to use, modify and redistribute this software in source and binary
 * code form, provided that i) this copyright notice and license
 * appear on all copies of the software; and ii) Licensee does not
 * utilize the software in a manner which is disparaging to Sun.
 *
 * This software is provided "AS IS," without a warranty of any kind.
 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
 * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE
 * SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS
 * BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
 * HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING
 * OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * This software is not designed or intended for use in on-line
 * control of aircraft, air traffic, aircraft navigation or aircraft
 * communications; or in the design, construction, operation or
 * maintenance of any nuclear facility. Licensee represents and
 * warrants that it will not use or redistribute the Software for such
 * purposes.
 */



================================================================================
@(#)README  1.6 03/22/05
================================================================================

JMS Applet example

Description
-----------
This example illustrates how JMS API can be used in a Java applet.
MQApplet is a simple chat applet. It can be used with any Java enabled
browser.

Files
-----
MQApplet.java   Source file for this example.
mqapplet.html   HTML Source file for the applet.
README          This file.
build.xml       Build rules (for Jakarta Ant).

Configuring the environment
---------------------------
To recompile or run this example, you may need to modify the build.xml
file. Please change the value of the "libdir" property as appropriate.
It should point to the directory that contains the "imq.jar" and
"jms.jar" files.

Building the example
--------------------

* Set the JAVA_HOME environment variable to point to the JDK.
* Simply run the Jakarta ant build tool to build the applet.

The applet compilation process is a bit different from the typical
standalone Message Queue clients. It needs to do the following things -

* Compile MQApplet.java into MQApplet.class
* Bundle MQApplet.class into a jar file -> mqapplet.jar
* Copy the imq.jar and jms.jar files to a local directory.
* Generate a self signed certificate using keytool.
* Sign mqapplet.jar, imq.jar and jms.jar using this certificate.
  Applets must be signed if they need to do anything non-trivial.
  Otherwise you will get security exceptions at runtime.

Running the example applet
--------------------------

The build script places all the files necessary for running this
applet into a new directory named "install". Copy all the contents of
this directory somewhere under a web server's document root. This
includes -

    * mqapplet.html
    * Signed Jar files : mqapplet.jar, imq.jar, jms.jar

After this, the applet can be run by simply pointing the browser to
the "mqapplet.html" file.

After the applet is loaded, the web browser (Java plugin) should open
a dialog box asking for permission to run a signed applet. Click on
the "Yes" button.

When the applet starts running it will not automatically connect to
a Message Queue broker. Please specify the broker's address and click 
on the "Connect" button. 

Running as a standalone application
-----------------------------------

The MQApplet.class(build/MQApplet.class) can also be used as a 
standalone application. It presents the same UI as the applet. To run 
this example as a standalone application, you need to set CLASSPATH 
to include at least:
    jms.jar
    imq.jar
    directory containing this example

A detailed guideline on setting CLASSPATH is found in the README
file in the jms demo subdirectory as well as in the "Quick Start
Tutorial" in the Sun Java(tm) System Message Queue Developer's Guide.

The following are examples for setting CLASSPATH on the different
platforms. These commands are run from the directory containing
this example.

On Solaris:
    setenv CLASSPATH /usr/share/lib/jms.jar:/usr/share/lib/imq.jar:.

On Windows:
    set CLASSPATH=%IMQ_HOME%\lib\jms.jar;%IMQ_HOME%\lib\imq.jar;.

On Linux:
    setenv CLASSPATH /opt/sun/mq/share/lib/jms.jar:
  /opt/sun/mq/share/lib/imq.jar:.

#####hpux-dev#####
On HP-UX:
    export CLASSPATH=/opt/sun/mq/share/lib/jms.jar:/opt/sun/mq/share/lib/imq.jar:.

Note that it is assumed that the above export command is run on
BASH shell


After setting the CLASSPATH, simply run -
    java MQApplet

Obviously, you don't need the signed jar files for running as
a standalone application.




/*
 * @(#)MQApplet.java  1.1 10/10/03
 *
 * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Sun grants you ("Licensee") a non-exclusive, royalty free, license
 * to use, modify and redistribute this software in source and binary
 * code form, provided that i) this copyright notice and license
 * appear on all copies of the software; and ii) Licensee does not
 * utilize the software in a manner which is disparaging to Sun.
 *
 * This software is provided "AS IS," without a warranty of any kind.
 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
 * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
 * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE
 * SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS
 * BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
 * HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING
 * OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS
 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 *
 * This software is not designed or intended for use in on-line
 * control of aircraft, air traffic, aircraft navigation or aircraft
 * communications; or in the design, construction, operation or
 * maintenance of any nuclear facility. Licensee represents and
 * warrants that it will not use or redistribute the Software for such
 * purposes.
 */

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

import javax.swing.*;
import javax.swing.event.*;

import javax.jms.*;

/**
 * This is a simple chat applet that uses JMS APIs. It uses publish
 * subscribe model. It can also be run as a standalone application.
 */
public class MQApplet extends JApplet
    implements ActionListener, ExceptionListener, MessageListener {
    private static boolean DEBUG = Boolean.getBoolean("mqapplet.debug");
    private static String TRANSPORT;
    static {
        TRANSPORT = System.getProperty("mqapplet.transport");
        if (TRANSPORT == null)
            TRANSPORT = "";
    }

    private JPanel mainPanel;
    private StatusPanel statusBar;
    private JTextField urlField;
    private JTextField hostField, portField;
    private JTextField addrField;

    private JTextArea txArea, rxArea;
    JButton connectButton, exitButton, clearButton, sendButton;

    private boolean createExitButton = false;

    public void init() {
        initGUI();
        initJMS();
    }

    public void destroy() {
        shutdownJMS();
        shutdownGUI();
    }

    private void enableExit() {
        createExitButton = true;
    }

    private void initGUI() {
        // The application window contains the 'mainPanel' container
        // and a status bar.
        Container content = getContentPane();

        // Create the mainPanel container. It holds all the UI
        // components...
        mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());
        content.add("Center", mainPanel);

        // Create the status bar..
        statusBar = new StatusPanel();
        content.add("South", statusBar);

        //
        // Now start populating mainPanel...
        //

        // dialogPanel contains JMS configuration and the connect
        // button.
        JPanel dialogPanel = new JPanel();
        dialogPanel.setLayout(
            new BoxLayout(dialogPanel, BoxLayout.Y_AXIS));
        dialogPanel.setBorder(
            createMyBorder("JMS Connection Properties..."));

        JPanel dummyPanel;

        if (TRANSPORT.equalsIgnoreCase("http")) {
            dummyPanel = new JPanel();
            dummyPanel.setLayout(new BoxLayout(dummyPanel, BoxLayout.X_AXIS));
            dummyPanel.add(new JLabel("imqConnectionURL : "));
            urlField = new JTextField("http://");
            dummyPanel.add(urlField);
            dialogPanel.add(dummyPanel);
        }
        else if (TRANSPORT.equalsIgnoreCase("tcp")) {
            dummyPanel = new JPanel();
            dummyPanel.setLayout(new BoxLayout(dummyPanel, BoxLayout.X_AXIS));
            dummyPanel.add(new JLabel("imqBrokerHostName : "));
            hostField = new JTextField("localhost");
            dummyPanel.add(hostField);
            dialogPanel.add(dummyPanel);

            dummyPanel = new JPanel();
            dummyPanel.setLayout(new BoxLayout(dummyPanel, BoxLayout.X_AXIS));
            dummyPanel.add(new JLabel("imqBrokerHostPort : "));
            portField = new JTextField("7676");
            dummyPanel.add(portField);
            dialogPanel.add(dummyPanel);
        }
        else {
            dummyPanel = new JPanel();
            dummyPanel.setLayout(new BoxLayout(dummyPanel, BoxLayout.X_AXIS));
            dummyPanel.add(new JLabel("imqAddressList : "));
            addrField = new JTextField("mq://localhost:7676");
            dummyPanel.add(addrField);
            dialogPanel.add(dummyPanel);
        }

        dummyPanel = new JPanel();
        dummyPanel.setLayout(new BoxLayout(dummyPanel, BoxLayout.X_AXIS));

        connectButton = new JButton();
        connectButton.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createEmptyBorder(3, 0, 3, 3),
            connectButton.getBorder()));
        connectButton.addActionListener(this);
        setConnectButton("Connect");
        dummyPanel.add(connectButton);

        if (createExitButton) {
            exitButton = new JButton("Exit");
            exitButton.setBorder(BorderFactory.createCompoundBorder(
                BorderFactory.createEmptyBorder(3, 3, 3, 3),
                exitButton.getBorder()));
            exitButton.addActionListener(this);
            dummyPanel.add(exitButton);
        }

        dialogPanel.add(dummyPanel);

        JPanel messagePanel = new JPanel();
        messagePanel.setLayout(new GridLayout(2, 1));

        dummyPanel = new JPanel();
        dummyPanel.setLayout(new BoxLayout(dummyPanel, BoxLayout.Y_AXIS));
        dummyPanel.setBorder(createMyBorder("Received messages "));

        rxArea = new JTextArea();
        rxArea.setEditable(false);
        JScrollPane spane = new JScrollPane(rxArea,
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        dummyPanel.add(spane);

        clearButton = new JButton("Clear");
        clearButton.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createEmptyBorder(3, 3, 3, 3),
            clearButton.getBorder()));
        clearButton.addActionListener(this);
        dummyPanel.add(clearButton);
        messagePanel.add(dummyPanel);

        dummyPanel = new JPanel();
        dummyPanel.setLayout(new BoxLayout(dummyPanel, BoxLayout.Y_AXIS));
        dummyPanel.setBorder(createMyBorder("Send message "));

        txArea = new JTextArea();
        txArea.setEditable(true);
        spane = new JScrollPane(txArea,
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        dummyPanel.add(spane);

        sendButton = new JButton("Send");
        sendButton.setBorder(BorderFactory.createCompoundBorder(
            BorderFactory.createEmptyBorder(3, 3, 3, 3),
            sendButton.getBorder()));
        sendButton.addActionListener(this);
        dummyPanel.add(sendButton);
        messagePanel.add(dummyPanel);

        mainPanel.add("North", dialogPanel);
        mainPanel.add("Center", messagePanel);
    }

    private void initJMS() {
    }

    private void shutdownGUI() {
        remove(mainPanel);
        mainPanel = null;
    }

    private void shutdownJMS() {
        doDisconnect();
    }

    public void processEvent(AWTEvent e) {
        if (e.getID() == Event.WINDOW_DESTROY) {
            System.exit(0);
        }
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Connect")) {
            if (TRANSPORT.equalsIgnoreCase("http")) {
                String us = urlField.getText();
                statusBar.setStatusLine("Connecting to " + us + "...");
                initHTTPConnectionFactory(us);
            }
            else if (TRANSPORT.equalsIgnoreCase("tcp")) {
                String h = hostField.getText();
                String p = portField.getText();
                statusBar.setStatusLine("Connecting to " + h + ":" + p + "...");
                initTCPConnectionFactory(h, p);
            }
            else {
                String addr = addrField.getText();
                statusBar.setStatusLine("Connecting to " + addr + "...");
                initConnectionFactory(addr);
            }

            doConnect();
        }

        if (e.getActionCommand().equals("Disconnect")) {
            statusBar.setStatusLine("Disconnecting...");
            doDisconnect();
            statusBar.setStatusLine("Connection closed.");
        }

        if (e.getActionCommand().equals("Send")) {
            String ss = txArea.getText();
            doSend(ss);
            txArea.setText(null);
        }

        if (e.getActionCommand().equals("Clear")) {
            rxArea.setText(null);
        }

        if (e.getActionCommand().equals("Exit")) {
            doDisconnect();
            System.exit(0);
        }
    }

    public void updateRxArea(String s) {
        rxArea.append(s);
    }

    public void enableConnectButton() {
        setConnectButton("Connect");
    }

    public void enableDisconnectButton() {
        setConnectButton("Disconnect");
    }

    ConnectionFactory connectionFactory = null;
    Connection connection = null;
    Session session = null;
    Topic topic = null;
    MessageConsumer msgConsumer = null;
    MessageProducer msgProducer = null;
    TextMessage textMessage = null;


    public void initHTTPConnectionFactory(String s) {
        try {
            if (connectionFactory == null) {
                connectionFactory = (ConnectionFactory)
                    new com.sun.messaging.ConnectionFactory();
            }

            // Provider specific code start.
            com.sun.messaging.ConnectionFactory cf =
                (com.sun.messaging.ConnectionFactory) connectionFactory;
            cf.setProperty(
                com.sun.messaging.ConnectionConfiguration.imqConnectionType,
                "HTTP");
            cf.setProperty(
                com.sun.messaging.ConnectionConfiguration.imqConnectionURL,
                s);

            // Provider specific code end.
        }
        catch (JMSException e) {
            updateRxArea("initHTTPConnectionFactory : " + e.toString() + "\n");
            e.printStackTrace();
            if (e.getLinkedException() != null)
                e.getLinkedException().printStackTrace();
        }
    }

    public void initTCPConnectionFactory(String h, String p) {
        try {
            if (connectionFactory == null) {
                connectionFactory = (ConnectionFactory)
                    new com.sun.messaging.ConnectionFactory();
            }

            // Provider specific code start.
            com.sun.messaging.ConnectionFactory cf =
                (com.sun.messaging.ConnectionFactory) connectionFactory;
      // Set imqAddressList property.
            ((com.sun.messaging.ConnectionFactory)cf).setProperty(
                com.sun.messaging.ConnectionConfiguration.imqAddressList,
                new StringBuffer().append("mq://").append(h).append(
                    ":").append(p).append("/jms").toString());
            // Provider specific code end.
        }
        catch (JMSException e) {
            updateRxArea("initTCPConnectionFactory : " + e.toString() + "\n");
            e.printStackTrace();
            if (e.getLinkedException() != null)
                e.getLinkedException().printStackTrace();
        }
    }

    public void initConnectionFactory(String a) {
        if (connectionFactory == null) {
            connectionFactory = (ConnectionFactory)
                new com.sun.messaging.ConnectionFactory();
        }

        try {
            // Provider specific code start.
            com.sun.messaging.ConnectionFactory cf =
                (com.sun.messaging.ConnectionFactory) connectionFactory;
            cf.setProperty(
                com.sun.messaging.ConnectionConfiguration.imqAddressList,
                a);
            // Provider specific code end.
        }
        catch (JMSException e) {
            updateRxArea("initConnectionFactory : " + e.toString() + "\n");
            e.printStackTrace();
            if (e.getLinkedException() != null)
                e.getLinkedException().printStackTrace();
        }
    }

    public void doConnect() {
        try {
            connection = connectionFactory.createConnection();
            connection.setExceptionListener(this);
            connection.start();

            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            topic = session.createTopic("MQChatAppletTopic");
            msgConsumer = session.createConsumer(topic);
            msgConsumer.setMessageListener(this);
            msgProducer = session.createProducer(topic);
            textMessage = session.createTextMessage();

            statusBar.setStatusLine("Connected");
            enableDisconnectButton();
        }
        catch (JMSException e) {
            updateRxArea("doConnect : " + e.toString() + "\n");
            statusBar.setStatusLine("Unable to connect.");
            e.printStackTrace();
            if (e.getLinkedException() != null)
                e.getLinkedException().printStackTrace();
        }
    }

    public void doSend(String s) {
        if (msgProducer == null) {
            statusBar.setStatusLine("Not connected.");
            return;
        }

        try {
            textMessage.setText(s);
            msgProducer.send(textMessage);
        }
        catch (JMSException e) {
            updateRxArea("doSend : " + e.toString() + "\n");
            e.printStackTrace();
        }
    }

    public void doDisconnect() {
        try {
            if (connection != null)
                connection.close();
        }
        catch (Exception e) {}

        connection = null;
        session = null;
        topic = null;
        msgConsumer = null;
        msgProducer = null;
        textMessage = null;

        enableConnectButton();
    }

    public void onException(JMSException e) {
        statusBar.setStatusLine("Connection lost : " + e.toString());
        doDisconnect();
    }

    public void onMessage(Message m) {
        try {
            if (m instanceof TextMessage) {
                String s = ((TextMessage) m).getText();
                updateRxArea(s);
            }
        }
        catch (JMSException e) {
            e.printStackTrace();
            updateRxArea("onMessage : " + e.toString() + "\n");
        }
    }

    private void setConnectButton(String text) {
        connectButton.setText(text);
        connectButton.setActionCommand(text);
        connectButton.invalidate();
        connectButton.validate();
        mainPanel.repaint();
    }

    private javax.swing.border.Border createMyBorder(String title) {
        javax.swing.border.Border inner =
            BorderFactory.createLineBorder(Color.black);

        if (title != null)
            inner = BorderFactory.createTitledBorder(inner, title);

        javax.swing.border.Border outer =
            BorderFactory.createEmptyBorder(3, 3, 3, 3);

        return BorderFactory.createCompoundBorder(outer, inner);
    }

    public void cleanupAndExit() {
        destroy();
        System.exit(0);
    }

    public static MQApplet mq = null;
    public static void mainWindowClosed() {
        mq.cleanupAndExit();
    }

    public static void main(String []args) {
        JFrame f = new JFrame("MQApplet");
        f.setDefaultCloseOperation(f.DO_NOTHING_ON_CLOSE);
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                mainWindowClosed();
            }
        });

        mq = new MQApplet();
        mq.enableExit();

        mq.init();
        mq.start();

        f.getContentPane().add("Center", mq);
        f.setSize(600, 600);
        f.show();
    }

    class StatusPanel extends JPanel {
        private JLabel label = null;

        public StatusPanel() {
            setLayout(new BorderLayout());
            setBorder(BorderFactory.createLoweredBevelBorder());
            label = new JLabel();

            int size = label.getFont().getSize();
            label.setFont(new Font("Serif", Font.PLAIN, size));
            add("West", label);

            setStatusLine("Ready");
        }

        public void setStatusLine(String statusLine) {
            if (statusLine == null)
                statusLine = "";

            label.setText(statusLine);
            invalidate();
            validate();
            repaint();
        }
    }
}

/*
 * EOF
 */

        








mqapplet.zip( 7 k)

Related examples in the same category

1.The mqping utility is similar to the Unix ping utility in some regards
2.This example illustrates how JMS can be used to create a simple chat application
3.The UniversalClient example is a basic 'client' application that uses the JMS 1.1 APIs
4.How to write a GUI application that uses a JMS QueueBrowser to browse the contents of a queue
5.This example is a simple JMS client application
6.Demonstrates a simple end-to-end "Hello World" JMS example that can be compiled and run with the Sun Java(tm) System Message Queue product
7.The BrokerMetrics example is a JMS application that monitors the Sun Java(tm) System Message Queue broker
8.The DestListMetrics example is a JMS application that monitors the destinations on a Sun Java(tm) System Message Queue broker
9.The DestMetrics example is a JMS application that monitors a destination on a Sun Java(tm) System Message Queue broker
10.The VMMetrics example is a JMS application that monitors the Java VM used by the Sun Java(tm) System Message Queue broker
11.MQ Cluster Monitor
12.The TopicSelectors class demonstrates the use of multiple subscribers and message selectors
13.A message will not be acknowledged until processing of it is complete
14.Reads a textfile, creates a BytesMessage from it, then reads the message
15.A durable subscription is active even when the subscriber is not active
16.Creates and then reads a StreamMessage and a BytesMessage
17.Creates and reads messages in all supported JMS message formats: BytesMessage, TextMessage, MapMessage, StreamMessage, and ObjectMessage
18.The use of message header fields
19.Demonstrates that mutable objects are copied, not passed by reference, when you use them to create message objects
20.A simple implementation of a request/reply message exchange
21.Sends several messages to a queue
22.Fetches one or more messages from a queue using synchronous message delivery
23.The simplest form of the publish/subscribe model: the producer publishes a message, and the consumer reads it using a synchronous receive
24.Demonstrates the use of transactions in a JMS application
25.Creates a Producer and a Consumer objects (Producer and Consumer classes are defined in this file)
26.Fetches one or more messages from a queue using asynchronous message delivery
27.The use of a message listener in the publish/subscribe model. The producer publishes several messages, and the consumer reads them asynchronously