第五章、SpringBoot与消息通信(一)
第五章、SpringBoot与消息通信(一)
JMS API 是 Java 平台上用于消息中间件(MOM)的接口,旨在实现应用程序间或分布式系统中的消息传递。JMS 定义了消息传输的规范和标准,但不提供具体实现。Apache ActiveMQ 是 JMS 规范中最流行的实现之一。
目标
-
JMS 和 ActiveMQ 概述
-
Spring Boot 程序中集成 ActiveMQ
JMS 和 ActiveMQ 概述
消息传递是一个或多个实体之间进行通信的一种方式,它无处不在。总会有一个发送者和一个或多个接收者。消息传递可以是同步和异步,发布/订阅,RPC,基于企业的消息传递,ESB(企业服务总线),MOM(面向消息的中间件)等等。
JMS 概述
JMS 表示 Java 消息服务(Java Message Service),是 Java EE 的标准/规范之一。这种规范指出:消息的发送应该是异步的、非阻塞的。也就是说消息的发送者发送完消息后就直接返回了,不需要等待接收者返回后才能返回,发送者和接收者可以说是互不影响。所以,这种规范(标准)能够减轻或消除系统瓶颈,实现系统之间松散耦合,提高系统的整体可伸缩性和灵活性。
JMS API 是由 Sun 公司和其合作伙伴开发的一套企业级消息传送 API。它是一个 Java 平台中关于面向消息中间件(MOM)的 API,用于在两个应用程序之间,或分布式系统中发送消息,进行消息通信。JMS API 是一个与具体平台无关的 API,绝大多数 MOM 提供商都对 JMS 提供支持。它只是Java EE 中定义的一组标准 API,它自身并不是一个消息服务系统,它是消息传送服务的一个抽象,也就是说它定义了消息传送的接口而并没有具体实现。它定义了一套接口和语义,允许 Java 应用程序之间可以使用其他消息处理实现进行通讯。一个 JMS 实现称为一个 JMS 提供程序(JMSProvider)。
JMS API 不仅支持松散耦合的消息通信,而且还支持:
-
异步通信:JMS 提供程序可以在消息到达时将消息传递给客户端,客户端不必请求消息就可以接 收消息。
-
可靠通信:JMS API 可以确保消息传递一次且只传递一次。可靠性级别较低的应用程序可以承受丢失消息或接收重复消息的代价。
为了进一步了解和使用 JMS,我们需要先了解一些 JMS 的相关术语:
-
JMS 提供程序(JMS Provider) : 指实现了 JMS 规范的消息传递系统,也就是实现 JMS 规范的消息中间件。例如,ActiveMQ 就是一个 JMS 提供程序。
-
JMS 客户端:指发送和接收消息的 Java 应用程序。JMS 客户端可以同步或异步方式使用消息。
-
消息模型:JMS 的消息传递模型分为点对点(Point to Point,即 P2P)和发布/订阅(Pub/Sub)两种模型,对应的目的地分别是队列(Queue)和主题(Topic)
-
消息(Message):JMS 客户端之间用于通信的对象。消息是通信内容的载体,其结构主要分为消息头、属性和消息体,并且根据存储结构的不同分为好几种。
-
消息头:用于设置消息的通用属性,类似 http 消息头,可以设置消息的过期时间、是否持久化 和 投 递 的 目 的 地 (Queue 名 /Topic 名 ) 等 , 最 主 要 的 是 可 以 设 置 消 息 的 唯 一 标 识messageId,messageId 用于标识消息的唯一性(JMS 会默认生成,您也可以使用自己的 id 格式来生成唯一标识)。
-
消息体: 消息中实际存放数据的地方,有多种类型的消息,包括 text/map/bytes/Stream/Object 等。发送和接收消息需要使用同一类型。
-
消息属性:消息头的属性是固定的,如果需要除消息头外的额外信息,可以使用消息属性,此外,可以使用属性识别、去重或重点标注具有相同消息头和消息体的消息。
-
-
消息生产者:产生消息的一方,在 P2P 模型下,指消息发送者(Sender),在 P/S 模型下指消息发 布者(Publisher)。
-
消息使用者:接收消息的一方,对应于两种模型分别是消息接收者(Receiver)和消息订阅者(Subscriber) 。
JMS 消息传递模型
JMS 支持两种不同的消息传递模型
-
点对点模型(Point-to-Point 模型,P2P)
发布/订阅模型(Publish/Subscribe,Pub/Sub)
点对点模型(P2P)
在这种模型下,消息由一个生产者(Producer)传送到一个使用者(Consumer)。
在点对点模型中:
-
消息的生产者称为发送者(Sender)
-
消息的使用者称为接收者(Receiver)
-
消息传送的目的地为队列(Queue)
-
消息由发送者,也就是生产者,发送到队列目的地,然后传送给注册了队列的其中一个接收者,也就是使用者。
-
任意多的生产者可以发送消息到同一个队列,且每条消息确保被传送并由一个使用者使用。
-
如果没有任何注册使用者来使用消息,则队列保留消息直到有使用者注册和使用消息。
发布/订阅模型(Pub/Sub)
在这种模型下,消息从生产者(Producer)传送到任意数量的使用者(Consumer)。
在发布/订阅模型中:
-
消息的生产者称为发布者(Publisher)
-
消息的使用者称为订阅者(Subscriber)
-
消息传送的目的地为主题(Topic)。
-
消息由发布者,也就是生产者,发布到主题目的地,然后传送给所有已订阅该主题的活跃订阅者,也就是使用者。
-
任意数量的生产者可以将消息发布到主题目的地,并且每条消息都可以传送给任意数量的使用者。
-
如果没有已注册的订阅者,则主题目的地不保存消息,除非它对不活动的订阅者具有持久的订阅。持久订阅表示注册主题目的地的订阅者,可以在发布者将消息发布到主题时处于非活跃状态。持久订阅时,客户端向 JMS 服务器注册一个表示自己身份的 ID,当这个客户端处于离线状态时,JMS 提供程序为这个 ID 保存所有发布到主题的消息,当客户再次连接到 JMS 提供程序时,会根据自己的 ID 得到所有当自己处于离线时发布到主题的消息。
下一章:第五章、SpringBoot与消息通信(二)