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,由提供商设置