weblogic之高级进阶JMS的应用

不仅Activemq提供的jms服务,Weblogic也提供了jms服务,很多项目是部署在Weblogic中,使用其提供的jms服务也是很多企业的选择,一直没亲手试过,今天试了下,遇到的小问题还挺多,看来眼过百变不如手过一遍,下面就记录下操作步骤。构建完成后还会实现个小例子来测试下,这里主要进行点对点模式构建。

二. JMS的思想

所谓的JMS其实就是异步通信, 我们可以打个简单的比方: 现在的手机基本上普及了, 手机它有两个基本功能, 一个是打电话, 一个是发短信. 

打电话是同步的, 必须要保证双方都开机才能进行通话; 而发短信则是异步的, 接收方不需要保持开机状态; 

 

SUN公司给我们提供了一组标准被Java API用于企业级的消息处理, 通过JMS可以在Java程序之间发送和接受消息以达到交换数据的目的,

异步通信实现了程序之间的松耦合的关系.

 
Weblogic构建jms服务基本都是下面四个步骤(假设域已建好): 
1. 新建jms服务器 
2. 新建jms模块 
3. 新建子部署 
4. 新建资源 
首先要登录Weblogic控制台(版本为weblogic 10),http://localhost:9101/console/ --------------------- 本文来自 琉璃糖 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yuanxiaojiao0012/article/details/50685835?utm_source=copy 

第一步要明白weblogic提供的jms的架构体系,通过一个简单的demo进行演示

 

 

要在AdminServer或者被管服务上创建JMS Server,。JmsServer中部署的是Jms module,在jms module可以创建异步消息的qunue和topic,以及外部访问的连接工厂,客户端是通过jndi容器的方式访问queue等对象的,所以在创建queue要指定jndi的唯一标识。

  Weblogic作为Jms服务端提供Jms服务需要在Weblogic的控制台进行一些配置,主要是Jms服务器和Jms模块。Jms服务器作为Jms服务的核心提供Jms服务,也可以说是作为Jms模块的一个管理容器;Jms模块下可以进行ConnectionFactory、Topic、Queue等资源的定义,Weblogic允许我们通过JNDI对它们进行访问。

 在安装的weblogic的时候再D:\Oracle\Middleware\wlserver_10.3\samples\server\examples\src\examples\jms目录下提供的jms的案例。我们就基于该案例来配置我们的weblogic的jms

一、新建jms服务器 
左侧域结构->服务->消息传送->jms服务器 

 

 点击【新建】,弹出下面页面,开始填写信息,这里给jms服务器起名为JMSServer-0(默认的) 

点击【下一步】,目标那选择当前服务器(AdminServer) ,将jms Server部署到AdminServer中

点击完成 

点击完成 
二、新建jms模块 
早期weblogic可以不用构建jms模块直接新建jms连接工厂,队列等,新版本采用jms模块来组织jms连接工厂等。 
左侧域结构->服务->消息传送->jms模块 

点击【新建】按钮,填写名称,这里为MyJMSModule

点击【下一步】,勾选要部署的服务器AdminServer 

点击【下一步】,这个页面中有一项“是否要向此jms模块中添加资源”,这个勾不勾选都可以,勾选的话在完成jms模块配置后可以立即配置资源(连接工厂,队列等),不勾选也可以稍后再配。勾选后进人下面界面: 

在资源中主要是添加连接工厂、queue和topic三个资源

这里补充下分布式队列和分布式topic

不同的queue组成一个集群,形成一个分布式的队列,消息发布是发送到分布式队列中,具体是左边的queue还是右边的queue处理,由weblogic来决定,实现一个负载均衡的效果

 

下一步:我们新建一个连接工厂的资源

 点击下一步:

点击下一步:

在创建的连接工厂是通过jndi容器提供的外部访问的,这里在创建的时候需要制定一个唯一的标志,在上面的jms 案例中使用的标志是

在D:\Oracle\Middleware\wlserver_10.3\samples\server\examples\src\examples\jms\queue案例中QueueSend.java中制定了标志的名称是

