这两天面试了一两个公司,由于简历中的最近一个项目用到了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有了一个初步的了解,后续文章会对本文介绍的一些术语和概念进行分部分详细的介绍。

JMS学习(一)基本概念的更多相关文章

  1. ActiveMQ基本详解与总结& 消息队列-推/拉模式学习 & ActiveMQ及JMS学习

    转自:https://www.cnblogs.com/Survivalist/p/8094069.html ActiveMQ基本详解与总结 基本使用可以参考https://www.cnblogs.co ...

  2. Oracle RAC学习笔记:基本概念及入门

    Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章]    oracle 10g real applica ...

  3. Java IO学习笔记:概念与原理

    Java IO学习笔记:概念与原理   一.概念   Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...

  4. Prolog学习:基本概念 and Asp.net与Dojo交互:仪器仪表实现

    Asp.net与Dojo交互:仪器仪表实现 项目中需要用到仪器仪表的界面来显示实时的采集信息值,于是便遍地寻找,参考了fusionchart和anychart之后,发现都是收费的,破解的又没有这些功能 ...

  5. Python学习:基本概念

    Python学习:基本概念 一,python的特点: 1,python应用场景多;爬虫,网站,数据挖掘,可视化演示. 2,python运行速度慢,但如果CPU够强,这差距并不明显. 3,严格的缩进式编 ...

  6. Docker学习之基本概念

    Docker学习之基本概念 作为一个后端noder,不了解docker有点说不过去,这节开始,学习一些docker层面的东西. 什么是docker Docker最初是dotCloud公司创始人Solo ...

  7. Hadoop YARN学习之核心概念(2)

    Hadoop YARN学习之核心概念(2) 1. Hadoop 2.X YARN引入的新服务 1.1 新的ResourceManager纯碎作为资源调度器,是集群资源的唯一仲裁者: 1.2 用户应用程 ...

  8. jQuery学习笔记之概念(1)

    jQuery学习笔记之概念(1) ----------------------学习目录-------------------- 1.概念 2.特点 3.选择器 4.DOM操作 5.事件 6.jQuer ...

  9. JMS学习篇《一》ActiveMQ消息中间件的简单介绍与用法-概念篇

    原创说明:本篇博文为本人原创作品,转载请注明出处 1.何为消息中间件 消息中间件是一种在分布式应用中互相交换信息的一种技术,常见的成熟消息中间件有:RabbitMQ.SonicMQ,activeMQ. ...

随机推荐

  1. 【Math】余弦相似度 和 Pearson相关系数

    http://cucmakeit.github.io/2014/11/13/%E4%BF%AE%E6%AD%A3%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A ...

  2. 【openwrt】再设置

    https://wiki.openwrt.org/zh-cn/doc/uci/network https://wiki.openwrt.org/zh-cn/doc/uci/wireless https ...

  3. 配置ini指定eclipse启动JDK版

    eclipse mars1 需要JDK 1.7+ 解决方案: 改eclipse.ini配置文件 -startupplugins/org.eclipse.equinox.launcher_1.3.100 ...

  4. windows 获取以及更改CMD控制台编码[转]

    本文转自 http://blog.sina.com.cn/s/blog_794b1d96010136yy.html 命令 chcp 功能:显示或设置活动代码页编号   CHCP [nnn]   nnn ...

  5. Android JNI 之 JNIEnv 解析

    jni.h文件 : 了解 JNI 需要配合 jni.h 文件, jni.h 是 Google NDK 中的一个文件, 位置是 $/android-ndk-r9d/platforms/android-1 ...

  6. Android permission 访问权限大全

    程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES ...

  7. centos6.5 尝试下用 yum 安装 oddo

    我们要安装PostgreSQL,因为OpenERP使用PostgreSQL作为它的数据库.要安装它,我们需要运行下面的命令. yum install postgresql postgresql-ser ...

  8. VC++之自定义消息

    用户可以自定义消息,在应用程序中主动发出,这种消息一般用于应用程序的某一部分内部处理. 实例说明: 当用户按键盘上的光标上移键时,程序发送用户自定义消息,在对应的消息响应函数中弹出消息对话框,显示消息 ...

  9. slf4j日志系统

    slf4j:由外观模式实现,不是日志的解决方案,只是服务于各种各样的日志系统.可以让在应用部署的时候,选择合适的日志系统 slf4j + log4j : 配置日志文件:log4j.properties ...

  10. VisualSFM for Structure from Motion

    VisualSFM是Changchang Wu编写的使用 Structure from Motion (SfM)进行3D重建的交互界面,具体内容详见http://homes.cs.washington ...