ActiveMQ下载地址:https://activemq.apache.org/download-archives.html
下载后解压, 可以在conf文件夹下的activemq.xml中修改配置信息
在bin目录下选择适当文件中wrapper启动,或activemq.bat启动
启动不成功的话请关闭防火墙
部分术语:
JMS Provider:实现JMS 接口的消息中间件(provider:供应者);
PTP:Point to Point,即点对点的消息模型;
Pub/Sub:Publish/Subscribe,即发布/订阅的消息模型;
Queue:队列目标; Topic:主题目标;Transaction:事务。
ConnectionFactory:连接工厂,JMS 用它创建连接;
Connection:JMS 客户端到JMS Provider 的连接;
Destination:消息的目的地;Acknowledge:签收;
Session:会话,一个发送或接收消息的线程;
MessageProducer:由 Session 对象创建的用来发送消息的对象;
MessageConsumer:由 Session 对象创建的用来接收消息的对象;
JMS 支持两种截然不同的消息传送模型:PTP(即点对点模型)和 Pub/Sub(即发布 /订阅模型),分别称作:PTP Domain 和 Pub/Sub Domain。
PTP(使用 Queue即队列目标)消息从一个生产者传送至一个消费者。在此传送模型中,目标是一个队列。消息首先被传送至队列目标,然后根据队列传送策略,从该队列将消息传送至向此队列进行注册的某一个消费者,一次只传送一条消息。可以向队列目标发送消息的生产者的数量没有限制,但每条消息只能发送至、并由一个消费者成功使用。如果没有已经向队列目标注册的消费者,队列将保留它收到的消息,并在某个消费者向该队列进行注册时将消息传送给该消费者。
Pub/Sub(使用Topic即主题目标)消息从一个生产者传送至任意数量的消费者。在此传送模型中,目标是一个主题。消息首先被传送至主题目标,然后传送至所有已订阅此主题的活动消费者。可以向主题目标发送消息的生产者的数量没有限制,并且每个消息可以发送至任意数量的订阅消费者。主题目标也支持持久订阅的概念。
持久订阅表示消费者已向主题目标进行注册,但在消息传送时此消费者可以处于非活动状态。当此消费者再次处于活动状态时,它将接收此信息。如果没有已经向主题目标注册的消费者,主题不保留其接收到的消息,除非有非活动消费者注册了持久订阅。这两种消息传送模型使用表示不同编程域的 API 对象(其语义稍有不同)进行处理,如下所示:
基本类型
PTP 用Queue
pub/sub 用topic
PTP模型
PTP(Point-to-Point)模型是基于队列的,生产者发消息到队列,消费者从队列接收消息,队列的存在使得消息的异步传输成为可能。和邮件系统中的邮箱一样,队列可以包含各种消息,JMS Provider 提供工具管理队列的创建、删除。JMS PTP 模型定义了客户端如何向队列发送消息,从队列接收消息,浏览队列中的消息。下面描述 JMS PTP 模型中的主要概念和对象:
名称 | 描述 |
ConnectionFactory | 客户端用 ConnectionFactory,创建Connection对象。 |
Connection | 一个到 JMS Provider 的连接,客户端可以Connection 创建Session 来发送和接收消息。 |
Session | 客户端用Session 创建MessageProducer 和MessageConsumer 对象。如果在Session 关闭时,有 一些消息已经被收到,但还没有被签(acknowledged),那么,当消费者下次连接到相同的队列时,这些消息还会被再次接收。 |
Destination(Queue或TemporaryQueue) | 客户端用 Session 创建Destination 对象。此处的目标为队列,队列由队列名识别。临时队列只能由创建它的Connection 所创建的消费者消费,但是任何生产者都可向临时队列发送消息。 |
MessageProducer | 客户端用MessageProducer 发送消息到队列。 |
MessageConsumer | 客户端用MessageConsumer 接收队列中的消息,如果用户在receive 方法中设定了消息选择条件,那么不符合条件的消息会留在队列中,不会被接收到。 |
Reliability (可靠性) | 队列可以长久地保存消息直到消费者收到消息。消费者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态,充分体现了异步传输模式的优势。 |
PUB/SUB模型
JMS Pub/Sub 模型定义了如何向一个内容节点发布和订阅消息,这些节点被称作主题(topic)。
主题可以被认为是消息的传输中介,发布者(publisher)发布消息到主题,订阅者(subscribe) 从主题订阅消息。主题使得消息订阅者和消息发布者保持互相独立,不需要接触即可保证消息的传送。下面描述 JMS Pub/Sub 模型中的主要概念和对象:
名称 | 描述 |
subscription (订阅) | 消息订阅分为非持久订阅(non-durablesubscription)和持久订阅(durablesubscrip-tion),非持久订阅只有当客户端处于激活状态,也就是和JMS Provider 保持连接状态才能收到发送到某个主题的消息,而当客户端处于离线状态,这个时间段发到主题的消息将会丢失,永远不会收到。持久订阅时,客户端向JMS 注册一个识别自己身份的ID,当这个客户端处于离线时,JMS Provider 会为这个ID 保存所有发送到主题的消息,当客户再次连接到JMS Provider 时,会根据自己的ID 得到所有当自己处于离线时发送到主题的消息。 |
ConnectionFactory | 客户端用 ConnectionFactory 创建Connection对象。 |
Connection | 一个到 JMS Provider 的连接,客户端可以用 Connection 创建Session 来发送和接收消息。 |
Session | 客户端用Session 创建MessageProducer 和 MessageConsumer 对象。它还提供持久订阅主题,或使用unsubscribe 方法取消消息的持久订阅。 |
Destination(Topic和TemporaryTopic) | 客户端用Session 创建Destination对象。此处的目标为主题,主题由主题名识别。临时主题只能由创建它的Connection 所创建的消费者消费。临时主题不能提供持久订阅功能。JMS 没有给出主题的组织和层次结构的定义,由JMS Provider 自己定义。 |
MessageProducer | 客户端用MessageProducer 发布消息到主题。 |
MessageConsumer | 客户端用MessageConsumer 接收发布到主题上 的消息。可以在receive 中设置消息过滤功能,这样, 不符合要求的消息不会被接收。 |
Recovery and Redelivery (恢复和重新派送) | 非持久订阅状态下,不能恢复或重新派送一个未 签收的消息。只有持久订阅才能恢复或重新派送一个未签收的消息。 |
Reliability (可靠性) | 当所有的消息必须被接收,则用持久订阅模式。 当丢失消息能够被容忍,则用非持久订阅模式。 |
代码编写:
1 创建Connectionfactory对象 ActiveMQConnectionFactory()
2 创建Connection 创建后开启start() createConnection()
3 创建sessioncreateSession()
4 创建Destination (queue队列\topic主题) createQueue()/createTopic()
5 创建MessageProducer消息发送者 session.createProduct(queue/topic)
6 创建Message 消息 session.createTextMessage()
7 发送消息 producer.send()
send(destination,message,deliveryMode,priority,timetoLive)
deliveryMode 传送模式 DeliveryMode.PERSISTENT 持久性消息: 默认 保证只被传送一次,使用一次
DeliveryMode.NOT_PERSISTENT 非持久性消息
priority 优先级 0-4 普通消息5-9加急消息 默认为 4
timetoLive 过期时间
8 创建MessageConsumer 接收消息 createConsumer(queue/topic)
9 接受消息 receive() //只能接收一条 建议使用listener 实现MessageListener接口
消息签收
1 客户端签收 2 客户端处理3 消息被签收
1 session.AUTO_ACKNOWLEDGE收条与签收紧随消息处理后发生
2 session.CLIENT_ACKNOWLEDGE 签收一个以消费的消息会自动签收此session所有已消费的收条
3 session.DUPS_OK_ACKNOWLEDGE session不必确保对传送消息的签收会引起消息的重复
订阅
消息订阅分 持久订阅 非持久订阅
持久订阅: 会识别身份,离线时会保存消息
非持久订阅:只有当客户端处于激活状态,才能收到某个主题的消息,离线时会消失
createDurableSubcriber(Topic , naem , messageSelector , noLocal )
messageSelector : 消息选择器
noLocal : 默认是false true时限制消费者只接收与自己相连所发布的消息
name : 标识订阅主题所对应的订阅名称
unsubscribe(String name) 删除持久订阅
事务 commid rollback