这两天面试了一两个公司,由于简历中的最近一个项目用到了JMS,然而面试官似乎对这个很感兴趣,所以都被问到了,但可惜的是,我除了说我们使用了JMS外,面对他们提出的一些关于JMS的问题,我回答得相当差,直接结果就是面试失败。同时我也深深的觉得自己对于技术的掌握是多么的浮浅,本着从哪里跌倒就从哪里爬起来的心态,决定首先好好研究一下JMS。不仅是为面试,也是为了尽可能深入的掌握这个框架。
本文主要介绍一些基本的概念。
- 一、JMS介绍
JMS是Java Message Service 的简称,即Java消息服务。什么是消息服务呢,我们来看一下Oracle官方的定义:
The Java Message Service (JMS) API is a messaging standard that allows application components based on the Java Platform Enterprise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.
翻译过来就是说,JMS是一个消息标准,这种标准允许基于JavaEE的应用组件可以创建,发送,接受及读取消息。通过JMS可以实现松耦合,可依赖及异步的分布式通信。那么在这一段话中我们应该注意两点,即首先这是一个标准,类似于Servlet标准,并不是一个具体的实现。其次,这是一种分布式的通信机制,并且是异步的。
- 二、版本
以前没有注意过这个问题,但是没想到在面试时居然被问题到了,问我们JMS协议使用的是哪个版本,回来查来下,JMS历史上原来有两个比较重要的版本。一个是JMS1.1,另一个就是JMS2.0。那么这两个版本之间有什么区别呢?从网上找了一下答案,整理如下 :
1. 简化的API: JMS2.0 提供了一些简化的API,可以简化代码编写,以便于我们更方便的创建生产者消费者等内容。具体来说就是使用了JDK1.7的新语法
2. 简化配置:配置变得更方便
3. 支持多个消费者共享Topic:,这一点很重要,因为我的项目中使用的是Topic,面试官问到说如何让多个Node不重复的消费同一个Topic的消息,其实,通过Topic共享就可以做到,这就是JMS2.0提供的特性,当然,1.1的话,通过selector好像是也可以做到。
4. JMSXDeliveryCount值必须设置:这个值代表重试次数,正常来说是1,如果值大于1,则表示重发了多次。
那么,目前我们常用的MQ都支持哪个版本呢?以ActiveMQ为例来说,其官方文档的说明如下:
Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols, comes with easy to use Enterprise Integration Patterns and many advanced features while fully supporting JMS 1.1 and J2EE 1.4. Apache ActiveMQ is released under the Apache2.0 License
看来ActiveMQ还不支持JMS2.0,所以,我们目前使用的JMS的版本仍然还是1.1。那么接下来的系列中,我们还是会以JMS1.1为主来介绍JMS的概念及使用。
- 三、术语介绍
在提到JMS时,我们通常会说到一些术语,解释如下:
1. 消息中间件(JMS Provider) : 指提供了对JMS协议的第三方组件,比如ActiveMQ就是一个消息中间件,另外比较知名的还有KFA, Rabbit MQ等。
2. 消息模式:分为点对点(Point to Point,即P2P)和发布/订阅(Pub/Sub),对应的数据结构分别是队列(Queue)和主题(Topic)
3. 消息(Message): 通信内容的载体,其结构主要分为消息头,属性和消息体,并且根据存储结构的不同分为好几种,后面会详细提到。
4. 消息生产者:产生消息的一方,在P2P模式下,指消息发送者(Sender),在P/S模式下指消息发布者(Publisher)
5. 消息消费者:接收消息的一方,对应于两种模式分别是消息接收者(Receiver)和消息订阅者(Subscriber)
在JMS的标准协议里,有几个重要的接口,先简单罗列如下:
1. ConnectionFactory :创建Connection的工厂,通过这个对象来创建一个到某个消息服务的连接。
2. Connection: 一个具体的连接,由ConnectionFactory创建
3. Session: 由Connection创建的用于操作消息的接口,本接口可以直接用来创建消息的生产者对象
4. Destination:消息存储的位置,发送者把消息发送到指定位置,消费者从指定位置取消息,那么这个指定位置可能是一个topic也可能是一个queue,由这个来表示。
5. MessageProducer: 消息的生产者,包括QueueSender和TopicPublisher
6. MessageConsumer: 消息的消费者, 包括QueueReceiver和TopicSubscriber
7. MessageListener: 消息监听器,这个是提供给消费者监听消息使用的,在添加了某个监听器之后,一旦消费到达,则会调用其onMessage方法。
官方文档中给出过一个如下的关系图,很好的描述了这几个接口之间的关系:
- 四、总结
本文简单的介绍了一下JMS的一些概念,对JMS有了一个初步的了解,后续文章会对本文介绍的一些术语和概念进行分部分详细的介绍。