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:
1 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: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.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()); | | } | } } }2 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: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 thepackage 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>"); } }receiveNoWait
method to avoid blocking the execution of HTTP GET.3 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'stoString
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 © 2000-2003, Novell, Inc. All rights reserved. |