MQMDE-消息描述符扩展

MQMDE 结构描述有时出现在应用程序消息数据之前的数据。 此结构包含存在于 version-2 MQMD 中但不在 version-1 MQMD 中的那些 MQMD 字段。

可用性

所有 IBM® MQ 系统,以及连接到这些系统的 IBM MQ MQI clients

格式名

MQFMT_MD_EXTENSION

字符集和编码

MQMDE 中的数据必须采用本地队列管理器的字符集和编码; 这些数据由 C 编程语言的 CodedCharSetId 队列管理器属性和 MQENC_NATIVE 提供。

将 MQMDE 的字符集和编码设置到 CodedCharSetIdEncoding 字段中:
  • MQMD (如果 MQMDE 结构位于消息数据的开头) ,或者
  • MQMDE 结构之前的头结构 (所有其他情况)。

如果 MQMDE 不在队列管理器的字符集和编码中,那么将接受但不接受 MQMDE ,即 MQMDE 被视为消息数据。

注:Windows上,使用 Micro Focus COBOL 编译的应用程序使用不同于队列管理器编码的 MQENC_NATIVE 值。 虽然 MQPUT , MQPUT1和 MQGET 调用上的 MQMD 结构中的数字字段必须采用 Micro Focus COBOL 编码,但 MQMDE 结构中的数字字段必须采用队列管理器的编码。 后者由 MQENC_NATIVE 为 C 编程语言提供,并且具有值 546。

用法

使用 version-2 MQMD 的应用程序不会迂到 MQMDE 结构。 但是,专用应用程序以及继续使用 version-1 MQMD 的应用程序在某些情况下可能会迂到 MQMDE。 MQMDE 结构可能在以下情况下发生:
  • 在 MQPUT 和 MQPUT1 调用上指定
  • MQGET 调用返回
  • 在传输队列上的消息中

MQPUT 和 MQPUT1 调用上指定的 MQMDE

在 MQPUT 和 MQPUT1 调用上,如果应用程序提供了 version-1 MQMD ,那么应用程序可以选择使用 MQMDE 作为消息数据的前缀,将 MQMD 中的 Format 字段设置为 MQFMT_MD_EXTENSION 以指示存在 MQMDE。 如果应用程序未提供 MQMDE ,那么队列管理器将为 MQMDE 中的字段采用缺省值。 队列管理器使用的缺省值与结构的初始值相同; 请参阅 表 2

如果应用程序提供了 version-2 MQMD ,并且 以 MQMDE 作为应用程序消息数据的前缀,那么将按下表中所示处理结构。

表 1. 在 MQPUT 或 MQPUT1 上为 MQMDE 指定 MQMDE 时的队列管理器操作
MQMD 版本 version-2 字段的值 MQMDE 中相应字段的值 队列管理器执行的操作
1 - 有效 已采用 MQMDE
2 缺省 有效 已采用 MQMDE
2 不是缺省值 有效 MQMDE 被视为消息数据
第 1 年或第 2 年 任意 无效 调用失败,并带有相应的原因码
第 1 年或第 2 年 任意 MQMDE 的字符集或编码错误,或者是不受支持的版本 MQMDE 被视为消息数据
注:z/OS®上,如果应用程序指定了带有 MQMDE 的 version-1 MQMD ,那么仅当队列的 IndexType 为 MQIT_GROUP_ID 时,队列管理器才会验证 MQMDE。

有一个特殊情况。 如果应用程序使用 version-2 MQMD 来放置作为段的消息 (即,设置了 MQMF_SEGMENT 或 MQMF_LAST_SEGMENT 标志) ,并且 MQMD 中的格式名称为 MQFMT_DEAD_LETTER_HEADER ,那么队列管理器会生成 MQMDE 结构,并将其 插入到 MQDLH 结构及其后的数据之间。 在队列管理器随消息保留的 MQMD 中, version-2 字段设置为其缺省值。

version-2 MQMD 中存在但不存在 version-1 MQMD 的多个字段是 MQPUT 和 MQPUT1上的输入/输出字段。 但是,队列管理器不会在 MQPUT 和 MQPUT1 调用的输出上返回 MQMDE 中等效字段中的任何值; 如果应用程序需要这些输出值,那么它必须使用 version-2 MQMD。

MQGET 调用返回的 MQMDE