// Defines the JMS context factory.
public final static String JMS_FACTORY="weblogic.examples.jms.QueueConnectionFactory";

所以我们在配置的时候,需要将连接工厂的jndi标志设置为weblogic.examples.jms.QueueConnectionFactory

 

接下来点击下一步,点击完成

 

四:创建消息队列

点击下一步:同理这里需要制定队列jndi的标志在QueueSend.java

// Defines the queue.
public final static String QUEUE="weblogic.examples.jms.exampleQueue";

 

点击下一步:接下来需要将队列部署到jms module中,需要创建一个子部署

点击新建子部署

点击确定

点击完成

配置完成之后:jms module的配置如下所示

这里我们就已经把jms配置完成了,我们就可以运行案例了

首先在eclipse上创建两个java工程

 

 QueueSend.java代码如下:

package examples.jms.queue;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Hashtable;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/** This example shows how to establish a connection
 * and send messages to the JMS queue. The classes in this
 * package operate on the same JMS queue. Run the classes together to
 * witness messages being sent and received, and to browse the queue
 * for messages. The class is used to send messages to the queue.
 *
 * @author Copyright (c) 1999,2011, Oracle and/or its affiliates. All Rights Reserved.
 */
public class QueueSend
{
  // Defines the JNDI context factory.
  public final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";

  // Defines the JMS context factory.
  public final static String JMS_FACTORY="weblogic.examples.jms.QueueConnectionFactory";

  // Defines the queue.
  public final static String QUEUE="weblogic.examples.jms.exampleQueue";

  private QueueConnectionFactory qconFactory;
  private QueueConnection qcon;
  private QueueSession qsession;
  private QueueSender qsender;
  private Queue queue;
  private TextMessage msg;

  /**
   * Creates all the necessary objects for sending
   * messages to a JMS queue.
   *
   * @param ctx JNDI initial context
   * @param queueName name of queue
   * @exception NamingException if operation cannot be performed
   * @exception JMSException if JMS fails to initialize due to internal error
   */
  public void init(Context ctx, String queueName)
    throws NamingException, JMSException
  {
    qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
    qcon = qconFactory.createQueueConnection();
    qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
    queue = (Queue) ctx.lookup(queueName);
    qsender = qsession.createSender(queue);
    msg = qsession.createTextMessage();
    qcon.start();
  }

  /**
   * Sends a message to a JMS queue.
   *
   * @param message  message to be sent
   * @exception JMSException if JMS fails to send message due to internal error
   */
  public void send(String message) throws JMSException {
    msg.setText(message);
    qsender.send(msg);
  }

  /**
   * Closes JMS objects.
   * @exception JMSException if JMS fails to close objects due to internal error
   */
  public void close() throws JMSException {
    qsender.close();
    qsession.close();
    qcon.close();
  }
 /** main() method.
  *
  * @param args WebLogic Server URL
  * @exception Exception if operation fails
  */
  public static void main(String[] args) throws Exception {

    InitialContext ic = getInitialContext("t3://localhost:7001");
    QueueSend qs = new QueueSend();
    qs.init(ic, QUEUE);
    readAndSend(qs);
    qs.close();
  }

  private static void readAndSend(QueueSend qs)
    throws IOException, JMSException
  {
    BufferedReader msgStream = new BufferedReader(new InputStreamReader(System.in));
    String line=null;
    boolean quitNow = false;
    do {
      System.out.print("Enter message (\"quit\" to quit): \n");
      line = msgStream.readLine();
      if (line != null && line.trim().length() != 0) {
        qs.send(line);
        System.out.println("JMS Message Sent: "+line+"\n");
        quitNow = line.equalsIgnoreCase("quit");
      }
    } while (! quitNow);

  }

  private static InitialContext getInitialContext(String url)
    throws NamingException
  {
    Hashtable<String,String> env = new Hashtable<String,String>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
    env.put(Context.PROVIDER_URL, url);
    return new InitialContext(env);
  }

}

 

QueueReceive.java

