サーブレットの例

このセクションでは、サーブレットからJMSにアクセスする方法について説明します。 サーブレットは、他のJMSクライアントアプリケーションに非常に類似していますが、jmqrunクライアントアプリケーションの実行側で実行できないため、必要な設定が少し多くなります。

この例には、次の3つの部分があります。

サーブレットキュー送信者

サーブレットキュー受信者

サーブレットキューブラウザ

1 サーブレットキュー送信者

受信者は、サーブレットであり、HTTP POSTコマンドの受信時にメッセージをキューに置きます。メッセージは、テキストメッセージであり、HTMLページのフォームから送られます。送信者アプリケーションの完全なソースコードは、次のとおりです。
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", "", 3506);
    |   |   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());
    |   |   }
    |   }
    }
}
前の例で示されるように、サーブレットは固有のAPIを使用して、キュー接続ファクトリおよびキューを作成することによって、初期化します。受信者は、他のJMSクライアントと同じ方法で、テキストメッセージが作成され、キューに置かれるPOSTのみをサポートしています。

2 サーブレットキュー受信者

受信者も、サーブレットであり、WebブラウザでJMSキューからのメッセージを受信できるようにします。GETメソッドは、キューの最後のメッセージ、および新しいメッセージを送信するフォームを表示します。このフォームでメッセージを送信すると、POSTが送信者にパブリッシュされます。Receiverクラスのソースは、次のとおりです。
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", "", 3506);
    |   |   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>");
    }
}
さらに、受信者は、エラーが発生した場合に、Webページでスタックトレースを出力する小さなユーティリティメソッドをサポートしています。このユーティリティメソッドは、送信者でも使用されます。受信者は、receiveNoWaitメソッドを使用して、HTTP GETの実行がブロックされないようにします。

3 サーブレットキューブラウザ

ブラウザは、サーブレットであり、HTTP GETコマンドの受信時にすべてのメッセージをキューに表示します。メッセージのtoStringメソッドは、出力時に使用されます。ブラウザアプリケーションの完全なソースコードは、次のとおりです。
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", "", 3506);
    |   |   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.