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     订阅者 (都能享受上面的服务,不用理会谁发布的)
  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

一个典型的 JMS 程序要经过以下步骤才能开始创建和使用消息
1 、通过 JNDI 查询 ConnectionFactory
2
、用 ConnectionFactory 创建一个 Connection
3
、用 Connection 创建一个或多个 Session
4
、通过 JNDI 查询一个或多个 Destination
5
、用 Session Destination 创建对应的 MessageProducer MessageConsumer
6
、启动 Connection
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原始类型数据,这些数据通过标准流操作按顺序进行填充和读取

 
消息收发的机制
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;
 
public class MessageSender {
   
    /**
      * 发送方法
      * @param msgText
      */
    public void 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;
 
public class MessageReceiver {
   
    /**
      * 接收方法
      */
    public void 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();
           }
       }
    }
}
 

 

你可能感兴趣的:(数据结构,应用服务器,中间件,jms,音乐)