JMS学习(一)基本概念
这两天面试了一两个公司,由于简历中的最近一个项目用到了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学习(一)基本概念的更多相关文章
- ActiveMQ基本详解与总结& 消息队列-推/拉模式学习 & ActiveMQ及JMS学习
转自:https://www.cnblogs.com/Survivalist/p/8094069.html ActiveMQ基本详解与总结 基本使用可以参考https://www.cnblogs.co ...
- Oracle RAC学习笔记:基本概念及入门
Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章] oracle 10g real applica ...
- Java IO学习笔记:概念与原理
Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了 ...
- Prolog学习:基本概念 and Asp.net与Dojo交互:仪器仪表实现
Asp.net与Dojo交互:仪器仪表实现 项目中需要用到仪器仪表的界面来显示实时的采集信息值,于是便遍地寻找,参考了fusionchart和anychart之后,发现都是收费的,破解的又没有这些功能 ...
- Python学习:基本概念
Python学习:基本概念 一,python的特点: 1,python应用场景多;爬虫,网站,数据挖掘,可视化演示. 2,python运行速度慢,但如果CPU够强,这差距并不明显. 3,严格的缩进式编 ...
- Docker学习之基本概念
Docker学习之基本概念 作为一个后端noder,不了解docker有点说不过去,这节开始,学习一些docker层面的东西. 什么是docker Docker最初是dotCloud公司创始人Solo ...
- Hadoop YARN学习之核心概念(2)
Hadoop YARN学习之核心概念(2) 1. Hadoop 2.X YARN引入的新服务 1.1 新的ResourceManager纯碎作为资源调度器,是集群资源的唯一仲裁者: 1.2 用户应用程 ...
- jQuery学习笔记之概念(1)
jQuery学习笔记之概念(1) ----------------------学习目录-------------------- 1.概念 2.特点 3.选择器 4.DOM操作 5.事件 6.jQuer ...
- JMS学习篇《一》ActiveMQ消息中间件的简单介绍与用法-概念篇
原创说明:本篇博文为本人原创作品,转载请注明出处 1.何为消息中间件 消息中间件是一种在分布式应用中互相交换信息的一种技术,常见的成熟消息中间件有:RabbitMQ.SonicMQ,activeMQ. ...
随机推荐
- SQL语句 - 嵌套查询
嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询.内层查询也称子查询,从查询. ...
- Devexpress HtmlEditor 上传本地图片
官方Demo地址:https://demos.devexpress.com/MVCxHTMLEditorDemos/Features/Features 控件的一定要包裹在form中 @using(Ht ...
- easyui plugin——etreegrid:CRUD Treegrid
昨天写了一个ko+easyui的同样的实现,感觉写的太乱,用起来十分麻烦,于是今天照着edatagrid,写了一个etreegrid,这样再用ko绑定就方便多了. 使用很简单,$(tableId).e ...
- Qt编写自定义控件大全
最新版可执行文件 http://pan.baidu.com/s/1i491FQP 不定期增加控件及修正BUG和改进算法. 总图: 1:动画按钮 * 1:可设置显示的图像和底部的文字 * 2:可设置普通 ...
- php XML 读写 创建
一 .XML 读 1.1. 首先同目录定义好一个XML文件 : book.xml <?xml version="1.0" encoding="utf-8" ...
- 【Android学习】XML文本的三种解析方式(通过搭建本地的Web项目提供XML文件)
XML为一种可扩展的标记语言,是一种简单的数据存储语言,使用一系列简单的标记来描述. 一.SAX解析 即Simple API for XML,以事件的形式通知程序,对Xml进行解析. 1.首先在Web ...
- easyui datagrid to excel
$.extend($.fn.datagrid.methods, { toExcel: function(jq, filename){ return jq.each(function(){ var ur ...
- [ML] Naive Bayes for email classification
20 Newsgroups (Original) Author: Jeffrey H 1. Introduction This is only a test report for naive baye ...
- Unity 3D 中自动寻路 和 跟随转向 探析
这里主要讲三个函数 , 一个自动跟随函数 和 两个指向旋转函数 , 这三个函数在游戏角色创建过程中会经常用到: 这个是跟随函数 和 欧拉角旋转函数 public class GensuiZhixian ...
- intellij 调试方法
intellij 调试方法 转自 http://www.th7.cn/Program/net/201410/296492.shtml