ActiveMQ介绍
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。
ActiveMQ安装
ActiveMQ要求JDK1.5以上,推荐1.6以上版本。
安装完JDK后,从 http://activemq.apache.org/download.html下载MQ的最新版本。解压后,可以看到MQ目录下有以下文件和目录。
ActiveMQ目录结构
目录结构介绍如下:
bin,放置启动、停止、注册服务等命令文件。
conf,配置文件,包括broker、jetty、log等配置文件。
data,放置消息缓存(kahadb)、jetty中jsp编译后的class、AMQ日志等文件。
docs,帮助文档
examples,应用示例
lib,依赖的jar包
webapps,AMQ下的web应用,包括web console 和 file server。
webapps-demo,demo应用,默认不能访问,如需访问需要在conf/jetty.xml文件中配置。
activemq-all-5.10.1.jar, AMQ的开发用的jar包
其它文件,包括license、notice和 readme
JMS介绍
JMS(Java Message Service) 即Java消息服务。它提供标准的产生、发送、接收消息的接口简化企业应用的开发。它支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型。P2P 模型规定了一个消息只能有一个接收者;Pub/Sub 模型允许一个消息可以有多个接收者。
对于点到点模型,消息生产者产生一个消息后,把这个消息发送到一个Queue(队列)中,然后消息接收者再从这个Queue中读取,一旦这个消息被一个接收者读取之后,它就在这个Queue中消失了,所以一个消息只能被一个接收者消费。
与点到点模型不同,发布/订阅模型中,消息生产者产生一个消息后,把这个消息发送到一个Topic中,这个Topic可以同时有多个接收者在监听,当一个消息到达这个Topic之后,所有消息接收者都会收到这个消息。
ActiveMQ优势
·多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
·完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
·对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
·完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
·通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
·支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
·从设计上保证了高性能的集群,客户端-服务器,点对点
·支持Ajax
·支持与Axis的整合
·可以很容易得调用内嵌JMS provider,进行测试
场景适用
适合场景:消息中间件一般被用在异步消息通信、整合多个系统的场景。
不适合场景:如果系统生态环境很单一,无需跟其他第三方进行通信,或是虽然要简单的通信但是数据量不大,业务不太复杂,其实个人认为是无需用MQ这种重量级的解决方案的,直接暴露接口就好了。
ActiveMQ后台
浏览器打开http://192.168.202.128:8161/admin
输入用户名、密码,登录到后台界面。
点对点通信模式
一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息。这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列。这种模式被概括为:
只有一个消费者将获得消息
生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态。
每一个成功处理的消息都由接收者签收
生产者生产消息
消费者消费消息
在点对点通信模式中,消息只要没有被消费,一直是挂起的状态,直到被消费者消费。
而在发布/订阅(Pub/Sub)模型中,如果消费者没有订阅主题或没有启动服务,则获得不到消息。
发布/订阅模型
支持向一个特定的消息主题发布消息。多个订阅者可能对接收来自特定消息主题的消息感兴趣。在这种模型下,发布者和订阅者彼此不知道对方。这种模式好比是匿名公告板。这种模式被概括为:
多个消费者可以获得消息
在发布者和订阅者之间存在时间依赖性。发布者需要建立一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者建立了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。
Java代码实现
编程的结构
消息产生者向JMS发送消息的步骤
(1)创建连接使用的工厂类JMS ConnectionFactory
(2)使用管理对象JMS ConnectionFactory建立连接Connection
(3)使用连接Connection 建立会话Session
(4)使用会话Session和管理对象Destination创建消息生产者MessageSender
(5)使用消息生产者MessageSender发送消息
消息消费者从JMS接受消息的步骤
(1)创建连接使用的工厂类JMS ConnectionFactory
(2)使用管理对象JMS ConnectionFactory建立连接Connection
(3)使用连接Connection 建立会话Session
(4)使用会话Session和管理对象Destination创建消息消费者MessageReceiver
(5)使用消息消费者MessageReceiver接受消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver
消息消费者必须实现了MessageListener接口,需要定义onMessage事件方法。