`

我的JMS第一个程序

    博客分类:
  • JMS
 
阅读更多
今天无事看了看JMS,遵循网上的一些相关代码,修改修改,终于完成了我的JMS处女作。
JMS理论部分太多,不能说太细,否则扯太远,看官们也不喜欢,不过下面这个可以看看
http://www.cnblogs.com/GeneralXU/archive/2010/05/11/1732852.html

程序环境 weblogic10.3.2.0(11g) eclipse Indigo


JMS程序三大步:
1. 创建JMS server
启动weblogic后,进入控制台,在左边点击Service--Messaging--JMS Servers
(如果大家的weblogic控制台是中文的,想改成英文或其他什么鸟语,请看我写的这个http://coderanch.iteye.com/blog/1610208)
jms server的创建,没什么说的,一路next,都默认就行,不过最后一步要选target为AdminServer,
完成之后如下:


2. 创建JMS Modules
这个也没啥说的,一路默认,同样在完成前要选target为AdminServer,其他的像什么Descriptor File Name,Location In Domain,我的这程序都不用管它们,空白就行。另外,在完成前有个选择问你要不要马上添加resource,这个可选可不选,反正等下要添加。完成后是下面的样子:


3. 创建connection 和 queue,这一步在这个程序里老重要了。
在console的左边列表树中点JMS Modules,点你刚建好的那个Module,进去后:
1. 创建connectionFactory
      new--> connection Factory,名字保持默认, JNDI name就取为factory,这个jndi名称随便,不过下面程序中要用到,一致就行了。
2.创建Queue new-->Queue-->next-->JNDI name "testqueue",template-->none,
next之后,在Subdeployments那,点Create a New Subdeployment,名字就用默认的Queue-0,点击OK回来后,targes那里一定要勾选刚才新建的JMSServer,之后完成就行了。
完成之后,新建的JMS Module下面的resources下面是这样的(重要的地方着色了,新建时注意下就行了):



好了,下面用程序来测试。
我们这个程序是测试发送对象的,其他的像发送textMessage啊,StreamMessage啊,较简单,就忽略了。
类UserInfo:
package com.test.jms;
import java.io.Serializable;
public class UserInfo implements Serializable {
 /**
  *
  */
 private static final long serialVersionUID = 1L;
 private String name;
 private String address;
 private String gender;
 public String getAddress() {
  return address;
 }
 public void setAddress(String address) {
  this.address = address;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
public String getGender() {
	return gender;
}
public void setGender(String gender) {
	this.gender = gender;
}
}


类QueueSend
package com.test.jms;


import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.Hashtable;  
 
import javax.jms.BytesMessage;  
import javax.jms.JMSException;  
import javax.jms.MapMessage;  
import javax.jms.ObjectMessage;  
import javax.jms.Queue;  
import javax.jms.QueueConnection;  
import javax.jms.QueueConnectionFactory;  
import javax.jms.QueueSender;  
import javax.jms.QueueSession;  
import javax.jms.Session;  
import javax.jms.StreamMessage;  
import javax.jms.TextMessage;  
import javax.naming.Context;  
import javax.naming.InitialContext;  
import javax.naming.NamingException;  
 
public class QueueSend {  
	 
    // Defines the JNDI context factory.  
    public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";  
 
    // Defines the JNDI provider url.  
  public final static String PROVIDER_URL = "t3://localhost:7001";  //这里要同你的本地配置
 
    // Defines the JMS connection factory for the queue.  
    public final static String JMS_FACTORY = "javax.jms.QueueConnectionFactory";  
 
    // Defines the queue 用的是对应 QUEUE的JNDI名子
   public final static String QUEUE = "testqueue";  //这里也要同你上面设置的Queue JNDI一致
 
    private QueueConnectionFactory qconFactory;  
 
    private QueueConnection qcon;  
 
    private QueueSession qsession;  
 
    private QueueSender qsender;  
 
    private Queue queue;  
 
    private TextMessage msg;  
 
    private StreamMessage sm;  
 
    private BytesMessage bm;  
 
    private MapMessage mm;  
 
    private ObjectMessage om;  
 
    /** 
     * 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();  
        sm = qsession.createStreamMessage();  
        bm = qsession.createBytesMessage();  
        mm = qsession.createMapMessage();  
        */
        om = qsession.createObjectMessage();  
 
        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 {  
        // set TextMessage  
        //msg.setText(message);  
 
        // set BytesMessage  
        String input = message;
        String name = input.split(" ")[0];
        String address = input.split(" ")[1];
        String gender = input.split(" ")[2];

        // set ObjectMessage  
        UserInfo ui = new UserInfo();  
        ui.setName(name);  
        ui.setAddress(address);  
        ui.setGender(gender);
        om.setObject(ui);  

        qsender.send(om);  
    }  
 
    /** 
     * 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();  
    }  
 
    public static void main(String[] args) throws Exception {  
        InitialContext ic = getInitialContext();  
        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): ");  
            line = msgStream.readLine();  
            if (line != null && line.trim().length() != 0) {  
                qs.send(line);  
                System.out.println("JMS Message Sent: " + line + "\t");  
                quitNow = line.equalsIgnoreCase("quit");  
            }  
        } while (!quitNow);  
 
    }  
 
    private static InitialContext getInitialContext() throws NamingException {  
        Hashtable env = new Hashtable();  
        env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);  
        env.put(Context.PROVIDER_URL, PROVIDER_URL);  
        return new InitialContext(env);  
    }  
}  


类QueueReceive
package com.test.jms;


import java.util.Hashtable;  
import javax.jms.BytesMessage;  
import javax.jms.JMSException;  
import javax.jms.MapMessage;  
import javax.jms.Message;  
import javax.jms.MessageListener;  
import javax.jms.ObjectMessage;  
import javax.jms.Queue;  
import javax.jms.QueueConnection;  
import javax.jms.QueueConnectionFactory;  
import javax.jms.QueueReceiver;  
import javax.jms.QueueSession;  
import javax.jms.Session;  
import javax.jms.StreamMessage;  
import javax.jms.TextMessage;  
import javax.naming.Context;  
import javax.naming.InitialContext;  
import javax.naming.NamingException;  


public class QueueReceive implements MessageListener {  
   // Defines the JNDI context factory.  
   public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";  

   // Defines the JNDI provider url.  
  public final static String PROVIDER_URL = "t3://localhost:7001"; 

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

   // Defines the queue 用的是对应 QUEUE的JNDI名子
  public final static String QUEUE = "testqueue"; 

   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 = "";  
           String name;  
           String address;
           String gender;

           if (msg instanceof TextMessage) {  
               msgText = ((TextMessage) msg).getText();   
           } else if (msg instanceof ObjectMessage) {  
               UserInfo ui = (UserInfo) ((ObjectMessage) msg).getObject();  
               name = ui.getName();  
               address = ui.getAddress(); 
               gender = ui.getGender(); 
               
               System.out.println("Message Received: " + name + "\t" + address + "\t" + gender);  
           }  


           if (msgText.equalsIgnoreCase("quit")) {  
               synchronized (this) {  
                   quit = true;  
                   this.notifyAll(); // Notify main thread to quit  
               }  
           }  
       } catch (JMSException jmse) {  
           jmse.printStackTrace();  
       }  
   }  

   /** 
    * 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();  
       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) {  
                   ie.printStackTrace();  
               }  
           }  
       }  
       qr.close();  
   }  
   
   private static InitialContext getInitialContext() throws NamingException {  
       Hashtable env = new Hashtable();  
       env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);  
       env.put(Context.PROVIDER_URL, PROVIDER_URL);  
       return new InitialContext(env);  
   }  
   
}  


  最后要注意一点是,发送消息时,我这个程序的输入格式是这样的:aa空格bb空格cc
中间要加空格,因为用空格来区分UserInfo的三个不同属性.


发送消息如下:



接收消息如下:



另外,oracle公司的这篇文章值得一读,不过太罗嗦,我没读完哈,哪天有空读完了再写:
http://docs.oracle.com/cd/E13222_01/wls/docs90/jms/implement.html

最最后要说的一句是:iteye,你的编辑器一如继往的难用,吐血啊,刚刚的。。。







  • 大小: 15.9 KB
  • 大小: 13.7 KB
  • 大小: 23.7 KB
  • 大小: 21.1 KB
  • 大小: 16.8 KB
分享到:
评论
1 楼 tidehunter 2012-09-07  
不错 ,不过呢提点个人建议第一:建一个managerserver(anyway 一个部署应用或者queue的server, 端口自设),adminserver是用来监控和管理其他server的;第二:queue名和jndi名最好一样(这个在你以后queue对了或者做成集群的时候会发现编程方便很多),子部署名字Cluster最好别和queue名一样!个人建议而已!

相关推荐

    SonicMQ中jms小程序

    2. **SonicMQ的Queue和Topic**:在SonicMQ中,Queue用于实现点对点通信,消息被发送到队列后,一个或多个消费者可以接收,但只有第一个到达的消费者能获取并处理消息。Topic则用于广播消息,所有订阅了该主题的消费...

    JMS简单示例1

    JMS提供了一种在分布式环境中可靠地传递信息的方式,使得不同的应用程序之间可以进行异步通信。在JMS中,消息是数据传输的载体,而消息生产者和消费者通过消息中间件(如消息队列或主题)进行通信。 **JMS核心概念*...

    OSB中JMS配置及队列使用说明

    1. 创建持久 Store:创建持久 Store 是 JMS 配置的第一步,持久 Store 用于存储 JMS 消息。 2. 创建 JMS 服务器:创建 JMS 服务器是 JMS 配置的第二步,JMS 服务器是 JMS 消息的提供者。 3. 创建 JMS 模块:创建 JMS...

    orico 移动硬盘盒 JMS578 固件及最新固件刷新程序,可修改休眠

    以“v1”为例,它可能表示该固件为JMS578的第一代产品所设计;“16”或许指的是2016年,而“14_25”则暗示该版本是在那一年的第14周的第25天发布的。这个详细的版本标识有助于用户判断是否有必要进行固件升级。 ...

    用JMS编程

    1. **广泛的支持与兼容性**:作为第一个获得广泛跨行业支持的企业消息传递API,JMS确保了开发者可以轻松地与不同的消息中间件集成。 2. **简化应用程序开发**:通过标准化的消息传递概念和惯例,JMS简化了企业应用...

    JMS配置文档

    创建JMS服务器是配置JMS的第一步。在WebLogic管理控制台中,导航到“服务”>“JMS”>“JMS服务器”,然后点击“新建”按钮。你需要为JMS服务器提供一个名称,并选择一个服务器实例来承载这个JMS服务器。JMS服务器将...

    JMS学习手册

    JMS学习手册是一份宝贵的参考资料,它涵盖了JMS的基础概念、程序开发、配置和监控等方面的知识,尤其适合初学者以及希望加深理解JMS原理和实践的开发者。 JMS规范定义了一组接口和相关语义,这些接口用于创建、发送...

    JMS中topic和queue两种实现方式

    - **先进先出(FIFO)**:消息在队列中的处理遵循先进先出的原则,即第一个进入队列的消息会被第一个消费。 - **持久性**:与主题相比,队列提供了更好的消息持久性。即使消费者在消息到达后暂时离线,当它重新...

    websphere jms配置

    ### 第一步:配置总线 在WebSphere管理控制台中,首先需要创建一个总线(Bus)。总线是JMS系统中消息传输的通道,它定义了消息的路由方式。在"服务集成"下找到"总线",点击"新建",输入总线名称,例如"ccosbus"。...

    Java理论与实践: 应该在下一个企业应用程序中使用JMS吗?

    总之,JMS是企业级应用程序中的一个重要工具,尤其对于需要异步处理、高可用性和可伸缩性的系统。随着MQ产品的普及和价格下降,越来越多的开发者可以利用JMS来优化他们的应用程序设计。通过深入理解和合理运用消息...

    深入掌握JMS.doc

    - JMS仅定义了接口,实际的实现由第三方提供,例如ActiveMQ,它是一个流行的开源JMS提供者,提供管理Connection、Session、Topic和Queue等功能。 - 在Java EE环境中,ConnectionFactory和Destination可以通过JNDI...

    jms specification

    为了解决这些问题,JMS引入了一个更为结构化的模块化机制,使得开发者可以更容易地管理和组织代码及依赖关系。 #### 核心概念与功能 - **模块**: JMS中的核心单位是模块,它封装了一组相关的类、资源和其他元数据。...

    JMS规范教程(中文)

    第1章JMS基本概念 JMS定义了访问企业消息系统的标准API,这些API支持创建、发送、接收消息。JMS规范中的消息模型可以分为两种类型:点对点(Point-to-Point,PTP)和发布/订阅(Publish-Subscribe,Pub/Sub)。JMS...

    关于我的第一个EJB程序

    在这个“关于我的第一个EJB程序”中,我们将探讨EJB的基本概念、开发过程以及如何通过源码和工具来实现。 1. **EJB的基本概念** - **会话Bean(Session Beans)**:代表客户端的临时业务逻辑,用于处理单个用户...

    bin-16028_jms578_std_v00.04.01.04_self_power_odd_20190611.zip

    版本号"v00.04.01.04"指示了这是该固件的第四个主要版本、第一个次要版本、第一个修正版本和第四个热修复版本。日期"20190611"表示固件是在2019年6月11日编译或发布的。 描述中的信息与标题相同,进一步确认这是一...

    JMS561主控芯片 硬盘盒固件更新以及量产工具 修改硬盘休眠时间

    1. **下载固件更新工具**:通常,厂商会提供专门的固件更新工具,如JMS的官方软件或者第三方的硬盘盒管理程序。确保从可靠来源获取,以防止引入恶意软件。 2. **备份数据**:在进行任何固件更新之前,都应先备份...

    JMS 2.0 规范

    - **学习API文档**:熟悉最新的JMS 2.0 API文档是非常重要的第一步,它将帮助开发者了解所有可用的功能及其用法。 - **测试环境搭建**:在正式部署之前,建议先在一个测试环境中模拟实际应用场景,验证消息传递流程...

    编码实现MQ连接池实现JMS消息发送连接管理

    1. **选择JMS实现**:首先,你需要选择一个JMS提供商,如ActiveMQ、RabbitMQ或Apache Qpid等。这些提供商提供了实现JMS规范的具体库,使得我们可以通过Java API与其交互。 2. **创建ConnectionFactory**:...

    activemq与spring整合发送jms消息入门实例

    5. **设置消息目的地**:在`convertAndSend()`方法中,第一个参数是消息的目的地,可以是队列(Queue)或主题(Topic)。这里我们使用了一个名为“queueName”的队列。 6. **运行实例**:确保ActiveMQ服务器正在...

Global site tag (gtag.js) - Google Analytics