在 MQGET 调用上,如果应用程序提供了 version-1 MQMD ,那么队列管理器将以 MQMDE 返回的消息作为前缀,但仅当 MQMDE 中的一个或多个字段具有非缺省值时才如此。 队列管理器将 MQMD 中的 Format 字段设置为值 MQFMT_MD_EXTENSION ,以指示存在 MQMDE。

如果应用程序在 Buffer 参数启动时提供 MQMDE ,那么将忽略 MQMDE。 从 MQGET 调用返回时,会将其替换为消息的 MQMDE (如果需要) 或由应用程序消息数据覆盖 (如果不需要 MQMDE)。

如果 MQGET 调用返回 MQMDE ,那么 MQMDE 中的数据通常采用队列管理器的字符集和编码。 但是,在下列情况下, MQMDE 可能使用其他某个字符集和编码:
  • MQMDE 被视为 MQPUT 或 MQPUT1 调用上的数据 (请参阅 表 1 以了解可能导致此情况的情况)。
  • 从通过 TCP 连接连接的远程队列管理器接收到消息,并且未正确设置接收消息通道代理程序 (MCA)。
注:Windows上,使用 Micro Focus COBOL 编译的应用程序使用不同于队列管理器编码的 MQENC_NATIVE 值 (请参阅上文)。

传输队列上的消息中的 MQMDE

传输队列上的消息以 MQXQH 结构为前缀,其中包含 version-1 MQMD。 MQMDE 也可能存在,位于 MQXQH 结构和应用程序消息数据之间,但通常仅当 MQMDE 中的一个或多个字段具有非缺省值时才存在。

其他 MQ 头结构也可以出现在 MQXQH 结构与应用程序消息数据之间。 例如,当死信头 MQDLH 存在并且消息不是段时,顺序为:
  • MQXQH (包含 version-1 MQMD)
  • MQMDE
  • MQDLH
  • 应用程序消息数据

字段

注: 在下表中,字段按用法 (而不是按字母顺序) 进行分组。 子主题遵循相同的顺序。
表 2. MQMDE 的 MQMDE 中的字段
字段名称和描述 常量的名称 常量的初始值 (如果有)
StrucId (结构标识) MQMDE_STRUC_ID 'MDE¬'
版本 (结构版本号) MQMDE_VERSION_2 2
StrucLength (MQMDE 结构的长度) MQMDE_LENGTH_2 72
编码 (MQMDE 之后的数据的数字编码) MQENC_NATIVE 取决于环境
CodedCharSetId(MQMDE 之后数据的字符集标识符) MQCCSI_UNDEFINED 0
Format (MQMDE 之后的数据的格式名称) MQFMT_NONE 空白
标志 (常规标志) MQMDEF_NONE 0
GroupId (组标识) MQGI_NONE Null
MsgSeqNumber(组内逻辑报文的序列号) None 1
偏移量 (物理消息中的数据与逻辑消息开始的偏移量) None 0
MsgFlags (消息标志) MQMF_NONE 0
OriginalLength (原始消息的长度) MQOL_UNDEFINED -1
备注信息:
  1. 符号 ¬ 表示单个空白字符。
  2. 在 C 编程语言中,宏变量 MQMDE_DEFAULT 包含表中列出的值。 它可以通过以下方式用于为结构中的字段提供初始值:
    MQMDE MyMDE = {MQMDE_DEFAULT};
    

语言声明

MQMDE 的 C 声明

typedef struct tagMQMDE MQMDE;
struct tagMQMDE {
  MQCHAR4   StrucId;         /* Structure identifier */
  MQLONG    Version;         /* Structure version number */
  MQLONG    StrucLength;     /* Length of MQMDE structure */
  MQLONG    Encoding;        /* Numeric encoding of data that follows
                                MQMDE */
  MQLONG    CodedCharSetId;  /* Character-set identifier of data that
                                follows MQMDE */
  MQCHAR8   Format;          /* Format name of data that follows
                                MQMDE */
  MQLONG    Flags;           /* General flags */
  MQBYTE24  GroupId;         /* Group identifier */
  MQLONG    MsgSeqNumber;    /* Sequence number of logical message
                                within group */
  MQLONG    Offset;          /* Offset of data in physical message from
                                start of logical message */
  MQLONG    MsgFlags;        /* Message flags */
  MQLONG    OriginalLength;  /* Length of original message */
};

