ActiveMQ开发手册范本Word文件下载.docx
《ActiveMQ开发手册范本Word文件下载.docx》由会员分享,可在线阅读,更多相关《ActiveMQ开发手册范本Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。
![ActiveMQ开发手册范本Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/13/079cf1bc-f1e9-40a7-8058-978bf6f9902a/079cf1bc-f1e9-40a7-8058-978bf6f9902a1.gif)
对于一个消息可以有多个接收者。
已有的MOM系统包括IBM的MQSeries、Microsoft的MSMQ和BEA的MessageQ等。
由于没有一个通用的标准,这些系统很难实现互操作和无缝连接。
JavaMessageService(JMS)是SUN提出的旨在统一各种MOM系统接口的规,它包含点对点(PointtoPoint,PTP)和发布/订阅(Publish/Subscribe,pub/sub)两种消息模型,提供可靠消息传输、事务和消息过滤等机制。
2.JMS概述
2.1JMS规
JAVA消息服务(JMS)定义了Java中访问消息中间件的接口。
JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称为JMSProvider,例如ActiveMQ。
2.2术语
JMSProvider:
实现JMS接口的消息中间件(provider:
供应者);
PTP:
PointtoPoint,即点对点的消息模型;
Pub/Sub:
Publish/Subscribe,即发布/订阅的消息模型;
Queue:
队列目标;
Topic:
主题目标;
Transaction:
事务。
ConnectionFactory:
连接工厂,JMS用它创建连接;
Connection:
JMS客户端到JMSProvider的连接;
Destination:
消息的目的地;
Acknowledge:
签收;
Session:
会话,一个发送或接收消息的线程;
MessageProducer:
由Session对象创建的用来发送消息的对象;
MessageConsumer:
由Session对象创建的用来接收消息的对象;
2.3JMS编程模型
在JMS编程模型中,JMS客户端(组件或应用程序)通过JMS消息服务交换消息。
消息生产者将消息发送至消息服务,消息消费者则从消息服务接收这些消息。
这些消息传送操作是使用一组实现JMS应用编程接口(API)的对象(由JMSProvide提供)来执行的。
在JMS编程模型中,JMS客户端使用ConnectionFactory对象创建一个连接,向消息服务发送消息以及从消息服务接收消息均是通过此连接来进行。
Connection是客户端与消息服务的活动连接。
创建连接时,将分配通信资源以及验证客户端。
这是一个相当重要的对象,大多数客户端均使用一个连接来进行所有的消息传送。
连接用于创建会话。
Session是一个用于生成和使用消息的单线程上下文。
它用于创建发送的生产者和接收消息的消费者,并为所发送的消息定义发送顺序。
会话通过大量确认选项或通过事务来支持可靠传送。
客户端使用MessageProducer向指定的物理目标(在API中表示为目标身份对象)发送消息。
生产者可指定一个默认传送模式(持久性消息与非持久性消息)、优先级和有效期值,以控制生产者向物理目标发送的所有消息。
同样,客户端使用MessageConsumer对象从指定的物理目标(在API中表示为目标对象)接收消息。
消费者可使用消息选择器,借助它,消息服务可以只向消费者发送与选择标准匹配的那些消息。
消费者可以支持同步或异步消息接收。
异步使用可通过向消费者注册MessageListener来实现。
当会话线程调用MessageListener对象的onMessage()方法时,客户端将使用消息。
2.4JMS编程域
JMS支持两种截然不同的消息传送模型:
PTP(即点对点模型)和Pub/Sub(即发布/订阅模型),分别称作:
PTPDomain和Pub/SubDomain。
PTP(使用Queue即队列目标)消息从一个生产者传送至一个消费者。
在此传送模型中,目标是一个队列。
消息首先被传送至队列目标,然后根据队列传送策略,从该队列将消息传送至向此队列进行注册的某一个消费者,一次只传送一条消息。
可以向队列目标发送消息的生产者的数量没有限制,但每条消息只能发送至、并由一个消费者成功使用。
如果没有已经向队列目标注册的消费者,队列将保留它收到的消息,并在某个消费者向该队列进行注册时将消息传送给该消费者。
Pub/Sub(使用Topic即主题目标)消息从一个生产者传送至任意数量的消费者。
在此传送模型中,目标是一个主题。
消息首先被传送至主题目标,然后传送至所有已订阅此主题的活动消费者。
可以向主题目标发送消息的生产者的数量没有限制,并且每个消息可以发送至任意数量的订阅消费者。
主题目标也支持持久订阅的概念。
持久订阅表示消费者已向主题目标进行注册,但在消息传送时此消费者可以处于非活动状态。
当此消费者再次处于活动状态时,它将接收此信息。
如果没有已经向主题目标注册的消费者,主题不保留其接收到的消息,除非有非活动消费者注册了持久订阅。
这两种消息传送模型使用表示不同编程域的API对象(其语义稍有不同)进行处理,如下所示:
基本类型
统一域
PTP域
Pub/Sub域
ConnectionFactory
QueueConnectionFactory
TopicConnectionFactory
Connection
QueueConnection
TopicConnection
Session
QueueSession
TopicPublisher
Destination(Queue或Topic)
Queue
Topic
MessageProducer
QueueSender
MessageConsumer
QueueReceiverQueueBrowser
TopicSubscriber
2.5JMS消息结构
JMS消息由以下几部分组成:
消息头,属性和消息体。
2.5.1消息头(Header)
消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性
如:
JMSDestination,JMSMessageID等。
消息头
由谁设置
描述
JMSDestination(目的地)
send方法
消息发送的目的地。
JMSDeliveryMode(传送模式)
两种模式:
PERSISTENT
和NON_PERSISTENT,PERSISTENT
表示该消息一定要被送到目的地,否则会导致应用错误。
NON_PERSISTENT
表示偶
然丢失该消息是被允许的,这两种模式使开发者可以在消息传送的可靠性和吞吐量之间找到平衡点。
JMSExpiration(消息过期时间)
等于Destination的send方法中的timeToLive值加上发送时刻的GMT时间值。
如果timeToLive值等于零,则JMSExpiration被设为零,表示该消息永不过期。
如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。
JMSPriority(消息优先级)
从0-9十个级别,0-4是普通消息,5-9是加急消息。
JMSMessageID(信息ID)
唯一识别每个消息的标识,由JMSProvider产生。
JMSTimestamp(时间戳)
一个消息被提交给JMSProvider到消息被发出的时间。
JMSCorrelationID(回复ID)
客户
用来连接到另外一个消息,典型的应用是在回复消息中连接到原消息。
JMSReplyTo(回复地址)
提供本消息回复消息的目的地址
JMSType(类型)
消息类型的识别符。
JMSRedelivered(再次发送)
JMSProvider
如果一个客户端收到一个设置JMSRedelivered属性的消息,则表示可能客户端曾经在早些时候收到过该消息,但并没有签收(acknowledged)。
2.5.2属性(Properties)
除了消息头中定义好的标准属性外,JMS提供一种机制增加新属性到消息头中,
这种新属性包含以下几种:
1.应用需要用到的属性;
2.消息头中原有的一些可选属性;
3.JMSProvider需要用到的属性。
如:
标准的JMS消息头包含以下属性:
上图的10个属性
2.5.3消息体(Body)
JMSAPI定义了5种消息体格式,也叫消息类型,可以使用不同形式发送接收数据并可以兼容现有的消息格式,下面描述这5种类型:
消息类型
消息体
TextMessage
java.lang.String对象,如xml文件容
MapMessage
键/值对的集合,键是String对象,
值类型可以是Java任何基本类型
BytesMessage
字节流
StreamMessage
Java中的输入输出流
ObjectMessage
Java中的可序列化对象
Message
没有消息体,只有消息头和属性
2.6PTP模型
PTP(Point-to-Point)模型是基于队列的,生产者发消息到队列,消费者从队列接收消息,队列的存在使得消息的异步传输成为可能。
和系统中的一样,队列可以包含各种消息,JMSProvider提供工具管理队列的创建、删除。
JMSPTP模型定义了客户端如何向队列发送消息,从队列接收消息,浏览队列中的消息。
下面描述JMSPTP模型中的主要概念和对象:
名称
客户端用ConnectionFactory,创建Connection对象。
Connection
一个到JMSProvider的连接,客户端可以Connection创建Session来发送和接收消息。
客户端用Session创建MessageProducer和MessageConsumer对象。
如果在Session关闭时,有
一些消息已经被收到,但还没有被签(acknowledged),那么,当消费者下次连接到相同的队列时,这些消息还会被再次接收。
Destination(Queue或TemporaryQueue)
客户端用Session创建Destination对象。
此处的目标为队列,队列由队列名识别。
临时队列只能由创建它的Connection所创建的消费者消费,但是任何生产者都可向临时队列发送消息。
客户端用MessageProducer发送消息到队列。
客户端用MessageConsumer接收队列中的消息,如果用户在receive方法中设定了消息