ActiveMQ学习笔记-01——JMS
参考:【尚硅谷ActiveMQ教程(MQ消息中间件快速入门)
-
简介
- JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
- Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准信息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持JAVA应用程序开发。在JavaEE中,当两个应用程序使用JMS进行通信时,它们之间并不是直接相连的,而是通过一个共同的消息收发服务组件关联起来以达到接耦/异步削峰的效果。
-
图
-
JMS的组成结构和特点
- JMS provider
- 实现JMS接口和规范等消息中间件,也就是我们的MQ服务器
- JMS producer
- 消息生产者,创建和发送JMS消息等客户端应用
- JMS consumer
- 消息消费者,接受和处理JMS消息等客户端应用
- JMS message
- 消息头
- JMSDestination:消息发送的目的地,主要是指Queue和Topic。
- JMSDeliveryMode:持久和非持久模式。
- JMSExpriation:消息的过期时间,默认是永不过期。
- JMSPriorit:消息优先级,从0~9十个级别,0~4是普通消息,5~9是加急消息,默认是4级。
- JMSMessageID:唯一识别每个消息的标识,由MQ产生。
- 消息体
- TextMessage:普通字符串消息,包含一个string。
- MapMessage:一个Map类型的消息,key为string类型,而值value为Java的基本类型。
- BytesMessage:二进制数组消息,包含一个byte[]。
- StreamMessage:Java数据流消息,用标准流操作来顺序的填充和读取。
- ObjectMessage:对象消息,包含一个可序列化的Java对象。
- 消息属性
- 他们是以属性名和属性值对的形式制定的。
- 可以将属性视为消息头的扩展,属性制定一些消息头没有包括的附加信息,比如可以在属性里指定消息选择器。
- 消息的属性就像可以分配给一条消息的附加消息头一样。它们允许开发者添加有关消息的不透明附加信息。
- 它们还用于暴露消息选择器在消息过滤时使用的数据。
- 消息头
- JMS provider
-
JMS的可靠性
-
PERSISTENT:持久化
- 非持久化
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
- 当服务器宕机,消息不存在。
- 持久化(默认)
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
- 当服务器宕机,消息依然存在。
- 非持久化
-
Transaction:事务
-
producer提交时的事物
-
false
- 只要执行send,就进入到队列中。
- 关闭事务,那就第二个签收参数到设置需要有效。
-
true
-
先执行send再执行commit,消息才被真正的提交到队列中。
session.commit();
-
消息需要批量发送,需要缓冲区处理。
-
-
-
-
ACknowledge:签收
- 非事务
- 自动签收(默认):
Session.AUTO_ACKNOWLEDGE
- 手动签收:
Session.CLIENT_ACKNOWLEDGE
- 客户端调用acknowledge方法手动签收
- 允许重复消息:
Session.DUPS_OK_ACKNOWLEDGE
- 自动签收(默认):
- 事务
- 生产事务开启,只有commit后才能将全部消息变为已消费
- 签收与事务的关系
- 在事务性会话中,当一个事务被成功提交则消息会自动签收,如果事务回滚,则消息会被再次传送。
- 非事务性会话中,消息何时被确认取决于创建会话时的应答模式。
- 非事务
-
-
总结
- 点对点
- 点对点模型时基于队列的,生产者发消息到队列,消费者从队列接收消息,队列的存在使得消息的异步传输成为可能。
- 如果在session关闭时有部分消息已被收到但是没有被签收,那当消费者下次连接到相同队列时,这些消息还会被再次接收。
- 队列可以长久地保存消息直到消费者收到消息。消费者不需要因为担心消息会丢失而时刻和队列保持激活到连接状态,充分体现了异步传输模式的优势。
- 订阅
- 非持久订阅
- 只有当客户端处于激活状态,也就是和MQ保持连接状态才能收到发送到某个主题的消息。
- 如果消费者处于离线状态,生产者发送的主题消息将会丢失作废,消费者永远不会收到。
- 先要订阅注册才能收到发布,只给订阅者发布消息
- 持久订阅
- 客户端首先向MQ注册一个自己的身份ID识别号,当这个客户端处于离线时,生产者会为这个ID保存所有发送到主题的消息,当客户端再次连接到MQ时会根据消费者的ID得到所有当自己处于离线状态时发送到主题的消息。
- 总
- 非持久订阅状态下,不能恢复或从新派送一个未签收的消息。
- 持久订阅模式下,才能恢复或重新派送一个未签收的消息。
- 当所有消息必须被接受,则用持久订阅。当消息丢失可以被容忍,则用非持久订阅。
- 非持久订阅
- 点对点
-
几种MQ产品对比
特性 ActiceMQ RabbitMQ Kafka RocketMQ PRODUCER-COMSUMER 支持 支持 支持 支持 PUBLISH-SUBSCRIBE 支持 支持 支持 支持 REQUEST-REPLY 支持 支持 - 支持 API完备性 高 高 高 低(静态配置) 多语言支持 支持,JAVA优先 语言无关 支持,JAVA优先 支持 单机吞吐量 万级 万级 十万级 单机万级 消息延迟 - 微秒级 毫秒级 - 可用性 高(主从) 高(主从) 非常高(分布式) 高 消息丢失 - 低 理论上不会丢失 - 消息重复 - 可控性 理论上会有重复 - 文档的完备性 高 高 高 中 提供快速入门 有 有 有 无 首次部署难度 - 低 中 高