1,什么是JMS
JMS 在百度百科中的定义:
Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
JMS 和 ActiveMQ、RabbitMQ 等的关系,个人简单理解为:类似于 JPA 与 Hibernate、TopLink 等关系类似:
如 JPA 的解析:
JPA 是一套规范,不是一套产品。那么像Hibernate,TopLink,JDO他们是一套产品,如果说这些产品实现了这个JPA规范,那么我们就可以叫他们为 JPA 的实现产品。
对于 JMS 可以简单理解为:
JMS 是一个标准或者说是一个协议,通常用于企业级应用的消息传递。 主要有queue 消息(1对1),topic 消息(1 对多),Apache出品的 activeMQ 就是一个 JMS 的实现。
两个应用程序之间需要进行通信,我们使用一个 JMS 服务,进行中间的转发,通过 JMS 的使用,我们可以解除两个程序之间的耦合,分布式通信耦合更低,消息服务更加可靠 。[ 而JMS实现 ( ActiveMQ、RabbitMQ 等就是 JMS 的实现产品 ) ]
2,什么是面向消息中间件(MOM)
面向消息的中间件使用消息传送提供者来协调消息传送操作。MOM 系统的基本元素是客户端、消息和 MOM 提供者,后者包括 API 和管理工具。MOM 提供者使用不同的体系结构路由和传送消息:它可以使用集中式消息服务器,也可以将路由和传送功能分布在每个客户端上。某些 MOM 产品结合了这两个方法。
Oracle上详细介绍:https://docs.oracle.com/cd/E19148-01/820-0533/aeraq/index.html
全称:Message-Oriented Middleware 中文:面向消息的中间件。
MOM通信模型:
MOM模型中的四个基本元素:
- 消息传递提供者
- 目的地
- 客户端(发送方或接收方)
- 消息
发送方客户端将消息发送到消息提供者维护的目的地,这些消息一直被保留直到接收方客户端将消息取出。
消息中间件有很多的用途和优点:
- 将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块;
- 负责建立网络通信的通道,进行数据的可靠传送。
- 保证数据不重发,不丢失
- 能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务
- 优势:Asynchronous(异步),Reliable(可靠)
3,JMS的消息模型
JMS具有两种通信模式:
- 点对点队列模型:Point-to-Point(P2P)
- 发布订阅模型:Publish/Subscribe(Pub/Sub)
在JMS API出现之前,大部分产品使用“点对点”和“发布/订阅”中的任一方式来进行消息通讯。JMS定义了这两种消息发送模型的规范,它们相互独立。任何JMS的提供者可以实现其中的一种或两种模型,这是它们自己的选择。JMS规范提供了通用接口保证我们基于JMS API编写的程序适用于任何一种模型。
(一) 点对点队列模型:Point-to-Point(P2P)
模型组成对象:在点对点通信模式中,应用程序由消息队列(Queue),发送方(Sender),接收方(Receiver)组成。
涉及到的概念:每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。
特点:
- 每个消息只有一个消费者(Consumer),消息一旦被消费就会从队列中移除
- 发送者和接收者在时间上没有依赖性(异步),即发送者发送消息时接收者无需处于运行状态,同样接收者接收消息时发送者无需处于运行状态
- 接收者接收消息之后需向队列应答成功
(二)发布订阅模型:Publish/Subscribe(Pub/Sub)
模型组成对象:在发布订阅模式中,应用程序由主题(Topic),发布者(Publisher),订阅者(Subscriber)
涉及到的概念:在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端。该模式下,发布者与订阅者都是匿名的,即发布者与订阅者都不知道对方是谁。并且可以动态的发布与订阅Topic。Topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。
特点:
- 一个消息可以有多个订阅者
- 发布者与订阅者具有时间约束,针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。
- 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
4,JMS接收消息的方式
在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息。
同步:接收者或订阅者调用 receive() 方法来接收消息,消息到达(或超时)之前将一直阻塞。
异步:使用异步方式接收消息的话,消息订阅者需注册一个消息监听者,类似于事件监听器,只要消息到达,JMS服务提供者会自动通过调用监听器的 onMessage() 递送消息。
如使用异步方式:在SpringBoot中,将订阅者添加监听:
@Component
public class Consumer2 {
@JmsListener(destination = "mytest.queue")
public voidreceiveQueue(String message) {
System.out.println("消费者收到的消息是:" + message);
}
}
5, JMS编程模型
- 管理对象(Administered objects)-连接工厂(Connection Factories)和目的地(Destination)
- 连接对象(Connections)
- 会话(Sessions)
- 消息生产者(Message Producers)
- 消息消费者(Message Consumers)
- 消息监听者(Message Listeners)
此处就不详细介绍了,先大致了解即可,用到时再深入研究https://baike.so.com/doc/1005192-1062691.html
参考来源于:
https://baike.so.com/doc/1005192-1062691.html
https://docs.oracle.com/cd/E19148-01/820-0533/aeraq/index.html