package examples.jms.queue;

import java.util.Hashtable;
import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * This example shows how to establish a connection to
 * and receive messages from a JMS queue. The classes in this
 * package operate on the same JMS queue. Run the classes together to
 * witness messages being sent and received, and to browse the queue
 * for messages.  This class is used to receive and remove messages
 * from the queue.
 *
 * @author Copyright (c) 1999,2011, Oracle and/or its affiliates. All Rights Reserved.
 */
public class QueueReceive implements MessageListener
{
  // Defines the JNDI context factory.
  public final static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";

  // Defines the JMS connection factory for the queue.
  public final static String JMS_FACTORY="weblogic.examples.jms.QueueConnectionFactory";

  // Defines the queue.
  public final static String QUEUE="weblogic.examples.jms.exampleQueue";

  private QueueConnectionFactory qconFactory;
  private QueueConnection qcon;
  private QueueSession qsession;
  private QueueReceiver qreceiver;
  private Queue queue;
  private boolean quit = false;

 /**
  * Message listener interface.
  * @param msg  message
  */
  public void onMessage(Message msg)
  {
    try {
      String msgText;
      if (msg instanceof TextMessage) {
        msgText = ((TextMessage)msg).getText();
      } else {
        msgText = msg.toString();
      }

      System.out.println("Message Received: "+ msgText );

      if (msgText.equalsIgnoreCase("quit")) {
        synchronized(this) {
          quit = true;
          this.notifyAll(); // Notify main thread to quit
        }
      }
    } catch (JMSException jmse) {
      System.err.println("An exception occurred: "+jmse.getMessage());
    }
  }

  /**
   * Creates all the necessary objects for receiving
   * messages from a JMS queue.
   *
   * @param   ctx    JNDI initial context
   * @param    queueName    name of queue
   * @exception NamingException if operation cannot be performed
   * @exception JMSException if JMS fails to initialize due to internal error
   */
  public void init(Context ctx, String queueName)
    throws NamingException, JMSException
  {
    qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
    qcon = qconFactory.createQueueConnection();
    qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
    queue = (Queue) ctx.lookup(queueName);
    qreceiver = qsession.createReceiver(queue);
    qreceiver.setMessageListener(this);
    qcon.start();
  }

  /**
   * Closes JMS objects.
   * @exception JMSException if JMS fails to close objects due to internal error
   */
  public void close()throws JMSException
  {
    qreceiver.close();
    qsession.close();
    qcon.close();
  }
/**
  * main() method.
  *
  * @param args  WebLogic Server URL
  * @exception  Exception if execution fails
  */

  public static void main(String[] args) throws Exception {
 
    InitialContext ic = getInitialContext("t3://localhost:7001");
    QueueReceive qr = new QueueReceive();
    qr.init(ic, QUEUE);

    System.out.println("JMS Ready To Receive Messages (To quit, send a \"quit\" message).");

    // Wait until a "quit" message has been received.
    synchronized(qr) {
      while (! qr.quit) {
        try {
          qr.wait();
        } catch (InterruptedException ie) {}
      }
    }
    qr.close();
  }

  private static InitialContext getInitialContext(String url)
    throws NamingException
  {
    Hashtable<String,String> env = new Hashtable<String,String>();
    env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
    env.put(Context.PROVIDER_URL, url);
    return new InitialContext(env);
  }

}

 

将两个java程序运行起来:就可以发送和接收消息了

 

运行起来之后,就可以监听jms的参数和消息设置了

 

  接下来我们来监听weblogic的jms

第一个就是jms消息的持久化存储,消息可以存储在file中也可以存储在jdbc中,在jms Server的持久化存储中进行配置

还可以设置发生消息的最大字节数等

 

 还可以查看消息的发送状态等信息

jms的持久化存储,把消息保存到文件中

需要新建一个持久化的存储

 

 

在jms Server配置中选择刚刚创建的文件持久化存储

 

posted on 2018-10-08 22:32  luzhouxiaoshuai  阅读(857)  评论(0编辑  收藏  举报

导航