一、前言

从本文起依次详细介绍JMS中的一些重要的概念,主要参考了官方的JMS1.1的文档,该文档很老了,是02年的,那年,JAVA还没有被Oracle收购。。本文主要介绍Message及其相关概念,由于官方文档讲解得很详细,所以这个也基本上就是照搬了,只是由于时间关系,不能完全翻译了,所以本文只说重点。

二、Message的组成

  上一次面试的时候,面试官问过我这个问题,但当时完全是一头雾水,用过ActiveMQ好几次了,但每次都是下个软件,起个服务,然后就在网上找一段模板代码配置好,能收到消息就OK,从来没有去关注过。现在想来,自己之所以技术一直没有得到提高,和自己学技术的方式是有关系的,知其然,而不知其所以然。

进入正题,Message主要由三部分组成,分别是Header,Properties和Body, 解释如下:

Header: 消息头,所有类型的这部分格式都是一样的

  Properties: 属性,按类型可以分为应用设置的属性,标准属性和消息中间件定义的属性

  Body: 消息正文,指我们具体需要消息传输的内容。

  为了便于说明,下面用一个表格来描述Header中的各个属性

序号 属性名称 说明 设置者

1

JMSDestination

消息发送的目的地,是一个Topic或Queue  send

2

JMSDeliveryMode

消息的发送模式,分为NON_PERSISTENT和PERSISTENT,即持久化的和非持久化的  send

3

JMSMessageID

消息ID,需要以ID:开头     send

4

JMSTimestamp

 消息发送时的时间,也可以理解为调用send()方法时的时间,而不是该消息发送完成的时间  send

5

JMSCorrelationID

 关联的消息ID,这个通常用在需要回传消息的时候      client

6

JMSReplyTo

 消息回复的目的地,其值为一个Topic或Queue, 这个由发送者设置,但是接收者可以决定是否响应  client

7

JMSRedelivered

消息是否重复发送过,如果该消息之前发送过,那么这个属性的值需要被设置为true, 客户端可以根据这个属性的值来

确认这个消息是否重复发送过,以避免重复处理。

 Provider

8

JMSType

由消息发送者设置的个消息类型,代表消息的结构,有的消息中间件可能会用到这个,但这个并不是是批消息的种类,比如

TextMessage之类的

 client

9

JMSExpiration

消息的过期时间,以毫秒为单位,根据定义,它应该是timeToLive的值再加上发送时的GMT时间,也就是说这个指的是过期

时间,而不是有效期

send 

10

JMSPriority

 消息的优先级,0-4为普通的优化级,而5-9为高优先级,通常情况下,高优化级的消息需要优先发送  send

  从上表中我们可以看到,系统提供的标准头信息一共有10个属性,其中有6个是由send方法在调用时设置的,有三个是由客户端设置的,还有一个是由消息中间件设置的。

需要注意的是,这里的client不是指消费者,而是指使用JMS的客户端,即开发者所写的应用程序,即在生产消息时,这三个属性是可以由应用程序来设定的,而其它的header要么由消息中间件设置,要么由发送方法来决定,开发者即使设置了,也是无效的。

为了验证我们的猜测,个人做了个测试,结果如下:

以上截图只显示了关键的设置代码和消费者获取到消息之后的打印结果,从中可以得到以下结论:

1)只有JmsType, ReplyTo和CorrelationId可以显示设置,其它都无效

2)优先级和有效期可以由生产者来设置

3)Expiration的值等于Timestemp的时间加上timeToLive的值,是一个绝对时间。

  基于以上结论,对于大多数属性来说,我们知道其表示的意义即可,因为我们无法改变这些值的设置。

