2009年3月5日星期四

WLS_011:WebLogic Server基本管理之七:配置JMS

本文最后一次修改时间:2011-12-06。
运行环境:WebLogic Server 10.3.5 + Oracle Database 10g Express Edition 10.2.0.1。

[domain_name]-> Services-> Messaging -> JMS Servers


1. WebLogic Server中JMS架构说明:
(1)JMS Server是符合JMS规范的Server,它是target到WebLogic Server上的,不能独立运行。
(2)JMS Module中包含所有JMS资源信息(Conntion Factory,Queue,Topic),它是target到WebLogic Server上的。
(3)Queue 或 Topic 是target到JMS Server上的。
(4)SubDeployment 是JMS Module的一个属性,它是target到JMS Server上的。

2. 发布消息到Queue中。
JMS传输消息方式之一是点对点方式(Point-to-Point),这种方式的特点是:
(1)消息的生产者把消息发送到Queue中。
(2)消息的消费者从Queue中读取消息。
(3)消息队列中的消息默认遵循先进先出原则(First-In, First-Out (FIFO))。
(4)一条消息只能被一个消费者读取,一旦读取后,其它消费者就“看不到了”。

点对点方式的典型应用场景是客服系统:所有用户的请求都依次发到Queue中,最先发送的请求最先处理,每个客服人员处理某个请求后,其他客服人员就不用处理该请求了。
发送消息到Queue的代码如下:

package com.servlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.jms.*;
import javax.naming.*;

public class postToQueue extends HttpServlet
{
 public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
  {
   response.setContentType("text/html");
   ServletOutputStream out = response.getOutputStream();

   String message = request.getParameter("message");
   if (message.equals(""))
   {
    out.print("Enter a message to post to the queue");
   }

   else
   {
    try {
     QueueConnectionFactory qconFactory;
     QueueConnection qcon;
     QueueSession qsession;
     QueueSender qsender;
     Queue queue;
     TextMessage msg;

     InitialContext ic = new InitialContext();

     qconFactory = (QueueConnectionFactory) ic.lookup("javax.jms.QueueConnectionFactory");
     qcon = qconFactory.createQueueConnection();
     qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

     queue = (Queue) ic.lookup("dizzyworldQueue");

     qsender = qsession.createSender(queue);
     msg = qsession.createTextMessage();
     qcon.start();

     msg.setText(message);
     qsender.send(msg);
     System.out.println("The message, "+ message +", has been sent to the dizzyworldQueue.");

     out.print("<FONT SIZE='4' COLOR='navy'>");
     out.print("Your message has been posted<BR>");
     out.print("Monitor the message in the Administration Console<BR>");
     out.print("</FONT>");
     qsender.close();
     qsession.close();
     qcon.close();
    } catch (Exception e) {System.out.print("error " + e); }

   }

   out.print("<BR><A HREF='./welcome.html'>Back To Home Page</A><BR>");

  }
}

在Console监控Queue:点击Queue的名称,点击Monitoring Tab,选择Queue,点击“Show Messages”。


如果没有消费者读取该Queue中的信息,可以在Console中看到发送到Queue中的所有消息。
也就是说,WebLogic Server会保留Queue中的所有消息,直到有消费者来读取信息。

3. 发布消息到Topic中。
JMS传输消息方式之二是发布-订阅方式(Publish-Subscribe),这种方式的特点是:
(1)消息的生产者把消息发送到Topic中。
(2)消息的消费者从Topic中读取消息。
(3)消息主题中的消息默认不持久化,因此如果发送消息时,消费者没有“监听”该Topic,消息将自动丢弃。
(4)一条消息可以同时被多个消费者读取,只要它们订阅了该信息,并且“正在监听”该Topic。

发布-订阅方式的典型应用场景是股票价格发布-订阅系统:消息的生产者会随时发布股票价格,订阅了某股票的消费者,会收到该股票的价格信息。如果消息消费者刚刚登录在线,那么之前发布的价格信息就收不到了。
发送消息到Topic的代码如下:

package com.servlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.jms.*;
import javax.naming.*;

public class postToTopic extends HttpServlet
{
 public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
  {
   response.setContentType("text/html");
   ServletOutputStream out = response.getOutputStream();

   String message = request.getParameter("message");
   if (message.equals(""))
   {
    out.print("Enter a message to post to the Topic");
   }

   else
   {
    try {
     TopicConnectionFactory tconFactory;
     TopicConnection tcon;
     TopicSession tsession;
     TopicPublisher tpublish;
     Topic topic;
     TextMessage msg;

     InitialContext ic = new InitialContext();

     tconFactory = (TopicConnectionFactory) ic.lookup("javax.jms.TopicConnectionFactory");
     tcon = tconFactory.createTopicConnection();
     tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

     topic = (Topic) ic.lookup("dizzyworldTopic");

     tpublish = tsession.createPublisher(topic);
     msg = tsession.createTextMessage();
     tcon.start();

     msg.setText(message);
     tpublish.publish(msg);
     System.out.println("The message, " + message + ", has been sent to dizzyworldTopic.");

     out.print("<FONT SIZE='4' COLOR='navy'>");
     out.print("Your message has been posted<BR>");
     out.print("Monitor the message in the Administration Console<BR>");
     out.print("</FONT>");

     tpublish.close();
     tsession.close();
     tcon.close();
    } catch (Exception e) {out.print("error " + e); }

   }

   out.print("<BR><A HREF='./welcome.html'>Back To Home Page</A><BR>");

  }
}

在Console监控Topic:点击Topic的名称,点击Monitoring Tab。

与Queue不同,在Topic中的消息如果没有消费者读取,WebLogic Server会删除这些信息。

4. 发布消息到Distribute Queue中。


package com.servlets;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.jms.*;
import javax.naming.*;

public class postToDistQueue extends HttpServlet
{
 public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
  {
   response.setContentType("text/html");
   ServletOutputStream out = response.getOutputStream();

   String message = request.getParameter("message");
   if (message.equals(""))
   {
    out.print("Enter a message to post to the distributed queue");
   }

   else
   {
    try {
     QueueConnectionFactory qconFactory;
     QueueConnection qcon;
     QueueSession qsession;
     QueueSender qsender;
     Queue queue;
     TextMessage msg;

     InitialContext ic = new InitialContext();

     qconFactory = (QueueConnectionFactory) ic.lookup("dizzyworldConnectionFactory");
     qcon = qconFactory.createQueueConnection();
     qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

     queue = (Queue) ic.lookup("dizzyworldDistributedQueue");

     qsender = qsession.createSender(queue);
     msg = qsession.createTextMessage();
     qcon.start();

     msg.setText(message);
     qsender.send(msg);
     System.out.println("The message, "+ message +", has been sent to the dizzyworldDistributedQueue.");

     out.print("<FONT SIZE='4' COLOR='navy'>");
     out.print("Your message has been posted<BR>");
     out.print("Monitor the message in the Administration Console<BR>");
     out.print("</FONT>");
     qsender.close();
     qsession.close();
     qcon.close();
    } catch (Exception e) {System.out.print("error " + e); }

   }

   out.print("<BR><A HREF='./welcome.html'>Back To Home Page</A><BR>");

  }
}

Project下载:test_jms.zip

没有评论: