WebSphere MQ 遥感传输方式 固定头

每条 WebSphere MQ 遥感传输方式 命令消息的消息头包含固定头。下表显示固定头格式。

7 6 5 4 3 2 1 0
字节 1 消息类型 DUP 标志 QoS 级别 RETAIN
字节 2 剩余长度
字节 1

包括“消息类型”和“标志”(Dup、QoS 级别和 RETAIN)字段。

字节 2

(至少一个字节)包含“剩余长度”字段。

在以下部分中描述了这些字段。所有数据值都按大尾数法的顺序:高顺序字节在低顺序字节前。16 位字在线上显示为“最重要的字节”(MSB),后面是“最不重要的字节”(LSB)。

消息类型

位置:字节 1,位 7-4。

显示为 4 位无符号值。下表中显示了此协议版本的枚举。

助记符 枚举 描述
保留 0 保留
CONNECT 1 连接到代理的客户机请求
CONNACK 2 连接确认
PUBLISH 3 发布消息
PUBACK 4 发布确认
PUBREC 5 发布接收(有保证的发送部分 1)
PUBREL 6 发布发行版(有保证的发送部件 2)
PUBCOMP 7 发布完成(有保证的发送部分 3)
SUBSCRIBE 8 客户机预订请求
SUBACK 9 预订确认
UNSUBSCRIBE 10 客户机取消预订请求
UNSUBACK 11 取消预订确认
PINGREQ 12 PING 请求
PINGRESP 13 PING 响应
DISCONNECT 14 客户机正在断开连接
保留 15 保留

标志

字节 1 的剩余各位包含 DUP、QoS 和 RETAIN 字段。如下表所示,对位位置进行了编码来表示各标志。

位位置 名称 描述
3 DUP 重复发送
2-1 QoS 服务质量
0 RETAIN RETAIN 标志
DUP

位置:字节 1,位 3。

当客户机或代理尝试重新发送“发布”消息时设置此标志。此标志适用于 QoS 值大于零(0),且必需确认的消息。当设置 DUP 位时,可变头包含一个消息标识。

QoS

位置:字节 1,位 2-1。

此标志表明发送“发布”消息的确认级别。下表中显示了 QoS 级别。

QoS 值 位 2 位 1 描述
0 0 0 最多一次 发送/忽略消息 <=1
1 0 1 至少一次 确认传递 >=1
2 1 0 仅一次 确实传递 =1
3 1 1 保留
RETAIN

位置:字节 1,位 0。

设置时,Retain 标志表明代理保留消息,并作为初始消息发送到预订本主题 的新订户。这表示连接到代理的新客户机可以快速建立当前的主题数。当发布程序以“报告异常”为基础发送消息时这很有用,并且它可能有时在新订户接收有关特殊主题的 数据前。数据具有保留或 Last Known Good(LKG)的值。

在 将“预订”消息发送到一个或多个主题后,订户接收到 SUBACK 消息,每个具有保留值的新预订的主题都后跟一条消息。保留值从代理发布到已设置 Retain 标志并具有相同原始发布的 QoS 的订户,并因此以通常的 QoS 传递确保为条件。在消息中将 Retain 标志设置到订户,将它与“ live”数据分辨开,以便订户能适当的处理它。

因为代理可能不再保留先前保留的 PUBLISH 消息,所以不保证订户会收到有关某个主题的初始保留 PUBLISH 消息。

剩余长度

位置:字节 2。

表示当前消息内剩余的字节数,包括可变头和有效内容中的数据。

可变长度编码方案对相当于 127 字节的消息使用单字节。超出此长度的消息按如下所示进行处理。每个字节的 7 位编码剩余长度数据,而第八位表示表示法中的任何以下字节。每个字节编码 128 个值和一个“延续位 ”。例如,编码为 单字节的十进制数 64 用十六进制数来表示是 0x40。而编码为双字节的十进制数 321(=128x2 + 65)是低位在先的。第一个字节是 2+128 = 130。注意,设置顶部位至少表示以 下字节之一。第二个字节是 65。

协议限制最大表示为 4 的字节数。这允许应用程序发送多达 268 435 455(256 MB)的消息。所使用的此数字的表示为:0xFF、0xFF、0xFF、0x7F。

下表显示了通过增加字节数表示的剩余长度值。

数字
1 0(0x00) 127(0x7F)
2 128(0x80,0x01) 16 383 (0xFF, 0x7F)
3 16 384 (0x80, 0x80, 0x01) 2 097 151 (0xFF, 0xFF, 0x7F)
4 2 097 152 (0x80, 0x80, 0x80, 0x01) 268 435 455 (0xFF, 0xFF, 0xFF, 0x7F)

将十进制数(X)编码到可变长度编码方案的算法如下所示:

do
  digit = X MOD 128
  x = X DIV 128
  // if there are more digits to encode, set the top bit of this digit
  if ( X > 0 )
    digit = digit OR 0x80
  endif
  'output' digit
while ( X > 0 )

其中 MOD 是取模运算符(C 中的 %)、DIV 是整除(C 中的 /),而 OR 是按位或运算符(C 中的 |)。

编码剩余长度字段的算法如下所示:

multiplier = 1
     value = 0
     do
          digit = 'next digit from stream'
          value += (digit AND 127) * multiplier;
          multiplier *= 128;
     while ((digit AND 128) != 0);

其中 AND 是按位与运算符(C 中的 &)。

当此算法终止时,以字节包含剩余长度。

剩余长度编码不是可变头的一部分。用于编码剩余长度的字节数不包含剩余长度的值。变量长度“扩展字节”是固定头的一部分(而不是可变头)。

声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac10870_