文章目录
1 MOM简介
1.1 JMS基础
JMS
全称:Java Message Service
中文: Java
消息服务。
JMS
是 Java
的一套API
标准, 最初的目的是为了使应用程序能够访问现有的MOM
系统
MOM
是 Message Oriented Middleware
的英文缩写, 指的是利用高效可靠的消息传递机制进行平台无关的数据交流, 并基于数据通信来进行分布式系统的集成
常见MOM
系统包括Apache
的ActiveMQ
、阿里巴巴的RocketMQ
、IBM
的 MQSeries
、Microsoft
的 MSMQ
、BEA
的RabbitMQ
等。(并非全部的MOM
系统都遵循JMS
规范)
基于JMS
实现的MOM
, 又被称为 JMS Provider
1.2 消息
消息
是在两台计算机间传送的数据单位。消息可以非常简单, 例如只包含文本字符串;也可以更复杂, 可能包含嵌入对象。
消息被发送到队列中。 消息队列
是在消息的传输过程中保存消息的容器
。 消息队列管理器在将消息从它的源中继
到它的目标时充当中间人。
队列的主要目的是提供路由并保证消息的传递; 如果发送消息时接收者不可用, 消息队列会保留消息, 直到可以成功地传递它。
1.2.1 异步解耦
消息队列的主要特点是异步处理
, 主要目的是减少请求响应时间
和解耦
。 所以主要的使用场景
就是将比较耗时而且不需要即时(同步)返回
结果的操作作为消息放入消息队列。 同时由于使用了消息队列,只要保证消息格式不变,消息的发送方和接收方并不需要彼此联系,也不需要受对方的影响, 即解耦和
。
如:跨系统的异步通信, 所有需要异步交互的地方都可以使用消息队列。 就像我们除了打电话(同步) 以外, 还需要发短信, 发电子邮件(异步) 的通讯方式。
多个应用之间的耦合, 由于消息是平台无关和语言无关的, 而且语义上也不再是函数调用, 因此更适合作为多个应用之间的松耦合的接口。 基于消息队列的耦合, 不需要发送方和接收方同时在线。
在企业应用集成(EAI
) 中, 文件传输, 共享数据库, 消息队列, 远程过程调用都可以作为集成的方法。
应用内的同步变异步: 比如订单处理, 就可以由前端应用将订单信息放到队列, 后端应用从队列里依次获得消息处理, 高峰时的大量订单可以积压在队列里慢慢处理掉。 由于同步通常意味着阻塞, 而大量线程的阻塞会降低计算机的性能。
消息驱动的架构(EDA
), 系统分解为消息队列,消息制造者和消息消费者, 一个处理流程可以根据需要拆成多个阶段(Stage
), 阶段之间用队列连接起来, 前一个阶段处理的结果放入队列, 后一个阶段从队列中获取消息继续处理。
2 ActiveMQ简介
多种语言和协议编写客户端。 语言: Java,C,C++,C#,Ruby,Perl,Python,PHP
。 应用协议:OpenWire,Stomp REST,WS Notification,XMPP,AMQP
2.1 优点
- 完全支持
JMS1.1
和J2EE 1.4
规范 (持久化,XA
消息, 事务) - 对
Spring
的支持,ActiveMQ
可以很容易内嵌到使用Spring
的系统里面去 - 通过了常见
J2EE
服务器(如Geronimo,JBoss 4,GlassFish,WebLogic
)的测试, 其中通过JCA 1.5 resource adaptors
的配置, 可以让ActiveMQ
可以自动的部署到任何兼容J2EE 1.4
商业服务器上 - 支持多种传送协议:
in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
- 支持通过
JDBC
和journal
提供高速的消息持久化 - 从设计上保证了高性能的集群, 客户端-服务器, 点对点支持
Ajax
- 支持与 Axis 的整合,
WebServices
- 可以很容易的调用内嵌
JMS provider
, 进行测试
2.2 名称解释
2.2.1 Destination
目的地, JMS Provider
(消息中间件) 负责维护, 用于对 Message
进行管理的对象。MessageProducer
需要指定 Destination
才能发送消息,MessageConsumer
需要指定 Destination
才能接收消息。
2.2.2 Producer
消 息 生成 者 (客 户 端、 生 成 消 息 ), 负 责 发送 Message
到 目 的地 。 应 用 接口 为MessageProducer
。 在 JMS
规范中, 所有的标准定义都在javax.jms
包中。
2.2.3 Consumer(Receiver)
消息消费者(处理消息), 负责从目的地中消费(处理|监听|订阅)Message
。 应用接口为 MessageConsumer
2.2.4 Message
消息(Message
), 消息封装一次通信的内容。常见类型有: StreamMessage、BytesMessage、TextMessage、 ObjectMessage、 MapMessage
。
2.2.5 ConnectionFactory
链接工厂, 用于创建链接的工厂类型。
注意
, 不能和 JDBC
中的 ConnectionFactory
混淆。
2.2.6 Connection
链接. 用于建立访问 ActiveMQ
连接的类型, 由链接工厂创建.
注意
, 不能和JDBC
中的Connection
混淆。
2.2.7 Session
会话, 一次持久有效有状态的访问. 由链接创建. 是具体操作消息的基础支撑。
2.2.8 Queue & Topic
Queue
是队列目的地, Topic
是主题目的地。 都是 Destination
的子接口。
Queue
特点: 队列中的消息, 默认只能由唯一的一个消费者处理。 一旦处理消息删除。
Topic
特点: 主题中的消息, 会发送给所有的消费者同时处理。 只有在消息可以重复处理的业务场景中可使用。
2.2.9 PTP
Point to Point
:点对点消息模型。 就是基于 Queue
实现的消息处理方式。
2.2.10 PUB & SUB
Publish & Subscribe
: 消息的发布/订阅
模型。 是基于Topic
实现的消息处理方式