Servlet Example

This section describes how to access JMS from a servlet. A servlet is very similar to any other JMS client application but requires a bit more configuration because it can not be run with the jmqrun client application runner.

There are two parts to this example:

Servlet Queue Sender

Servlet Queue Receiver

Servlet Queue Browser

Servlet Queue Sender

The sender it a servlet, which puts a message on a queue when it receives an HTTP POST command. The message is a text message, which is derived from the form on an HTML page. The full source code for the sender application is shown below:

package servlet;
                                                                           
import java.io.PrintWriter;
import java.io.Reader;
import java.io.IOException;
                                                                           
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
                                                                           
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.Message;
import javax.jms.TextMessage;
import javax.jms.JMSException;
import javax.jms.QueueSession;
import javax.jms.QueueSender;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
                                                                           
import com.sssw.jms.api.JMQQueue;
import com.sssw.jms.api.JMQQueueConnectionFactory;
                                                                           
public class Sender extends HttpServlet
{
    private static final String _iiop =
        JMQQueueConnectionFactory.IIOP_PROTOCOL;
                                                                           
    private String       _message;
    private QueueSender  _sender;
    private QueueSession _session;
                                                                           
    public void init()
    {
    |   try
    |   {
    |   |   QueueConnectionFactory connFactory =
    |   |       new JMQQueueConnectionFactory(_iiop, "localhost", "", 53506);
    |   |   QueueConnection queueConn = connFactory.createQueueConnection();
    |   |   Queue queue = JMQQueue.getQueue("queue0");
    |   |   _session = queueConn.createQueueSession(false,
    |   |       Session.AUTO_ACKNOWLEDGE);
    |   |   _sender = _session.createSender(queue);
    |   |   queueConn.start();
    |   }
    |   catch (Exception ex)
    |   {
    |   |   _message = Receiver.ex2str(ex);
    |   }
    }
                                                                           
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
    |   response.setContentType("text/html");
    |   PrintWriter writer = response.getWriter();
    |                                                                      
    |   writer.println("<html>");
    |   writer.println("<head>");
    |   writer.println("<title>JMS Servlet</title>");
    |   writer.println("</head>");
    |   writer.println("<body bgcolor=white>");
    |                                                                      
    |   if (_message == null)
    |       writer.println("I only speak POST");
    |   else
    |       writer.println(_message);
    |                                                                      
    |   writer.println("</body>");
    |   writer.println("</html>");
    }
                                                                           
    public void doPost(HttpServletRequest request,
        HttpServletResponse response)
        throws IOException, ServletException
    {
    |   response.setContentType("text/html");
    |   PrintWriter writer = response.getWriter();
    |                                                                      
    |   writer.println("<html>");
    |   writer.println("<head>");
    |   writer.println("<title>JMS Servlet</title>");
    |   writer.println("</head>");
    |   writer.println("<body bgcolor=white>");
    |                                                                      
    |   writer.println("<h1>Status</h1>");
    |                                                                      
    |   if (_sender == null) {
    |   |   writer.println(_message);
    |   } else {
    |   |   try {
    |   |   |   Reader reader = request.getReader();
    |   |   |   String text = "";
    |   |   |   while (true) {
    |   |   |   |   int i = reader.read();
    |   |   |   |   if (i == -1) break;
    |   |   |   |   text += (char) i;
    |   |   |   }
    |   |   |                                                              
    |   |   |   int i1 = text.indexOf("=");
    |   |   |   int i2 = text.indexOf("&");
    |   |   |                                                              
    |   |   |   text = text.substring(i1 == -1 ? 0 : i1+1, i2 == -1 ?
    |   |   |       text.length() : i2);
    |   |   |                                                              
    |   |   |   TextMessage msg;
    |   |   |   msg = _session.createTextMessage(text);
    |   |   |   _sender.send(msg);
    |   |   |   writer.println("Just sent " + msg.getText());
    |   |   } catch (JMSException ex) {
    |   |   |   writer.println(ex.toString());
    |   |   }
    |   }
    }
}

As can be seen above, the servlet initializes by creating a queue connection factory and a queue using proprierary API's. The sender only support POST where the text message is created and put on the queue in the same way as any other JMS client.

Servlet Queue Receiver

The receiver is also a servlet, which allows web browser to receive messages from a JMS queue. The GET method display the last message on the queue as well as a form for sending new messages. Sending a message on this form issues a POST to the sender. Below is the source for the Receiver class:

package servlet;
                                                                           
import java.io.PrintWriter;
import java.io.IOException;
import java.io.ByteArrayOutputStream;
                                                                           
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
                                                                           
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.Message;
import javax.jms.TextMessage;
import javax.jms.JMSException;
import javax.jms.QueueSession;
import javax.jms.QueueReceiver;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
                                                                           
import com.sssw.jms.api.JMQQueue;
import com.sssw.jms.api.JMQQueueConnectionFactory;
                                                                           
public class Receiver extends HttpServlet
{
    private static final String _iiop =
        JMQQueueConnectionFactory.IIOP_PROTOCOL;
                                                                           
    private String        _message;
    private QueueReceiver _receiver;
                                                                           
    public void init()
    {
    |   try
    |   {
    |   |   QueueConnectionFactory connFactory =
    |   |       new JMQQueueConnectionFactory(_iiop, "localhost", "", 53506);
    |   |   QueueConnection queueConn = connFactory.createQueueConnection();
    |   |   Queue queue = JMQQueue.getQueue("queue0");
    |   |   QueueSession _session = queueConn.createQueueSession(false,
    |   |       Session.AUTO_ACKNOWLEDGE);
    |   |   _receiver = _session.createReceiver(queue);
    |   |   queueConn.start();
    |   }
    |   catch (Exception ex)
    |   {
    |   |   _message = ex2str(ex);
    |   }
    }
                                                                           