JMS学习(二)- JMS Message Model 组成介绍及消息头详解的更多相关文章

  1. Linux系统学习 二十一、SAMBA服务—相关文件、配置文件详解

    3.相关文件 常用文件: /etc/samba/smb.conf      #配置文件 /etc/samba/lmhosts        #对应NetBIOS名与主机的IP的文件,一般Samba会自 ...

  2. Python操作redis学习系列之(集合)set,redis set详解 (六)

    # -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...

  3. “全栈2019”Java第九十二章:外部类与内部类成员覆盖详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. 2017.2.13 开涛shiro教程-第十二章-与Spring集成(一)配置文件详解

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(一)配置文件详解 1.pom.xml ...

  5. TortoiseGit学习系列之TortoiseGit基本操作拉取项目(图文详解)

    前面博客 TortoiseGit学习系列之TortoiseGit基本操作克隆项目(图文详解) TortoiseGit学习系列之TortoiseGit基本操作修改提交项目(图文详解) TortoiseG ...

  6. Git学习系列之Git基本操作拉取项目(图文详解)

    前面博客 Git学习系列之Git基本操作推送项目(图文详解) 当然,如果多人协作,或者多个客户端进行修改,那么我们还要拉取(Pull ... )别人推送到在线仓库的内容下来. 大神们是不推荐使用 pu ...

  7. JMS学习一(JMS介绍)

    一.JMS是个什么鬼 1.百度百科解释:JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之 ...

  8. JMS学习二(简单的ActiveMQ实例)

    下载安装ActiveMQ服务,下载地址当然可以去官网下载 http://activemq.apache.org/download-archives.html ActiveMQ安装很简单,下载解压后到b ...

  9. JMS学习(三)JMS 消息结构之属性及消息体详解

    一.前言 通过上一篇的学习我们知道了消息分为三个部分,即消息头,属性及消息体,并对消息头的十个属性进行了详细的介绍,本文再对消息属性及消息体进行详细的介绍. 二.属性介绍 消息属性的主要作用是可以对头 ...

随机推荐

  1. Windows 64位 安装Oracle instantclient 官方绿色版和PL/SQL Developer 总结

    原文: http://blog.csdn.net/kimsoft/article/details/8751267 操作系统:Windows 7 64位旗舰 要求,安装PL/SQL Developer用 ...

  2. [原创]android自定义动画的一点感悟

    android提供了一系列的动画处理api,包括animator以及animation等.由于动画效果是根据人眼视觉残留原理形成的,因此动画过程中android需要不断频繁的更新view的相关属性,由 ...

  3. Python中的模块与包

    标准库的安装路径 在import模块的时候,python是通过系统路径找到这些模块的,我们可以将这些路径打印出来: >>> pprint.pprint(sys.path) ['', ...

  4. Digg Reader 登录不了,原来如此

    cdnjs.cloudflare.com 不能访问,你懂的,给 https://cdnjs.cloudflare.com 跟 http://cdnjs.cloudflare.com 架个梯子就可以了, ...

  5. Promise 使用心得

        this.testPromise=function(){         return new Promise(function(resolve,reject){             co ...

  6. python + hadoop (案例)

    python如何链接hadoop,并且使用hadoop的资源,这篇文章介绍了一个简单的案例! 一.python的map/reduce代码 首先认为大家已经对haoop已经有了很多的了解,那么需要建立m ...

  7. 为Ubuntu笔记本电脑设置WiFi热点共享上网

    该文由土木坛子转译而来,说是转译,其实看截图就可以方便的设置,没有任何命令,全是图形界面,方便容易.我们都知道怎样在 windows 7 系统上如何设计 Wifi 热点,当你只有一条网线,多台计算机的 ...

  8. 利用decorator和descriptor进行数据缓存

    class cached_property(object): def __init__(self, func, name=None, doc=None): self.__name__ = name o ...

  9. Word2010撤销按钮失效,Ctrl+Z失效解决办法

    1.打开注册表编辑器.按Win+R,在运行框中键入regedit,然后单击“确定”. 2.在注册表编辑器中,展开到下列注册表子项: HKEY_CURRENT_USER\Software\Microso ...

  10. [转] 关于hibernate的缓存使用

    http://blog.csdn.net/woshichenxu/article/details/586361 1.     关于hibernate缓存的问题: 1.1.1.         基本的缓 ...