消息队列(Message Queue,简称 MQ)是阿里巴巴集团中间件技术部自主研发的专业消息中间件。用于保证异构应用之间的消息传递。应用程序通过MQ接口进行互连通信,可以不必关心网络上的通信细节,从而将更多的注意力集中于应用本身。
分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。
对象
•
消息
(Message)
•
队列
(Queue)
•
队列管理器
(QueueManager)
•
通道
(Channel)
•
监听器
(Listener)
关系:队列管理器是负责向应用程序提供消息服务的机构,我们可以把队列管理器比作是数据库,队列是其中的一张表,消息表中的一条记录。
1、消息(Message)
消息是 WebSphereMQ中最小的概念,本质上就是一条数据,它能被一个或多个应用程序所理解,是应用程序之间传递的信息载体。
消息可以大致分成两部分:应用数据体和消息数据头。消息数据头是对消息属性的描述,这段信息往往被队列管理器用来确定对消息的处理。消息数据头可以由应用程序或系统的消息服务程序共同产生,它包含了消息在传送中的必要信息,如目标队列管理器的名字,目标队列的名字,以及消息的其它一些属性。
消息可以分成持久(Persistent)消息和非持久 (Non-Persistent)消息。所谓“持久”的意思,就是在 WebSphere MQ 队列管理器重启动后,消息是否仍然能保持。
2、队列 (Queue):分本地队列、远程队列、模型队列
本地队列按功能可分成
初始化队列,传输队列,目标队列和死信队列
。
–
初始化队列用做消息触发功能。
–
传输队列只是暂存待传的消息,条件许可的情况下,通过管道将消息传送其它的队列管理器。
–
目标队列是消息的目的地,可以长期存放消息。
–
如果消息不能送达目标队列,也不能再路由出去,则被自动放入死信队列保存。
远程队列
–
用来指定远端队列管理器中的队列。使用了远程队列定义,程序就不需要知道目标队列的位置。
模型队列
-定义了一套本地队列的属性集合,一旦打开模型队列,队列管理器会按这些属性动态地创建出一个本地队列。
3、队列管理器(QueueManager)
WebSphere MQ中的队列管理器可以含有很多个队列,但一个队列只能属于一个队列管理器。一个操作系统平台可以创建一个队列管理器,也可以创建多个队列管理器。队列管理器、队列、通道等等都是WebSphere MQ的对象,所有的对象都有各自的属性,有些属性必须在对象创建的时候指定,有些可以在创建以后更改。
4、通道 (Channel)
通道是
两个队列管理器之间的一种单向的点对点的通信连接
,消息在通道中只能单向流动。如果需要双向交流,可以建立一对通道,一来一去。站在队列管理器的角度,这一对通道可以按消息的流向分成输入通道和输出通道。通过配置,对于放入本地传输队列中的消息,队列管理器会自动将其通过输出通道发出,送入对方的远程目标队列。
。
。
5、监听器(Listener)
同步接收消息:同步读取即主动读取方式
异步接收消息异步读取则需要设定Listener,在消息到达后,自动调用Listener的onMessage()方法。
JMS开发
jms即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
•
JMS
中有一系列的类:
ConnectionFactory
,
Connection
,
Session
,
MessageProducer
,
MessageConsumer
,
Message
•
•
在
JMS
编程时,程序首先要找出
ConnectionFactory
,以此创建
Connection
,再建立
Session
,以后所有的操作都以
Session
为基础。找出
Queue
或
Queue (
统称
Destination)
,以此创建
QueueSender
或
QueuePublisher
(
统称
MessageProducer
)
,在该对象上发送或发布消息。也可以在
Destination
基础上创建
QueueReceiver
或
QueueSubscriber
(
统称
MessageConsumer
)
,在该对象上接收或订阅消息。