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通信模型:

java mail 需要关闭sesssion吗_JMS

MOM模型中的四个基本元素:

  • 消息传递提供者
  • 目的地
  • 客户端(发送方或接收方)
  • 消息

发送方客户端将消息发送到消息提供者维护的目的地,这些消息一直被保留直到接收方客户端将消息取出。
消息中间件有很多的用途和优点:

  1. 将数据从一个应用程序传送到另一个应用程序,或者从软件的一个模块传送到另外一个模块;
  2. 负责建立网络通信的通道,进行数据的可靠传送。
  3. 保证数据不重发,不丢失
  4. 能够实现跨平台操作,能够为不同操作系统上的软件集成技工数据传送服务
  5. 优势:Asynchronous(异步),Reliable(可靠)

 

3,JMS的消息模型

JMS具有两种通信模式:

  1. 点对点队列模型:Point-to-Point(P2P)
  2. 发布订阅模型:Publish/Subscribe(Pub/Sub)

在JMS API出现之前,大部分产品使用“点对点”和“发布/订阅”中的任一方式来进行消息通讯。JMS定义了这两种消息发送模型的规范,它们相互独立。任何JMS的提供者可以实现其中的一种或两种模型,这是它们自己的选择。JMS规范提供了通用接口保证我们基于JMS API编写的程序适用于任何一种模型。


(一) 点对点队列模型:Point-to-Point(P2P)

java mail 需要关闭sesssion吗_客户端_02

模型组成对象:在点对点通信模式中,应用程序由消息队列(Queue),发送方(Sender),接收方(Receiver)组成。

涉及到的概念:每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。

特点:

  • 每个消息只有一个消费者(Consumer),消息一旦被消费就会从队列中移除
  • 发送者和接收者在时间上没有依赖性(异步),即发送者发送消息时接收者无需处于运行状态,同样接收者接收消息时发送者无需处于运行状态
  • 接收者接收消息之后需向队列应答成功

(二)发布订阅模型:Publish/Subscribe(Pub/Sub)

java mail 需要关闭sesssion吗_JMS_03

模型组成对象:在发布订阅模式中,应用程序由主题(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编程模型

  1. 管理对象(Administered objects)-连接工厂(Connection Factories)和目的地(Destination)
  2. 连接对象(Connections)
  3. 会话(Sessions)
  4. 消息生产者(Message Producers)
  5. 消息消费者(Message Consumers)
  6. 消息监听者(Message Listeners)

java mail 需要关闭sesssion吗_应用程序_04

此处就不详细介绍了,先大致了解即可,用到时再深入研究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