MQMDE 的 COBOL 声明

**   MQMDE structure
  10 MQMDE.
**    Structure identifier
   15 MQMDE-STRUCID        PIC X(4).
**    Structure version number
   15 MQMDE-VERSION        PIC S9(9) BINARY.
**    Length of MQMDE structure
   15 MQMDE-STRUCLENGTH    PIC S9(9) BINARY.
**    Numeric encoding of data that follows MQMDE
   15 MQMDE-ENCODING       PIC S9(9) BINARY.
**    Character-set identifier of data that follows MQMDE
   15 MQMDE-CODEDCHARSETID PIC S9(9) BINARY.
**    Format name of data that follows MQMDE
   15 MQMDE-FORMAT         PIC X(8).
**    General flags
   15 MQMDE-FLAGS          PIC S9(9) BINARY.
**    Group identifier
   15 MQMDE-GROUPID        PIC X(24).
**    Sequence number of logical message within group
   15 MQMDE-MSGSEQNUMBER   PIC S9(9) BINARY.
**    Offset of data in physical message from start of logical message
   15 MQMDE-OFFSET         PIC S9(9) BINARY.
**    Message flags
   15 MQMDE-MSGFLAGS       PIC S9(9) BINARY.
**    Length of original message
   15 MQMDE-ORIGINALLENGTH PIC S9(9) BINARY.

MQMDE 的 PL/I 声明

dcl
 1 MQMDE based,
  3 StrucId        char(4),       /* Structure identifier */
  3 Version        fixed bin(31), /* Structure version number */
  3 StrucLength    fixed bin(31), /* Length of MQMDE structure */
  3 Encoding       fixed bin(31), /* Numeric encoding of data that
                                     follows MQMDE */
  3 CodedCharSetId fixed bin(31), /* Character-set identifier of data
                                     that follows MQMDE */
  3 Format         char(8),       /* Format name of data that follows
                                     MQMDE */
  3 Flags          fixed bin(31), /* General flags */
  3 GroupId        char(24),      /* Group identifier */
  3 MsgSeqNumber   fixed bin(31), /* Sequence number of logical message
                                     within group */
  3 Offset         fixed bin(31), /* Offset of data in physical message
                                     from start of logical message */
  3 MsgFlags       fixed bin(31), /* Message flags */
  3 OriginalLength fixed bin(31); /* Length of original message */

MQMDE 的 High Level Assembler 声明

MQMDE                 DSECT
MQMDE_STRUCID         DS   CL4   Structure identifier
MQMDE_VERSION         DS   F     Structure version number
MQMDE_STRUCLENGTH     DS   F     Length of MQMDE structure
MQMDE_ENCODING        DS   F     Numeric encoding of data that follows
*                                MQMDE
MQMDE_CODEDCHARSETID  DS   F     Character-set identifier of data that
*                                follows MQMDE
MQMDE_FORMAT          DS   CL8   Format name of data that follows MQMDE
MQMDE_FLAGS           DS   F     General flags
MQMDE_GROUPID         DS   XL24  Group identifier
MQMDE_MSGSEQNUMBER    DS   F     Sequence number of logical message
*                                within group
MQMDE_OFFSET          DS   F     Offset of data in physical message from
*                                start of logical message
MQMDE_MSGFLAGS        DS   F     Message flags
MQMDE_ORIGINALLENGTH  DS   F     Length of original message
*
MQMDE_LENGTH          EQU  *-MQMDE
                      ORG  MQMDE
MQMDE_AREA            DS   CL(MQMDE_LENGTH)

MQMDE 的 Visual Basic 声明

Type MQMDE
  StrucId        As String*4 'Structure identifier'
  Version        As Long     'Structure version number'
  StrucLength    As Long     'Length of MQMDE structure'
  Encoding       As Long     'Numeric encoding of data that follows'
                             'MQMDE'
  CodedCharSetId As Long     'Character-set identifier of data that'
                             'follows MQMDE'
  Format         As String*8 'Format name of data that follows MQMDE'
  Flags          As Long     'General flags'
  GroupId        As MQBYTE24 'Group identifier'
  MsgSeqNumber   As Long     'Sequence number of logical message within'
                             'group'
  Offset         As Long     'Offset of data in physical message from'
                             'start of logical message'
  MsgFlags       As Long     'Message flags'
  OriginalLength As Long     'Length of original message'
End Type