1 .消息队列概述
消息队列是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
2 .JMS
JMS是由包括Sun Microsystems和IBM等在内的几个公司合作设计的一个面向消息的中间件(MOM)API。JMS定义了Java 中访问消息中间件的接口,但JMS 只是接口,并没有给予实现,实现JMS 接口的消息中间件称为JMS提供者(JMS Provider)。JMS的目的是应用程序能在异步情况下可靠地传输和接受消息。从编程的角度来看,JMS可以被当作一个容器管理的资源,与JDBC连接类似。正如可以通过JDBC去访问许多不同的关系数据库一样,可以通过JMS访问独立于厂商的消息服务系统。JMS主要包括三个部分――JMS提供者(JMS Provider)、消息发送者(Message Producer)和消息接收者(Message Consumer)。JMS提供者是指实现JMS API接口的消息系统,是消息的中转站;消息发送者是指消息的创造和发送者,是消息的发源地;消息接收者是指接收消息的应用程序,是消息最终的目的地。
JMS消息是异步处理的,消息发送者可以发送一个消息而无须等待响应。消息发送者将消息发送到一条虚拟的通道(主题或队列)上,消息接收者则订阅或是监听该通道。一条消息可能最终转发给一个或多个消息接收者,这些接收者都无需对消息发送者做出回应。
3 .JMS消息传递模式
JMS支持两种消息传递模式――点对点模式(P2P)和发布/订阅模式(Publish/Subscribe)。这两种都是人们熟知的push模式,消息的发送者是活动的发起人,而接收者则是被动的接收消息。在JMS中,这些消息传递模式被称为消息域(message domain)。
JMS点对点消息域
在点对点模式中,发送者和接收者对消息传送的目的地址达成一致,即所谓的队列( queue)。消息队列位于JMS提供者中,消息发送者向一个消息队列发送消息,消息接收者可以在消息发送后的任何时刻从这个队列中(被动地)接收消息,在接收者确认之前消息一直保存在消息队列中直到过期。
JMS点对点消息域具有以下特点:
u 每条消息能而且只能被一个接收者接收。
u 每条消息或者被接收者从队列中取走,或者被 JMS提供者在超时的情况下删除。
u 消息产生的时候接收者不一定要存在,接收者可以在消息产生后的任何时间里取走消息。
u 接收者不能请求一个消息。
u 接收者必须在收到消息后发出确认信息。
JMS发布/订阅消息域
在发布/订阅模式下,发送者被称为发布者(publisher),一个消息可已有很多接收者,这些接收者被称为订阅者(subscriber)。发布/订阅模式采用与点对点模式完全不同的消息发送模式。在发布/订阅模式下,发布者给一个主题(topic)发送消息,多个订阅者在订阅的时候可以订阅他们感兴趣的主题。一个主题可以被多个订阅者订阅,一个订阅者也可以订阅多个主题。一个主题的消息只被发给该主题的所有订阅者。订阅者只能接收它订阅的主题中的消息,并且,在默认情况下,订阅者在消息发送的时候必须是活动的,并随时准备接收消息,否则它将错过该消息。为了避免这种时间依赖性 JMS API允许订阅者创建持久订阅。
JMS发布/订阅消息域具有以下特点:
u 每一条消息由一个发布者创建而由0个或多个订阅者接收它。
u 消息立刻被分发给现有的订阅者。
u 订阅者必须在消息发送的时候存在以接收消息。
u 持久订阅允许订阅者接收它处于非活动状态时由发布者向主题发送的消息。
u 订阅者必须在接收到消息后发出确认信息。
4 .JMS消息的组成
在J2EE1.4后,JMS API不再区分在点对点域和发布/订阅域中创建的消息。JMS消息由以下三部分组成:
消息头(header)――JMS消息头包含了许多字段,它们是消息发送后由JMS提供者或消息发送者产生,用来表示消息、设置优先权和失效时间等等,并且为消息确定路由。
属性(property)――由消息发送者产生,用来添加删除消息头以外的附加信息。
消息体(body)――由消息发送者产生,JMS中定义了5种消息体:ByteMessage、MapMessage、ObjectMessage、StreamMessage和TextMessage。
5 .ActiveMQ
ActiveMQ是最受欢迎并且功能最强大的开源消息队列。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。
ActiveMQ支持以下特性:
1) 多种语言和协议编写客户端。语言 :Java、C、C++、C#、Ruby、Perl、Python、PHP。应用协议:OpenWire、Stomp REST、WS Notification、XMPP、AMQP。
2) 完全支持JMS1.1和J2EE 1.4规范(持久化、XA 消息、事务)。
3) 对Spring的支持,ActiveMQ可以很容得内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性。
4) 通过了常见J2EE服务器(如Geronimo、JBoss 4、GlassFish、WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上。
5) 支持多种传送协议:in-VM、TCP、SSL、NIO、UDP、JGroups、JXTA。
6) 支持通过JDBC和journal提供高速的消息持久化。
7) 从设计上保证了高性能的集群 ,客户端--服务器、点对点。
8) 支持Ajax。
9) 支持与Axis的整合。
10) 可以很容易得调用内嵌 JMS provider进行测试。
其架构图如下所示