JMS Message消息头、消息体、消息属性
Message 接口(消息)
是在消费者和生产者之间传送的对象,也就是说从一个应用程序传送到另一个应用程序。消息接口非常灵活,并提供了许多方式来定制消息的内容。一个消息有三个主要部分:
- 消息头(Header,必须):包含用于识别和为消息寻找路由的操作设置,所有类型的这部分格式都是一样的。
- 消息体(Body,可选、一个):指我们具体需要消息传输的内容,允许用户创建五种类型的消息(文本消息,映射消息,字节消息,流消息和对象消息)。
- 消息属性(Properties,可选、一组):按类型可以分为应用设置的属性,标准属性和消息中间件定义的属性,包含额外的属性,支持其他提供者和用户的兼容。可以创建定制的字段和过滤器(消息选择器)。
Message消息头(Header)
消息头(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要么由消息中间件设置,要么由发送方法来决定,开发者即使设置了,也是无效的。
Message消息体(Properties)
注意:发送和接受的消息体类型必须保持一一对应。
五中消息体格式
序号 | 消息体类型 | 说明 |
1 | TextMessage(文本消息) |
编码字符串。对于外发消息,字符串在由目标对象给定的字符集中进行编码。缺省情况下使用 UTF8 编码(UTF8 编码从消息的第一个字符开始;开头处无长度字段)。但是,可以指定 用于 JMS 的 IBM® MQ 类 支持的任何其他字符集。此类字符集主要在将消息发送到非 JMS 应用程序时使用。
如果字符集是双字节集(包括 UTF16),那么目标对象的整数编码规范可确定字节顺序。 使用消息本身中指定的字符集及编码来解释入局消息。这些规范在最后一个 IBM MQ 头中,如果没有头,那么在 MQMD 中。对于 JMS 消息,最后一个头通常为 MQRFH2。 |
2 | MapMessage(键值对消息) | 消息体包含了一系列的名字-值对.名字是Strings,而值则是Java primitive 类型.消息体中的条目可以被enumerator按照顺序访问,也可以自由访问.条目的顺序没 有定义. |
3 | ObjectMessage(对象消息) | 是 Java™ Runtime 以正常方式进行序列化的对象。 |
4 | BytesMessage(bytes消息) |
缺省情况下,BytesMessage 是 JMS 1.0.2 规范及关联 Java 文档所定义的一系列字节。
对于由应用程序本身组合的外发消息,目标对象的编码属性可用于覆盖消息中所含的整数和浮点字段的编码。例如,可以请求以 S/390 格式而非 IEEE 格式存储浮点值。 使用消息本身中指定的数字编码来解释入局消息。此规范在最后一个 IBM MQ 头中,如果没有头,那么在 MQMD 中。对于 JMS 消息,最后一个头通常为 MQRFH2。 如果收到 BytesMessage,并且在不进行修改的情况下重新发送,那么消息主体将按照其接收的方式逐字节进行传输。目标对象的编码属性对主体无任何影响。可以在 BytesMessage 中明确发送的唯一的类似字符串的实体是 UTF8 字符串。它采用 Java UTF8 格式编码,并以双字节长度字段开头。目标对象的字符集属性对外发 BytesMessage 编码无任何影响。入局 IBM MQ 消息中的字符集值对于将此消息解释为 JMS BytesMessage 无任何影响。 非 Java 应用程序不太可能能够识别 Java UTF8 编码。因此,对于要发送包含文本数据的 BytesMessage 的 JMS 应用程序,应用程序本身必须将其字符串转换为字节数组,并将这些字节数组写入 BytesMessage。 |
5 | StreamMessage(流消息) |
StreamMessage 与映射消息类似,但无元素名称:
其中 datatype 是表 6 中列出的其中一个数据类型。缺省数据类型为 string,因此会为字符串元素省略 dt=string 属性。 用于编码或解释组成 StreamMessage 主体的 XML 字符串的字符集遵循适用于 TextMessage 的规则来确定。 |
Message消息属性
- JMSXUserID:发送消息的用户识别,发送时提供商设置
- JMSXappID:发送消息的应用标识,发送时提供商设置
- JMSXdeliveryCount:转发消息重试次数:从1开始,发送方提供商设置
- JMSXGroupID:消息所在消息组的用户标识,由客户端设置
- JMSXGroupSeq:组内消息的序号,从1开始.由客户端设置
- JMSXProducerTEID:产生消息的事务的事务表示,发送方提供商设置
- JMSConsumerTXID:消费消息的事务的事务表示,接收方提供设置
- JMSXRevTimestamp:JMS转发消息到消费者的事件,接收方提供设置
- JMState:假设有个消息仓库,它存储每个消息的单独拷贝,从原始消息被发送时开始,状态有1(等待),2(准备),3(到期),4(保留),由于状态和生产者和消费者无关,所以它不是由他们提供,它只和仓库查找消息相关,因此JMS没有提供这中API,由提供商设置
JMS Message消息头、消息体、消息属性相关推荐
- 理解HTTP消息头【很完整,例子也很丰富】
(一)初识HTTP消息头 但凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头. 做过Socket编程的人都知道,当我 ...
- Java消息服务~自动分配的消息头
消息头的值由JMS提供者来设置,开发者setJMSXxx()分配的值忽略. JMSDestination 消息头使用一个Topic 或 Queue 对象来标识目的地. Topic destinatio ...
- 《转》理解HTTP消息头
转自:http://blog.163.com/cshzxing@126/blog/static/37732930200833010340991/ (一)初识HTTP消息头 但凡搞WEB开发的人都离不开 ...
- 深入掌握JMS(六):消息头
一个消息对象分为三部分:消息头(Headers),属性(Properties)和消息体(Payload).对于StreamMessage和 MapMessage,消息本身就有特 ...
- Java消息服务~开发者分配的消息头
生产者传送该消息之前在Message 对象上设置 JMSReplyTo 有些情况下,一个JMS消息生产者可能会要求消费者对一条消息做出应答.JMSReplyTo 消息头包含了一个javax.jms.D ...
- SIP消息头域的说明
当前位置: 主页>流媒体开发>规范及协议> SIP消息头域的说明 编辑:落鹤生 时间:2011-03-11 09:16 点击:378次 为描述消息基本属性的通用头域,可用于请求消息或 ...
- NSObject头文件解析 / 消息机制 / Runtime解读 (一)
NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h>@interface Class ...
- spring jms 事务_Spring JMS:处理事务中的消息
spring jms 事务 1.引言 这篇文章将向您展示使用JMS异步接收消息期间使用者执行过程中的错误如何导致消息丢失. 然后,我将解释如何使用本地事务解决此问题. 您还将看到这种解决方案在某些情况 ...
- Spring JMS:处理事务中的消息
1.引言 这篇文章将向您展示在使用JMS异步接收消息期间,使用者执行过程中的错误如何导致消息丢失. 然后,我将解释如何使用本地事务解决此问题. 您还将看到这种解决方案在某些情况下可能导致消息重复(例如 ...
- Linphone android去电增加自定义SIP消息头的流程分析
一.首先看一下如何在发起去电的sip请求中添加自定义的消息头 增加自定义头消息发方法,so已经提供了native方法, 发起呼叫的示例如下: LinphoneCallParams params = l ...
最新文章
- SpringMVC传递multiple类型select后台Controller的接收方法
- koa中间件mysql写法_koa-mysql(三)
- 汇编语言 【大练习】寻址方式在结构化访数据访问中的应用
- ingress controller 和ingress使用实例
- [css] 颜色hsla的字母分别表示什么?
- 濮阳第二届创客机器人比赛_咸阳市举行第二届机器人大赛暨第一届创客大赛
- wpf 进度条两侧圆角_[原译]WPF绘制圆角多边形
- 诈骗云集投诉不断,“云相亲”靠谱吗?
- 关于base64编码解码(Android编码,JS解码,案例为解决安卓端H5页面的emoji表情显示问题)
- 「MySQL」- 基础增删改查
- 简答实现登录注册(需要导入JQ库)
- Counting swaps
- 知识图谱文献综述(第二章 知识表示学习)
- 【ANDROID学习】
- 全球最火的程序员学习路线!
- 斐波拉契数列的三种实现方法
- ORA-00257: archiver error. Connect internal only, until freed 错误解决方案
- [原创]自定义ViewPager实现3D画廊效果
- 假期计划(holiday)【CSPS2022】
- oc语言和c语言,OC和C语言的混编注意点和好处