JMS学习(一)基本概念

时间:2023-02-27 08:10:18

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

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. U-boot与linux的关系

    基本上没有啥关系,U-boot的话你也知道,说白了就像是Dos工具箱,本身算是个精简的Linux系统了,主要是负责硬件的初始化和引导,本身带有一些工具,作为引导程序,常作为嵌入式设备的引导.当真正的系 ...

  2. setcookie 之 我见

    $default_currency=get_default_currency(); $_COOKIE['currency'] = $default_currency['currency']; $_CO ...

  3. MySQL抓包工具:MySQL Sniffer【转】

    本文来自:https://github.com/Qihoo360/mysql-sniffer 简介 MySQL Sniffer 是一个基于 MySQL 协议的抓包工具,实时抓取 MySQLServer ...

  4. 解决MySQL8.0报错:Unknown system variable 'validate_password_policy'

    一.问题描述 1.在安装MySQL8.0时,修改临时密码,因密码过于简单(如:123456),不符合MySQL密码规范,会触发一个报错信息: ERROR 1819 (HY000): Your pass ...

  5. Linux中搭建一个ftp服务器详解

    来源:Linux社区  作者:luzhi1024 详解Linux中搭建一个ftp服务器. ftp工作是会启动两个通道:控制通道 , 数据通道在ftp协议中,控制连接均是由客户端发起的,而数据连接有两种 ...

  6. 办法总比困难多--JMeter压测小记

    标签: JMeter, 代理接口 前段时间溢+支付接口慢,有商户直接反映掉单严重.这时,我接到了压测溢+支付接口的任务.JMeter我并不熟悉,公司也没有搞自动化测试的QA,一开始team里的一个同学 ...

  7. EF CodeFirst学习笔记003--如何创建表

    参考: http://www.cnblogs.com/Wayou/archive/2012/09/20/EF_CodeFirst.html webconfig中修改: <connectionSt ...

  8. 【Java入门提高篇】Day4 Java中的回调

    又忙了一周,事情差不多解决了,终于有可以继续写我的博客了(各位看官久等了). 这次我们来谈一谈Java里的一个很有意思的东西——回调. 什么叫回调,一本正经的来讲,在计算机程序设计中,回调函数是指通过 ...

  9. MEMCACHE分布式算法(PHP)

    //测试分布式算法 $ports = array('端口1', '端口2', '端口3', '端口4', '端口5'); //Memcache端口 $users = array('1000', '10 ...

  10. 060——VUE中vue-router之路由嵌套在文章系统中的使用方法:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...