    public static String ex2str(Throwable t)
    {
    |   try {
    |   |   ByteArrayOutputStream os = new ByteArrayOutputStream();
    |   |   PrintWriter pw = new PrintWriter(os);
    |   |   t.printStackTrace(pw);
    |   |   pw.flush();
    |   |   return new String(os.toByteArray());
    |   } catch (Throwable e) {
    |   |   return t.toString();
    |   }
    }
                                                                           
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
    |   response.setContentType("text/html");
    |   PrintWriter writer = response.getWriter();
    |                                                                      
    |   writer.println("<html>");
    |   writer.println("<head>");
    |   writer.println("<title>JMS Servlet</title>");
    |   writer.println("</head>");
    |   writer.println("<body bgcolor=white>");
    |                                                                      
    |   writer.println("<h1>Message on queue/queue0</h1>");
    |                                                                      
    |   if (_receiver == null) {
    |   |   writer.println(_message);
    |   } else {
    |   |   try {
    |   |   |   Message msg = _receiver.receiveNoWait();
    |   |   |   if (msg != null) {
    |   |   |   |   if (msg instanceof TextMessage) {
    |   |   |   |   |   writer.println(((TextMessage)msg).getText());
    |   |   |   |   } else {
    |   |   |   |   |   writer.println("not text message");
    |   |   |   |   }
    |   |   |   } else {
    |   |   |   |   writer.println("no message on queue");
    |   |   |   }
    |   |   } catch (JMSException ex) {
    |   |   |   writer.println(ex.toString());
    |   |   }
    |   }
    |                                                                      
    |   writer.println("<h1>Send New Message</h1>");
    |                                                                      
    |   writer.print("<FORM method=POST ");
    |   writer.println("action=\"http://localhost:8080/services/sender\">");
    |   writer.print("<input type=text ");
    |   writer.println("name=send size=20 maxlength=\"800\">");
    |   writer.println("<input type=\"submit\" name=post value=\"send\">");
    |   writer.println("</FORM>");
    |                                                                      
    |   writer.println("</body>");
    |   writer.println("</html>");
    }
}

The receive further supports a small utility method for printing a stack trace on the web page in case an error occur. This utility method is also used by the Sender. The Receiver uses the receiveNoWait method to avoid blocking the execution of HTTP GET.

Servlet Queue Browser

The browser it a servlet, which displays all messages on a queue in a table when it receives an HTTP GET command. The message's toString method is simply used when printing. The full source code for the browser application is shown below:

package servlet;
                                                                           
import java.util.Enumeration;
                                                                           
import java.io.PrintWriter;
import java.io.IOException;
import java.io.ByteArrayOutputStream;
                                                                           
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
                                                                           
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.Message;
import javax.jms.TextMessage;
import javax.jms.JMSException;
import javax.jms.QueueSession;
import javax.jms.QueueBrowser;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
                                                                           
import com.sssw.jms.api.JMQQueue;
import com.sssw.jms.api.JMQQueueConnectionFactory;
                                                                           
public class Browser extends HttpServlet
{
    private static final String _iiop =
        JMQQueueConnectionFactory.IIOP_PROTOCOL;
                                                                           
    private String       _message;
    private QueueSession _session;
                                                                           
    public void init()
    {
    |   try
    |   {
    |   |   QueueConnectionFactory connFactory =
    |   |       new JMQQueueConnectionFactory(_iiop, "localhost", "", 53506);
    |   |   QueueConnection queueConn = connFactory.createQueueConnection();
    |   |   _session = queueConn.createQueueSession(false,
    |   |       Session.AUTO_ACKNOWLEDGE);
    |   |   queueConn.start();
    |   }
    |   catch (Exception ex)
    |   {
    |   |   _message = ex2str(ex);
    |   }
    }
                                                                           
    public static String ex2str(Throwable t)
    {
    |   try {
    |   |   ByteArrayOutputStream os = new ByteArrayOutputStream();
    |   |   PrintWriter pw = new PrintWriter(os);
    |   |   t.printStackTrace(pw);
    |   |   pw.flush();
    |   |   return new String(os.toByteArray());
    |   } catch (Throwable e) {
    |   |   return t.toString();
    |   }
    }
                                                                           
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
    |   response.setContentType("text/html");
    |   PrintWriter writer = response.getWriter();
    |                                                                      
    |   writer.println("<html>");
    |   writer.println("<head>");
    |   writer.println("<title>JMS Servlet</title>");
    |   writer.println("</head>");
    |   writer.println("<body bgcolor=white>");
    |                                                                      
    |   writer.println("<h1>Messages on queue/queue0</h1>");
    |                                                                      
    |   if (_session == null) {
    |   |   writer.println(_message);
    |   } else {
    |   |   try {
    |   |   |   Queue queue = JMQQueue.getQueue("queue0");
    |   |   |   QueueBrowser browser = _session.createBrowser(queue);
    |   |   |   Enumeration _iterator = browser.getEnumeration();
    |   |   |   writer.println("<table>");
    |   |   |   while (_iterator.hasMoreElements()) {
    |   |   |   |   Message msg = (Message) _iterator.nextElement();
    |   |   |   |   writer.println("<tr><td>" + msg + "</td></tr>");
    |   |   |   }
    |   |   |   browser.close();
    |   |   |   writer.println("</table>");
    |   |   } catch (JMSException ex) {
    |   |   |   writer.println(ex.toString());
    |   |   }
    |   }
    |                                                                      
    |   writer.println("</body>");
    |   writer.println("</html>");
    }
}


Copyright © 2003, 2004 Novell, Inc. All rights reserved. Copyright © 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved.