JMS介绍

55 篇文章 0 订阅
47 篇文章 0 订阅

一、JMS 概要

        JMS(Java Message Service):Java消息服务是SUN公司开发的一套访问MOM(Message-Oriented-Middleware)消息服务中间件的标准API,MON提供消息接收和转发的服务,对消息进行缓存和持久操作,保证消息的安全性,JMS让开发者都无须了解远程过程调用的细节和网络通信协议的细节就可以通过JMS向MOM发送消息,借助消息我们可以松散耦合的方式集成不同的应用。

二、JMS异步通信

        JMS支持异步消息机制,消息生产者发送消息到MOM,消息消费者甚至可以不在线,MOM会暂存消息,当消息消费者上后,MOM会将消息发给消息消费者,消息生产者不必等消息消费者,这种异步消息机制在很多系统中是非常重要的。

三、消息类型

1.P2P (Point to Point)    点对点

        生产的消息会放在一个队列中,消费者从队列中取走消息,消息一旦被取走,就会从队列中删除,多个观察都观察一个队列,但一个消息只能被一个消费取走。

2.Pub/Sub (Publish/Subscribe)    发布/订阅

        用称为主题 (Topic) 的内容分层结构代替了 P2P 模型中的唯一的目的地,一个发布者可以将消息发布到某个主题下面,订阅了该主题的订阅者就可以收到这个消息。

四、JMS 受管理的对象

    在JMS之前,各MOM产品都提供了专有的API访问其产品,JMS通过MOM产品为Java程序提供了一个发送消息接受消息的标准,用JMS写的应用可以在任何实现JMS标准的MOM产品上运行。

       各MOM产品实现技术和机制存在很大的差别,为保持JMS客户端的可移植性,实现了JMS接口的对象必须与MOM产品的专门技术进行隔离,完成这项工作的机制是管理对象。

       这些JMS接口的对象由提供者消息系统管理员创建,并放置在JNDI的空间中,然后由JMS检索这些对象,通过JMS接口访问这些对象,JMS提供者必须提供创建管理对象的方法,受管对象存放于JNDI。JMS 程序只要知道受管对象的 JNDI 名称和 JMS 接口类型就可以了。

       两个重要的受管对象:

       1)ConnectionFacory:用于创建到提供者底层消息系统的连接。

    2)Destination:用于指定 JMS 客户端发送消息的目的地或接收消息的来源。

五、JMS接口

JMS的两个版本:JMS1.1、JMS1.02,区别:
        JMS1.1 将两种消息统一进行处理,透明地操作两种消息域。
        JMS1.02 区别对待两种消息域,针对每种消息域提供了高级接口的子接口。

高级接口P2P 域子接口Pub/Sub 域子接口
ConnectionFactory
QueueConnectionFactory
TopicConnectionFactory
Connection
QueueConnection
TopicConnection
Destination
Queue
Topic
Session
QueueSession
TopicSession
MessageProducer
QueueSender
TopicPublisher
MessageConsumer
QueueReceiver QueueBrowser
TopicSubscriber

六、JMS程序的基本步骤

        1.通过JNDI查找ConnectionFactory
        2.通过ConnectionFactory创建一个Connection
        3.用Connection创建一个或者多个Session
        4.通过JNDI查询一个或多个Destination
        5.用Session和Destination创建对应的MessageProducer或MessageConsumer
        6.启动Conneciton
        7.发送或接收消息

        关系是:

 ConnectionFactory=>Connection=>Session=>Message
 Destination + Session=>Producer
 Destination + Session=>MessageConsumer

七、JMS消息的结构

1.Header    消息头部

        JMSMessageID              一个字符串用来唯一标示一个消息

        JMSDestination              消息的目的地,Topic或者是Queue

        JMSDeliveryMode          消息的发送模式:persistent或nonpersistent。前者表示

                                               消息在被消费之前,如果JMS提供者DOWN了,重新启

                                               动后消息仍然存在。后者在这种情况下表示消息会被丢

                                               失。可以通过下面的方式设置:

                                               Producer.setDeliveryMode

                                               (DeliveryMode.NON_PERSISTENT);

            JMSTimestamp             当调用send()方法的时候,JMSTimestamp会被自动设

                                               置为当前事件。可以通过下面方式得到这个值:

                                               long timestamp = message.getJMSTimestamp();

           JMSExpiration               表示一个消息的有效期。只有在这个有效期内,消息

                                               消费者才可以消费这个消息。默认值为0,表示消息永

                                               不过期。可以通过下面的方式设置:

                                               producer.setTimeToLive(3600000); 

                                               //有效期1小时 (1000毫秒 * 60秒 * 60分)

        JMSPriority                    消息的优先级。0-4为正常的优先级,5-9为高优先级。

                                               可以通过下面方式设置:

                                               producer.setPriority(9);

        JMSCorrelationID           通常用来关联多个Message。例如需要回复一个消息,

                                               可以把JMSCorrelationID设置为所收到的消息的

                                               JMSMessageID

        JMSReplyTo                  有时消息生产者希望消费者回复一个消息,

                                               JMSReplyTo为一个Destination,表示需要回复的目的

                                               地。当然消费者可以不理会它

        JMSType                       表示消息体的结构,和JMS提供者有关

        JMSRedelivered            如果这个值为true,表示消息是被重新发送了。因为有

                                               时消费者没有确认他已经收到消息或者JMS提供者不

                                               确定消费者是否已经收到

2.Properties    消息属性

        JMSX 开头的是 JMS 专用的

        JSM_ 开头的是提供者专用的

3.Body    消息内容

        TextMessage         普通字符串消息,包含一个String

        ObjectMessage      对象消息,包含一个可序列化的Java 对象

        MapMessage         一个Map类型的消息;名称为 string 类型,而值为 Java 的基本类型

        BytesMessage       二进制数组消息,包含一个byte[]

        StreamMessage     Java 数据流消息,用标准流操作来顺序的填充和读取

        XMLMessage          一个XML类型的消息

八、JMS消息收发机制

1.JMS事务

session = conn.createQueueSession(true, Session.AUTO_ACKNOWLEDGE); 
true 表示这个会话是事务性的,需要显式的commit 或者rollback ()。

2.JMS消息确认

消息确认是收到消息发送一个回执确认收到消息,有三种确认方式:

Session.ATUO_ACKNOWLEDGE        接收到消息自动发送这一个确认

Session.CLIENT_ACKNOWLEDGE     调用 Meeage#acknowledge() 方法 , 显示发送确认

Session.DUPS_OK_ACKNOWLEDGE 延时发送消息 , 但可能有重复接收消息的问题

3.JMS消息过滤

MessageConsumer consumer=session.createConsumer(destination,过滤条件);

九、应用示例

/**
 * @author Administrator
 * @desctiption 结合一个例子,深入理解JMS的基本概念
 * 消息的消费者接收消息可以采用两种方式:
 * 1、consumer.receive() 或 consumer.receive(int timeout);
 * 2、注册一个MessageListener。
 * 采用第一种方式,消息的接收者会一直等待下去,直到有消息到达,或者超时。
 * 后一种方式会注册一个监听器,当有消息到达的时候,会回调它的onMessage()方法。
 */
package com.wl.jms;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

public class MessageSendAndReceive {

	/**
	 * @param args
	 * @throws JMSException 
	 */
	public static void main(String[] args) throws JMSException {
	    // TODO Auto-generated method stub
	    ConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");  
	     
            Connection connection = factory.createConnection();  
            connection.start();  
            //创建消息的Destination 
            Queue queue = new ActiveMQQueue("testQueue");  
         
            final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
            //创建将要发送的消息
            Message message = session.createTextMessage("Hello JMS!");  
            //创建消息生产者发送消息 
            MessageProducer producer = session.createProducer(queue);  
            producer.send(message);  
     
            System.out.println("Send Message Completed!");  
            //创建消息的接收者 
            MessageConsumer comsumer = session.createConsumer(queue); 
            //消息的消费者接收消息的第一种方式:consumer.receive() 或 consumer.receive(int timeout);
            //Message recvMessage = comsumer.receive();  
            //System.out.println(((TextMessage)recvMessage).getText()); 
            //消息的消费者接收消息的第二种方式:注册一个MessageListener
            comsumer.setMessageListener(new MessageListener(){
		public void onMessage(Message msg) {
		    // TODO Auto-generated method stub
		    TextMessage textMsg=(TextMessage)msg;
		    try {
			System.out.println(textMsg.getText());
		    } catch (JMSException e) {
			e.printStackTrace();
		    }
		}	
            });
	}
}

转自:http://blog.csdn.net/lilp_ndsc/article/details/4211799

            http://blog.csdn.net/wl_ldy/article/details/7884534

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值