资源链接
概念
ActiveMQ特性
- ActiveMQ服务器工作模型
- ActiveMQ消息传送模型
- ActiveMQ消息选择器
- ActiveMQ消息签收
- ActiveMQ消息传送模式
- ActiveMQ优先级设置
- ActiveMQ消息过期设置
- ActiveMQ持久订阅设置
- ActiveMQ异步发送消息
- ActiveMQ消费者特性
- ActiveMQ消息预取机制
消息模型
ActiveMQ中有两种类型的消息模型
- 点对点(point-to-point,简称PTP)Queue消息传递模型
- 发布/订阅(publish/subscribe,简称pub/sub)Topic消息传递模型
类型 | Topic | Queue |
---|---|---|
概要 | Publish Subscribe messaging 发布订阅消息 | Point-to-Point 点对点 |
有无状态 | topic数据默认不落地,是无状态的。 | Queue数据默认会在mq服务器上以文件形式保存,比如Active MQ一般保存在$AMQ_HOME\data\kr-store\data下面。也可以配置成DB存储。 |
完整性保障 | 并不保证publisher发布的每条数据,Subscriber都能接受到。 | Queue保证每条数据都能被receiver接收。 |
消息是否会丢失 | 一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了。 | Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。 |
消息发布接收策略 | 一对多的消息发布接收策略,监听同一个topic地址的多个sub都能收到publisher发送的消息。Sub接收完通知mq服务器 | 一对一的消息发布接收策略,一个sender发送的消息,只能有一个receiver接收。receiver接收完后,通知mq服务器已接收,mq服务器对queue里的消息采取删除或其他操作。 |
消息类型
文本消息
TextMessage message = session.createTextMessage(msg);
Map消息
MapMessage message = session.createMapMessage();
序列化消息
Staff staff = new Staff(1, "搬砖工"); // Staff必须实现序列化 ObjectMessage message = session.createObjectMessage(staff);
字节消息
String str = "BytesMessage 字节消息"; BytesMessage message = session.createBytesMessage(); message.writeBytes(str.getBytes());
流消息
String str = "StreamMessage 流消息"; StreamMessage message = session.createStreamMessage(); message.writeString(str); message.writeInt(521);
消息确认模式
客户端成功接收一条消息的标志是这条消息被签收。成功接收一条消息一般包括如
下三个阶段:
1. 客户端接收消息;
2. 客户端处理消息;
3. 消息被确认。确认可以由ActiveMQ 发起,也可以由客户端发起,取决于Session 确认模式的设置。
在带事务的 Session 中,确认自动发生在事务提交时。如果事务回滚,所有已经接收的消息将会被再次传送。
在不带事务的Session 中,一条消息何时和如何被确认取决于Session 的设置。
模式 | 说明 |
---|---|
Session.AUTO_ACKNOWLEDGE | 默认的消息确认模式, session 将按照MessageConsumer.receive() 返回成功或者用于办法回调MessageListener.onMessage() 返回成功来主动回执消息确认。 |
Session.CLIENT_ACKNOWLEDGE | 在这种模式下,客户端应用法度代码中显式调用Message.acknowledge()办法,以确认该消息。 |
Session.DUPS_OK_ACKNOWLEDGE | 该模式,jms session可以或许主动的回执消息确认,然则它是一种怠惰的消息确认模式,一旦应用体系故障,一些消息可能会被处理惩罚然则没有回执,一旦体系重启,则会呈现消息的重发题目。 这是一种最快的消息确认模式,然则,花费者必须处理惩罚反复的消息处理惩罚题目。(例如:如何侦测和丢弃重发的消息的处理惩罚逻辑) |
Session.SESSION_TRANSACTED | 当应用事务时,会话会隐含SESSION_TRANSACTED模式。事务提交的反响,然后相当于消息的确认。 当应用JMS事务来发送一组消息(多个消息),交易模式是很是有效的。但避免应用事务发送一个消息,因为这会带来额外的开销提交或回滚事务。 |
ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE | 它不是一个标准的消息确认模式,很类似与CLIENT_ACKNOWLEDGE,只可惜它的消息确认是一种办法回调。在完成消息处理惩罚后不会去向理惩罚消息确认的。 |
事务
ActiveMQ支持两种事务
- JMS 事务。使用Session的commint()和rollback()即可实现。(类似于JDBC Connection对象)
- XA 事务。XASession,XAResource通过与消息中介(Message Broker)通信来实现。
事务原理
在支持事务的session中,producer发送message时在message中带有transactionID。broker收到message后判断是否有transactionID,如果有就把message保存在transaction store中,等待commit或者rollback消息。所以ActiveMQ的事务是针对broker而不是producer,不管session是否commit,broker都会收到message。
如果producer发送模式选择了persistent,那么message过期后会进入死亡队列。在message进入死亡队列之前,ActiveMQ会删除message中的transaction ID,这样过期的message就不在事务中了,不会保存在transaction store中,会直接进入死亡队列。
开发
spring配置
支持的协议与案例
接口 | 协议 | 代码实例 |
---|---|---|
JMS | OpenWire | Send to Queue Send to Topic Receive from Queue Receive from Topic |
JMS(Apache Camel) | OpenWire | Send to Queue Send to Topic Receive from Queue Receive from Topic |
REST(JAX-RS) | REST | Send to Queue Send to Topic Receive from Queue Receive from Topic |
WebSocket | STOMP | Send to Queue Send to Topic Receive from Queue Receive from Topic |
优秀案例
配置
持久化
其他
小插曲
- 默认的用户名和密码
- Maven配置
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.14.1</version> </dependency>