1 ActiveMQ
1.1 JMS开发的基本步骤
- 创建一个connection factory
- 通过connection factory来创建JMS connection
- 启动JMS connection
- 通过connection创建JMS session
- 创建JMS destination
- 创建JMS producer或者创建JMS message并设置destination
- 创建JMS consumer或者是注册一个JMS message listener
- 发送或者接受JMS message(s)
- 关闭所有的JMS资源(connection,session,producer,consumer等)
1.2 两种消费方式
1.2.1 同步阻塞方式(receive())
订阅者或接收者调用MessageConsumer的receive()方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞
1.2.2 异步非阻塞方式(监听器onMessage())
订阅者或接收者通过MessageConsumer的setMessageListener(MessageListener listener)注册一个消息监听器,当消息到达之后,系统自动调用监听器MessageListener的onMessage(Message message)方法
1.3 Topic
发布/订阅消息传递域的特点如下:
- 生产者将消息发布到topic中,每个消息可以有多个消费者,属于1:N的关系
- 生产者和消费者之间有时间上的相关性。订阅某一个主题的消费者只能消费自它订阅之后发布的消息
- 生产者生产时,topic不保存消息它是无状态的不落地,假如无人订阅就去生产,那就是一条废消息,所以,一般先启动消费者再启动生产者。
JMS规范允许客户创建持久订阅,这在一定程度上放松了时间上的相关性要求。持久性订阅允许消费者消费它在未处于激活状态时发送的消息。一句话,好比我们的微信公众号订阅。
topic与queue两大模式比较:
1.4 JMS组成的四大元素
JMS provider
实现JMS接口和规范的消息中间件,也就是我们MQ服务器
JMS producer
消息生产者,创建和发送JMS消息的客户端应用
JMS consumer
消息消费者,接收和处理JMS消息的客户端应用
JMS message
消息头 消息属性 消息体
1.5 java消息可靠性
1.5.1 持久性
参数设置说明
非持久
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
非持久化:当服务器宕机,消息不存在
持久
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
持久化:当服务器宕机,消息依然存在
默认它是持久
持久的Queue
持久化消息,这是队列的默认传送模式,此模式只能保证这些消息只被传送一次和成功使用一次。可靠性是优先考虑的因素。可靠性的另一个重要方面是确保持久性消息传送至目标后,消息服务在向消费者传送它们之前不会丢失这些消息。
持久化的Topic
- 一定要先运行一次消费者,等于向MQ注册,类似我订阅了这个主题
- 然后再运行生产者发送消息,此时
- 无论消费者是否在线,都会接收到,不在线的话,下次连接的时候,会把没有收过的消息都接收下来。
1.5.2 Transaction 事务
producer提交时的事务
false
只要执行send,就进入到队列中
true
先执行send再执行commit,消息才被真正提交到队列中
事务偏生产者/签收偏消费者
1.5.3 Acknowledge:签收
非事务
自动签收(默认)——Session.AUTO_ACKNOWLEDGE
手动签收——Session.CLIENT_ACKNOWLEDGE
客户端调用acknowledge方法手动签收——message.acknowledge();
允许重复消息——Session.DUPS_OK_ACKNOWLEDGE
事务
生产事务开启,只有commit后才能将全部消息变为已消费
消息生产者
消息消费者
签收和事务的关系
在事务性会话中,当一个事务被成功提交则消息被自动签收。如果事务回滚,则消息会被再次传送。
非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)
1.6 JMS点对点总结
1.7 JMS发布订阅总结
1.8 非持久订阅
1.9 持久订阅
1.10 什么是java消息服务
Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持java应用程序开发。在javaEE中,当两个应用程序使用JMS进行通信时,它们之间并不是直接相连的,而是通过一个共同的消息收发服务组件关联起来以达到解耦/异步削峰的效果。
2 RocketMQ
RocketMQ是阿里开源的分布式消息中间件,跟其它中间件相比,RocketMQ的特点是纯JAVA实现;集群和HA实现相对简单;在发生宕机和其它故障时消息丢失率更低。
2.1 消息队列的详细比较