MQ消息中间件之底层原理JMS(Java Message Service)规范详细整理

笔记大纲

  • JavaEE&&JMS

  • JMS规范落地产品

  • JMS组成结构

  • 消息结构

    • 消息头
    • 消息体
    • 消息属性
  • JMS的可靠性

    • 持久化
    • 事务
    • 签收(ACK)
  • JMS点对点模式总结

  • JMS的发布订阅模式总结


一、JavaEE&&JMS

  JavaEE是一套使用Java进行企业级应用开发的,大家一致遵循的13个核心规范工业标准。 JavaEE平台提供了一个基于组件的方法来加快设计、开发、装配及部署企业应用程序。

序号 标准(规范) 说明
1 JDBC(Java Database) 数据库连接
2 JNDI(Java Naming and Directory Interfaces) Java 的命名和目录接口
3 EJB(Enterprise JavaBean)Spring已取代 企业JavaBean
4 RMI(Remote Method Invoke) 远程方法调用
5 Java IDL(Interface Description Language)/CORBA(Common Object Broker Architecture) 接口定义语言/公用对象请求代理程序体系结构
6 JSP(Java Server Pages) Java服务网页
7 Servlet Java服务小程序
8 XML(Extensible Markup Language) 可扩展标记语言
9 JMS(Java Message Service) Java消息服务
10 JTA(Java Transaction API) Java 事务 API
11 JTS(Java Transaction Service) Java 事务服务
12 JavaMail Java邮件
13 JAF(JavaBean Activation Framework) JavaBean活动框架

  Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,支持JAVA应用程序开发。

  在JavaEE中,当两个应用程序使用JMS进行通信时,它们之间并不是直接相连的,而是通过一个共同的消息收发服务组件关联起来以达到解耦、异步、削峰的效果。

二、JMS规范落地产品

  ActiveMQ(Apache-底层JAVA)RabbitMQ(底层erlang)Kafka(大数据)、RocketMQ(阿里开源)

三、JMS组成结构

  • JMS provider:实现JMS接口和规范的消息中间件,就是MQ服务器;
  • JMS producer:消息生产者,创建和发送JMS消息的客户端应用;
  • JMS consumer:消息消费者,接收和处理JMS消息的客户端应用;
  • JMS message:消息。
    • 消息头
    • 消息体
    • 消息属性

四、消息结构

(1)消息头
参数 描述
JMSDestination 消息发送目的地,queuetopic
JMSDeliveryMode 传送模式(持久模式/非持久模式)
JMSExpiration 消息过期时间,默认是永不过期
JMSPriority 消息优先级,0-9十个级别,0到4是普通消息,5到9是加急消息。默认是4级!
JMSMessageID 唯一识别每个消息的标识由MQ产生。
(2)消息体

  封装具体的消息数据,发送和接受的消息体类型必须一致对应!包含5种消息体格式:

格式 描述
TextMessage(纯文本) 普通字符串消息,包含一个tring
MapMessage(键值对) Map类型消息,keystring类型,valuejava的基本数据类型
BytesMessage 二进制数据消息,包含一个byte[]
StreamMessage Java数据流消息,用标准流操作来顺序的填充和读取。
ObjectMessage 对象消息,包含一个可序列化的Java对象
(3)消息属性

  如需要除消息头字段以外的值,那么可使用消息属性,识别、去重、重点标注等操作非常有用的方法

五、JMS的可靠性

  • persistent(持久化)
  • transaction(事务)
  • acknowledge(签收)
(1)持久化
参数设置 特点
非持久 当服务器宕机,消息不存在
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
持久 持久化:当服务器宕机,消息依然存在。
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);

  注意:Queue(队列)默认是持久化,Topic(主题)默认是非持久化!

  如果主题模式想持久化,发布者需要设置持久化模式,再开启模式,订阅者需要设置订阅者id。

 【先订阅再执行发布】
-- 发布者
//5.1 实现持久化订阅,发送消息者设置DeliveryMode.PERSISTENT模式且在连接之前设定
    messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
//5.2 一定要在设置完成持久化后再start连接
    connection.start();
-- 订阅者
//2.1获得连接并启动
 Connection connection = activeMQConnectionFactory.createConnection();
//2.1 需要在连接上设置消费者id,用来识别消费者
 connection.setClientID("id191106");
(2)事务

生产者更注重事务、消费者注重签收!

//创建会话,第一个参数是否以事务的方式提交,第二个参数默认的签收方式

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

属性 描述
false 关闭事务,那第2个签收参数的设置需要有效,直接提交队列中!
true 先执行send再执行commit(成对出现),消息才被真正的提交到队列中,无论生产者还是消费者都要commit!
(3)签收(ACK)

非事务(false)

签收方式 特点
atuo_acknowledge自动签收 Session.AUTO_ACKNOWLEDGE
client_ acknowledge手动签收 Session.CLIENT_ACKNOWLEDGE客户端调用acknowledge方法手动签收message.acknowledge(),不然消费信息不会有变化。
dusk_ok_acknowledge允许重复签收,很少用 Session.DUPS_OK_ACKNOWLEDGE
session_acknowledge缓存签收

事务(true)

签收方式 特点
atuo_acknowledge自动签收 默认自动签收
client_ acknowledge手动签收 默认自动签收
dusk_ok_acknowledge允许重复签收,很少用
session_acknowledge缓存签收

签收&事务的联系

  非事务性(false)会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode),在事务性(true)会话中,当一个事务被成功提交则消息被自动签收。如果事务回滚,则消息会被再次传送。

六、JMS点对点模式总结

(1)Session关闭时部分消息已被收到但没有被签收(acknowledged),当消费下次连接到相同的队列时,这些消息还是会别接收。

(2)队列可长久地保存消息直到消费者收到消息。消费者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态,充分体现了异步传输模式的优势

七、JMS的发布订阅模式总结

当所有消息必须被接收,则用持久订阅。当丢失消息能够被容忍,则用非持久订阅!

(1)非持久订阅<默认>

  非持久订阅只有当客户端处于激活状态,也就是和MQ保持连接状态才能收到发送到某个主题的消息。如果消费者处于离线状态,生产者发送的主题消息将会丢失作废,消费者永远不会收到。

(2)持久订阅

  客户端首先向MQ注册一个自己的身份ID识别号,当这个客户端处于离线时,生产者会为这个ID保存所有发送到主题的消息,当客户再次连接到MQ时会根据消费者的ID得到所有当自己处于离线时发送到主题的消息。


 ☝上述分享来源个人总结,如果分享对您有帮忙,希望您积极转载;如果您有不同的见解,希望您积极留言,让我们一起探讨,您的鼓励将是我前进道路上一份助力,非常感谢!我会不定时更新相关技术动态,同时我也会不断完善自己,提升技术,希望与君同成长同进步!

☞本人博客:https://coding0110lin.blog.csdn.net/  欢迎转载,一起技术交流吧!

你可能感兴趣的:(ActiveMQ)