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 还提供了对象浏览器,允许应用程序在队列中浏览消息。