JMS到底是个什么东西?
1.1、JMS基本概念
JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。
所以说JMS其实就是一个`Java`业界的`标准规范`而已,提供了一些编程接口给第三方去实现。包括消息产生、发送、读取、接收等。
像`ActiveMQ`、`RocketMQ`之类的框架都是针对这个标准去实现的。
1.2、JMS API体系结构
JMS应用程序由以下部分组成:
JMS provider(提供者):一个JMS provider是一个实现JMS接口并提供管理和控制功能的消息系统。(说那么多,我认为那些框架如RocketMQ,ActiveMQ就是JMS provider(提供者))JMS clients(JMS客户端):是使用java语言编写的并能产生和消费消息的软件组件或应用程序(说那么多,我认为就是我们开发的应用程序)消息(Messages):在所有JMS客户端传递的Java对象。(很好理解,可以理解为生活中我们说的话)管理对象(Administered objects):用于配置JMS客户端的JMS对象。JMS中支持两种基本的Administered objects,分别是Destination和ConnectionFactory,至于这两种是什么东西,请查阅这里。
下图指出各个组件的交互方式:
Administrative tools或注解允许你在JNDI命名空间中绑定Destination和ConnectionFactory,一个JMS客户端可以通过资源注入的方式在命名空间中访问上面的管理对象并通过JMS提供者在JNDI相同对象上建立一个逻辑链接。
1.3、消息传递模型
在JMS API存在之前,业界很多消息传递产品都支持两种基本的模型,分别是point-to-point(点到点),publish/subscribe(发布/订阅)。JMS规范为每种模型制定了相关标准。JMS提供者必须实现这两种模型,并且JMS API提供每个模型的相关接口。
下面介绍这两种消息传递模型:
1.3.1、点对点消息传递
point-to-point (PTP)模型是建立在消息队列、消息发送者、消息接收者这些基本概念之上的。每条消息都被发送到特定的消息队列中,接收者客户端从建立的消息队列中获取并持久化消息。消息队列会保留发送给它们的所有消息,直到消息被消费掉或过期。
点对点模型图如下所示:
点对点模型具有以下特点:
- 每条消息只有一个消费者
- 当消息发送者发送消息时,不用关心接收者是否在线,消息都可以被接收者接收到
当发送的每条消息都必须由一位消费者成功处理时,请使用PTP消息传递。(典型的聊天应用)
1.3.1、发布/订阅消息传递
在发布/订阅(pub/sub)产品或应用程序中,客户端将消息发送给Topic(主题),这有点像一个公示栏。发布者和订阅者可以动态发布或订阅该Topic(主题)。系统负责将从Topic(主题)的多个发布者将消息分发给Topic(主题)的多个订阅者(有点绕口,就是多-多关系)。只要将消息分发给订阅者,主题就会保留消息。
在发布/订阅(pub/sub)模型中,区别consumer(消费者,即topic的订阅者)和被创建出来的subscription(订阅)是很重要的。consumer是JMS 客户端中的一个JMS object,而subscription(订阅)是JMS provider中的一个实体。通常,一个Topic(主题)拥有很多个consumer,而一个subscription(订阅)只有一个consumer。(也就是你一订阅一个主题,provider就会产生一个subscription,因为你是一个consumer),但你也可以创建共享的订阅subscription。
点对点模型图如下所示:
发布/订阅模型具有以下特点:
- 每条消息可以有多个消费者
- 发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息。
- 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
1.3.2、消息的消费方式
消息产品本质上是异步的:消息的生产和消费之间没有基本的时间依赖性。但是,JMS规范更精确地使用了这个术语,消息可以通过两种方式消费:
- 同步:消费者通过调用
receive方法显式地从Destination中获取消息。该receive方法在消息到达之前会一直阻塞,或者如果消息没有在指定的时间限制内到达,则可以超时。 - 异步:使用异步方式接收消息的话,消息订阅者需注册一个消息监听者,类似于事件监听器,只要消息到达,JMS服务提供者会通过调用监听器的
onMessage()递送消息
1.4、JMS 编程模型
JMS应用基本构件块如下:
管理对象(Administered objects): connection factories and destinations- Connections
- Sessions
- JMSContext(上下文) -- 它将
Connections和Sessions绑定在一起 - Message producers
- Message consumers
- Messages
关于它们之间的协作关系,可以查看下图:
JMS 还提供了对象浏览器,允许应用程序在队列中浏览消息。