JMS入门学习

1.JMS简述

JMS (Java Message Service)是由SUN开发的一套API,它为开发者提供一套访问MOM(Message-Oriented Middleware:面向消息中间件)的标准方法。

JMS 分为两种消息域PTP(点对点)和Pub/Sub(发布/订阅)。PTP消息被产生者放入到一个队列中,消费者则从小消息列队中取走消息,消息一担取走,消息就从队列中移除。Pub/Sub消息和PTP最大的不同在于发布者发布一条消息后可以发送给所有订阅者,所有订阅者都拥有处理某一条消息的机会。(如图1)

(图1)

发布者A 发布者B

| |

--------MOM 消息中间件-----------------------

|娱乐/音乐 it/管理 |

________________________________

订阅者A 订阅者B 订阅者C (都能享受上面的服务,不用理会谁发布的)

2.JMS的一些重要接口

ConnectionFactory :创建一个受管理对象

Connection:连接到提供者的活动连接

Destination :一个封装消息目标地址的受管理对象,如消息的来源地和发送滴,根据消息域的不同有两个接口:Queue 和 Topic,前者对应PTP消息的目标地址,后者对应Pub/Sub消息的目标地址。

Session :发送和接受消息的单线程环境。(即一次会话)

MessageProducer:用于发送消息

MessageConsumer:用于接收消息

JMS高级接口与特定域接口(位于javax.jms包中)

高级接口

PTP域子接口

PUB/SUB域子接口

ConnectionFactory

QueueConnectionFactory

TopicConnectionFactory

Connection

QueueConnection

TopicConnection

Destination

QueueDestination

TopicDestination

Session

QueueSession

TopicSession

MessageProducer

QueueMessageProducer

TopicMessageProducer

MessageConsumer

QueueMessageConsumer

TopicMessageConsumer


3.一个典型的JMS程序要经过的步骤

一个典型的JMS程序要经过以下步骤才能开始创建和使用消息

1、通过JNDI查询ConnectionFactory

2、用ConnectionFactory创建一个Connection

3、用Connection创建一个或多个Session

4、通过JNDI查询一个或多个Destination

5、用Session和Destination创建对应的MessageProducer和MessageConsumer

6、启动Connection


4.JMS消息结构

JMS根据不同应用的用途定义了多种消息类型,由Message接口派生而来,一个Message由Header、Properties和Body三个部分组成。

Header是一组标准键值字段,客户端和提供者都用它来标识和路由消息。

Properties用于弥补Header的不足,可以通过手工设置其他的属性,Message提供了set<Type>Property(String name)和get<Type>Property()方式来让开发者任意定义属性。

Body消息正文,包括了发送给其他程序的消息内容,根据消息体内容的不同,JMS拥有5个消息类型,并分别通过Message的5个子接口来描述。

消息类型

说明

TextMessage

消息是一个字符

ObjectMessage

消息是一个实现了Serializable接口的对象

MapMessage

消息是一个MAP,包括一组键值对元素,键位一个字符,值为任意对象

BytesMessage

消息是一个二进制数组

StreamMessage

消息是一组JAVA原始类型数据,这些数据通过标准流操作按顺序进行填充和读取

5.消息收发的机制:

JMS事务使用了Session对它进行操作,分别拥有支持事务语义的3个方法,通过这些方法启动,提交和回滚一个事务,这些方法分别是begin()、commit()和rollback()。

消息确认是接收者在成功接收到消息后,将一个回执发送给MOM,告之已经成功接收到一种通知机制。确认方式有三种分别是:

1、Session.AUTO_ACKNOWLEDGE:在完成接收消息时,Session自动发送一个确认回执。

2、Session.CLIENT_ACKNOWLEDGE:由客户端程序通过手工调用Message.acknowledge()方法显示确认接收。

3、Session.DUPS_OK_ACKNOWLEDGE:让Session延迟发送确认回执。

例如:创建一个不需事务,自动确认的session方式

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

消息选择是一种选择机制,类似于SQL的查询条件。

发送消息例子:

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.MessageProducer;

import javax.jms.Session;

import javax.jms.TextMessage;

import javax.naming.InitialContext;

import javax.jms.Destination;

 

publicclass MessageSender {

   

    /**

     *发送方法

     *@parammsgText

     */

    publicvoid send(String msgText){

      

       // 获取jms连接

       Connection connection = null;

      

       try {

           // 获取JNDI上下文

           InitialContext ctx = new InitialContext();

           ConnectionFactory cFactory = (ConnectionFactory)ctx.lookup("jndi/jmsConn");

          

           // 获取Destination 目标地址

           Destination dest = (Destination)ctx.lookup("jndi/dest");

           ctx.close();

          

           // 获取一个MOM的连接

           connection = cFactory.createConnection();

          

           // 创建JMS会话

           Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

          

           // 创建一个指定特定目标地址的消息发送者

           MessageProducer sender = session.createProducer(dest);

          

           // 建立Body内容

           TextMessage message = session.createTextMessage(msgText);

          

           // 发送给服务器

           sender.send(message);

          

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           try {

              connection.close();

           } catch (Exception e) {

              e.printStackTrace();

           }

       }

    }

}

接收消息例子:

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.Destination;

import javax.jms.JMSException;

import javax.jms.MessageConsumer;

import javax.jms.Session;

import javax.jms.TextMessage;

import javax.naming.InitialContext;

 

publicclass MessageReceiver {

   

    /**

     *接收方法

     */

    publicvoid receive(){

       Connection connection = null;

      

       try {

           // 创建JNDI上下文

           InitialContext ctx = new InitialContext();

           ConnectionFactory cFactory = (ConnectionFactory)ctx.lookup("jndi/jmsConn");

          

           // 获取目标地址信息

           Destination dest = (Destination)ctx.lookup("jndi/dest");

           ctx.close();

          

           // 获取连接

           connection = cFactory.createConnection();

          

           // 获取连接对话

           Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

          

           // 创建一个指向特定目标地址的消息消费者

           MessageConsumer receiver = session.createConsumer(dest);

          

           // 接收发送请求中的消息信息

           TextMessage textMsg = (TextMessage)receiver.receive();

          

           System.out.println("获取内容:" + textMsg.getText());        

       } catch (Exception e) {

           e.printStackTrace();

       } finally {

           try {

              connection.close();

           } catch (JMSException e) {

              e.printStackTrace();

           }

       }

    }

}

出处:http://csevan.javaeye.com/blog/284610

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值