[IBM i]

IBM i 上的 MQMD (消息描述符)

概述

用途:MQMD 结构包含在发送和接收应用程序之间传输消息时伴随应用程序数据的控制信息。 此结构是 MQGET , MQPUT 和 MQPUT1 调用上的输入/输出参数。

版本:MQMD 的当前版本为 MDVER2。 仅在结构的最新版本中存在的字段在随后的描述中标识为此类字段。

提供的 COPY 文件包含环境支持的最新版本的 MQMD ,但 MDVER 字段的初始值设置为 MDVER1。 要使用 version-1 结构中不存在的字段,应用程序必须将 MDVER 字段设置为所需版本的版本号。

名称为 MQMD1的 version-1 结构的声明可用。

字符集和编码:MQMD 中的数据必须包含由 CodedCharSetId 队列管理器属性提供的字符集以及由 ENNAT 提供的本地队列管理器的编码。 但是,如果应用程序作为 IBM® MQ MQI client运行,那么结构必须采用客户机的字符集和编码。

如果发送和接收队列管理器使用不同的字符集或编码,那么将自动转换 MQMD 中的数据。 应用程序不需要转换 MQMD。

使用不同版本的 MQMD

version-2 MQMD 通常等同于使用 version-1 MQMD 并以 MQMDE 结构作为消息数据的前缀。 但是,如果 MQMDE 结构中的所有字段都具有其缺省值,那么可以省略 MQMDE。 如本节后面所述,将使用 version-1 MQMD 和 MQMDE。
  • 在 MQPUT 和 MQPUT1 调用上,如果应用程序提供 version-1 MQMD ,那么应用程序可以选择使用 MQMDE 作为消息数据的前缀,将 MQMD 中的 MDFMT 字段设置为 FMMDE 以指示存在 MQMDE。 如果应用程序未提供 MQMDE ,那么队列管理器将为 MQMDE 中的字段采用缺省值。
    注: version-2 MQMD 中存在但 version-1 MQMD 不存在的几个字段是 MQPUT 和 MQPUT1 调用上的输入/输出字段。 但是,队列管理器不会在 MQPUT 和 MQPUT1 调用的输出上返回 MQMDE 中等效字段中的任何值; 如果应用程序需要这些输出值,那么它必须使用 version-2 MQMD。
  • 在 MQGET 调用上,如果应用程序提供 version-1 MQMD ,那么队列管理器会将使用 MQMDE 返回的消息作为前缀,但前提是 MQMDE 中的一个或多个字段具有非缺省值。 MQMD 中的 MDFMT 字段将具有值 FMMDE ,以指示存在 MQMDE。
队列管理器用于 MQMDE 中字段的缺省值与这些字段的初始值相同,如 表 1中所示。

当消息位于传输队列上时, MQMD 中的某些字段将设置为特定值; 请参阅 IBM i 上的 MQXQH (传输队列头) 以获取详细信息。

消息上下文

MQMD 中的某些字段包含消息上下文。 具体方式通常为:
  • 身份 上下文与 最初 放置消息的应用程序相关
  • 上下文与 最近 放入消息的应用程序相关
  • 用户 上下文与 最初 放置消息的应用程序相关。
这两个应用程序可以是同一个应用程序,但也可以是不同的应用程序 (例如,当消息从一个应用程序转发到另一个应用程序时)。

虽然身份和源上下文通常具有先前描述的含义,但 MQMD 中两种类型的上下文字段的内容实际上取决于放入消息时指定的 PM* 选项。 因此,身份上下文不一定与最初放置消息的应用程序相关,而源上下文不一定与最近放置消息的应用程序相关-这取决于应用程序套件的设计。

有一类应用程序从不改变消息上下文,即消息通道代理程序 (MCA)。 从远程队列管理器接收消息的 MCA 使用 MQPUT 或 MQPUT1 调用上的上下文选项 PMSETA。 这允许接收 MCA 保留与来自发送 MCA 的消息一起传递的消息上下文。 但是,结果是源上下文与最近放置消息的应用程序 (接收 MCA) 无关,而是与放置消息的较早应用程序 (可能是原始应用程序本身) 相关。

有关更多信息,请参阅 消息上下文

消息到期

在已装入的队列 (已打开的队列) 上到期的消息将在到期后的合理时间段内自动从队列中除去。 此 IBM MQ 发行版的一些其他新功能可能会导致扫描装入的队列的频率低于先前产品版本中的频率,但是装入的队列上的到期消息始终会在其到期的合理时间段内除去。

字段

MQMD 结构包含以下字段; 这些字段按字母顺序描述:

MDACC (32 字节位字符串)

记帐标记。

这是消息的 身份上下文 的一部分。 有关消息上下文的更多信息,请参阅 消息上下文控制上下文信息

MDACC 允许应用程序将由于消息而完成的工作相应地收费。 队列管理器将此信息视为位字符串,并且不检查其内容。

当队列管理器生成此信息时,将按如下所示进行设置:
  • 字段的第一个字节设置为随后的字节中存在的记帐信息的长度; 此长度在 0 到 30 的范围内,并以二进制整数形式存储在第一个字节中。
  • 第二个字节和后续字节 (由长度字段指定) 设置为适合于环境的记帐信息。
    • z/OS® 上,记帐信息设置为:
      • 对于 z/OS 批处理,来自 JES JOB 卡或 EXEC 卡中的 JES ACCT 语句的记帐信息 (逗号分隔符将更改为 X'FF ')。 如果需要,此信息将截断为 31 个字节。
      • 对于 TSO ,用户的帐号。
      • 对于 CICS®, LU 6.2 工作单元标识 (UEPUOWDS) (26 字节)。
      • 对于 IMS, 8 字符的 PSB 名称与 16 个字符的 IMS 恢复令牌并置。
    • IBM i上,会将记帐信息设置为作业的记帐代码。
    • UNIX上,记帐信息设置为 ASCII 字符格式的数字用户标识。
    • Windows上,记帐信息设置为压缩格式的 Windows NT 安全标识 (SID)。 SID 唯一地标识存储在 MDUID 字段中的用户标识。 当 SID 存储在 MDACC 字段中时,将省略 6 字节的 "标识权限" (位于 SID 的第三个字节和后续字节中)。 例如,如果 Windows NT SID 的长度为 28 个字节,那么将在 MDACC 字段中存储 22 个字节的 SID 信息。
  • 最后一个字节设置为记帐标记类型,即下列其中一个值:
    ATTCIC
    CICS LUOW 标识。
    ATTDOS
    PC DOS 缺省记帐令牌。
    ATTWNT
    Windows 安全标识。
    ATT400
    IBM i 记帐标记。
    关联处
    UNIX 数字标识。
    西雅图
    用户定义的记帐令牌。
    ATTUNK
    未知的记帐令牌类型。
    仅在以下环境中将记帐令牌类型设置为显式值: AIX®HP-UXIBM iSolarisWindows以及连接到这些系统的 IBM MQ MQI clients 。 在其他环境中,记帐令牌类型设置为值 ATTUNK。 在这些环境中,可以使用 MDPAT 字段来推断接收的记帐令牌的类型。
  • 所有其他字节都设置为二进制零。

对于 MQPUT 和 MQPUT1 调用,如果在 PMO 参数中指定了 PMSETI 或 PMSETA ,那么这是输入/输出字段。 如果既未指定 PMSETI 也未指定 PMSETA ,那么此字段在输入时将被忽略,并且是仅输出字段。 有关消息上下文的更多信息,请参阅 消息上下文控制上下文信息

成功完成 MQPUT 或 MQPUT1 调用后,此字段包含随消息一起传输的 MDACC (如果将其放入队列)。 如果保留消息 (请参阅 IBM i 上的 MQPMO (Put-message 选项) 中对 PMRET 的描述以获取有关保留发布的更多详细信息) ,那么这将是与消息一起保留的 MDACC 的值,但在将消息作为发布发送给订户时,此值不会用作 MDACC ,因为它们提供的值将覆盖发送给订户的所有发布中的 MDACC 。 如果消息没有上下文,那么该字段完全为二进制零。

这是 MQGET 调用的输出字段。

此字段不受基于队列管理器字符集的任何转换的约束-该字段被视为位的字符串,而不被视为字符串。

队列管理器对此字段中的信息不执行任何操作。 如果应用程序想要将该信息用于记帐目的,那么它必须解释该信息。

以下特殊值可用于 MDACC 字段:
未指定记帐标记。

对于字段的长度,该值为二进制零。

此字段的长度由 LNACCT 给出。 此字段的初始值为 ACNONE。

MDAID (32 字节字符串)

与身份相关的应用程序数据。

这是消息的 身份上下文 的一部分。 有关消息上下文的更多信息,请参阅 消息上下文控制上下文信息

MDAID 是由应用程序套件定义的信息,可用于提供有关消息或其发起方的其他信息。 队列管理器将此信息视为字符数据,但不定义其格式。 当队列管理器生成此信息时,它完全为空白。

对于 MQPUT 和 MQPUT1 调用,如果在 PMO 参数中指定了 PMSETI 或 PMSETA ,那么这是输入/输出字段。 如果存在空字符,那么队列管理器会将空字符和以下任何字符转换为空白。 如果既未指定 PMSETI 也未指定 PMSETA ,那么此字段在输入时将被忽略,并且是仅输出字段。 有关消息上下文的更多信息,请参阅 消息上下文控制上下文信息

成功完成 MQPUT 或 MQPUT1 调用后,此字段包含随消息一起传输的 MDAID (如果将其放入队列)。 这将是保留消息时随消息一起保留的 MDAID 的值 (请参阅 PMRET 描述以获取有关保留发布的更多详细信息) ,但在将消息作为发布发送给订户时不用作 MDAID ,因为它们提供了一个值以覆盖发送给订户的所有发布中的 MDAID 。 如果消息没有上下文,那么该字段完全为空白。

这是 MQGET 调用的输出字段。 此字段的长度由 LNAIDD 给出。 此字段的初始值为 32 个空白字符。

MDAOD (4 字节字符串)

与源相关的应用程序数据。

这是消息的 源上下文 的一部分。 有关消息上下文的更多信息,请参阅 消息上下文控制上下文信息

MDAOD 是应用程序套件定义的信息,可用于提供有关消息来源的其他信息。 例如,它可以由使用适当用户权限运行的应用程序设置,以指示身份数据是否可信。

队列管理器将此信息视为字符数据,但不定义其格式。 当队列管理器生成此信息时,它完全为空白。

对于 MQPUT 和 MQPUT1 调用,如果在 PMO 参数中指定了 PMSETA ,那么这是输入/输出字段。 将废弃字段中空字符后面的任何信息。 队列管理器将空字符和任何后续字符转换为空白。 如果未指定 PMSETA ,那么此字段将在输入时被忽略,并且是仅输出字段。

成功完成 MQPUT 或 MQPUT1 调用后,此字段包含随消息一起传输的 MDAOD (如果将其放入队列)。 这将是保留消息时随消息一起保留的 MDAOD 的值 (请参阅 PMRET 描述以获取有关保留发布的更多详细信息) ,但在将消息作为发布发送给订户时不用作 MDAOD ,因为它们提供了一个值以覆盖发送给订户的所有发布中的 MDAOD 。 如果消息没有上下文,那么该字段完全为空白。

这是 MQGET 调用的输出字段。 此字段的长度由 LNAORD 给出。 此字段的初始值为 4 个空白字符。

MDBOC (10 位有符号整数)

回退计数器。

这是 MQGET 调用先前作为工作单元一部分返回并随后回退消息的次数。 它是为了帮助应用程序检测基于消息内容的处理错误而提供的。 此计数不包括指定了任何 GMBRW* 选项的 MQGET 调用。

此计数的准确性受 HardenGetBackout 队列属性影响; 请参阅 队列的属性

这是 MQGET 调用的输出字段。 对于 MQPUT 和 MQPUT1 调用,将忽略此参数。 此字段的初始值为 0。

MDCID (24 字节位字符串)

相关标识。

这是一个字节字符串,应用程序可以使用该字节字符串将一条消息与另一条消息关联,或者将该消息与应用程序正在执行的其他工作关联。 相关标识是消息的永久属性,并且在队列管理器重新启动时持久存在。 由于相关标识是字节字符串而不是字符串,因此当消息从一个队列管理器流向另一个队列管理器时,不会在字符集之间转换相关标识。

对于 MQPUT 和 MQPUT1 调用,应用程序可以指定任何值。 队列管理器将此值与消息一起传输,并将其传递给发出消息获取请求的应用程序。

如果应用程序指定 PMNCID ,那么队列管理器将生成随消息一起发送的唯一相关标识,并在 MQPUT 或 MQPUT1 调用的输出时返回到发送应用程序。

如果保留此消息,那么此生成的相关标识将与该消息一起保留,并在将消息作为发布内容发送给在 MQSUB 调用上传递的 MQSD 中的 SDCID 字段中指定 CINONE 的订户时用作相关标识。

请参阅 MQPMO (Put-message options) on IBM i 以获取有关保留发布的更多详细信息

当队列管理器或消息通道代理程序生成报告消息时,它将以原始消息的 MDREP 字段 (ROCMTC 或 ROPCI) 指定的方式设置 MDCID 字段。 生成报告消息的应用程序也应该执行此操作。

对于 MQGET 调用, MDCID 是可用于选择要从队列中检索的特定消息的五个字段之一。 有关如何指定此字段的值的详细信息,请参阅 MDMID 字段的描述。

指定 CINONE 作为相关标识与不指定 MOCORI 具有相同的效果,即,任何相关标识都将匹配。

如果在 MQGET 调用的 GMO 参数中指定了 GMMUC 选项,那么将忽略此字段。

从 MQGET 调用返回时, MDCID 字段将设置为返回的消息的相关标识 (如果有)。

可以使用以下特殊值:
CINONE
未指定相关标识。

对于字段的长度,该值为二进制零。

CINEWS
消息是新会话的开始。

CICS bridge 将此值识别为指示新会话的开始,即新消息序列的开始。

对于 MQGET 调用,这是输入/输出字段。 对于 MQPUT 和 MQPUT1 调用,如果未指定 PMNCID ,那么这是输入字段,如果指定了 PMNCID ,那么这是输出字段。 此字段的长度由 LNCID 给出。 此字段的初始值为 CINONE。

MDCSI (10 位带符号整数)

这指定消息中字符数据的字符集标识。

注: MQMD 中的字符数据以及作为调用参数的其他 IBM MQ 数据结构必须位于队列管理器的字符集中。 此属性由队列管理器的 CodedCharSetId 属性定义; 请参阅 IBM i上队列管理器的属性 以获取此属性的详细信息。
可以使用以下特殊值:
CSQM
队列管理器的字符集标识。

消息中的字符数据位于队列管理器的字符集中。

在 MQPUT 和 MQPUT1 调用上,队列管理器会将随消息一起发送的 MQMD 中的此值更改为队列管理器的真实字符集标识。 因此, MQGET 调用从不返回值 CSQM。

CSINHT
继承此结构的字符集标识。

消息中的字符数据与此结构的字符集相同; 这是队列管理器的字符集。 (仅对于 MQMD , CSINHT 具有与 CSQM 相同的含义)。

队列管理器将随消息一起发送的 MQMD 中的此值更改为 MQMD 的实际字符集标识。 如果未发生错误,那么 MQGET 调用不会返回值 CSINHT。

如果 MQMD 中 MDPAT 字段的值为 ATBRKR ,那么不能使用 CSINHT。

CSEMBD
嵌入式字符集标识。

消息中的字符数据位于具有包含在消息数据本身中的标识的字符集中。 可以在消息数据中嵌入任意数量的字符集标识,应用于数据的不同部分。 此值必须用于混合字符集中包含数据的 PCF 消息。 PCF 消息的格式名为 FMPCF。

仅在 MQPUT 和 MQPUT1 调用上指定此值。 如果在 MQGET 调用上指定了此参数,那么将阻止消息转换。

在 MQPUT 和 MQPUT1 调用上,队列管理器会按先前所述更改随消息一起发送的 MQMD 中的值 CSQM 和 CSINHT ,但不会更改 MQPUT 或 MQPUT1 调用上指定的 MQMD。 不会对指定的值执行其他检查。

检索消息的应用程序应该将此字段与应用程序期望的值进行比较; 如果值不同,那么应用程序可能需要转换消息中的字符数据。

如果在 MQGET 调用上指定了 GMCONV 选项,那么此字段是输入/输出字段。 应用程序指定的值是编码字符集标识,必要时应将消息数据转换为该标识。 如果转换成功或不需要,那么值保持不变 (只是将值 CSQM 或 CSINHT 转换为实际值)。 如果转换失败,那么 MQGET 调用后的值表示返回到应用程序的未转换消息的编码字符集标识。

否则,这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的初始值为 CSQM。

MDENC (10 位带符号整数)

消息数据的数字编码。

这指定消息中数字数据的数字编码; 它不适用于 MQMD 结构本身中的数字数据。 数字编码定义用于二进制整数,压缩十进制整数和浮点数的表示。

在 MQPUT 或 MQPUT1 调用上,应用程序必须将此字段设置为适合于数据的值。 队列管理器不会检查该字段是否有效。 定义了以下特殊值:
ENNAT
本机机器编码。

编码是运行应用程序的编程语言和机器的缺省值。

注: 此常量的值取决于编程语言和环境。 因此,必须使用适合于应用程序将在其中运行的环境的头,宏, COPY 或 INCLUDE 文件来编译应用程序。

放置消息的应用程序通常应指定 ENNAT。 检索消息的应用程序应该将此字段与值 ENNAT 进行比较; 如果值不同,那么应用程序可能需要转换消息中的数字数据。 GMCONV 选项可用于请求队列管理器在 MQGET 调用处理过程中转换消息。

如果在 MQGET 调用上指定了 GMCONV 选项,那么此字段是输入/输出字段。 应用程序指定的值是应将消息数据转换为的编码 (如果需要)。 如果转换成功或不必要,那么值保持不变。 如果转换失败,那么 MQGET 调用后的值表示返回到应用程序的未转换消息的编码。

在其他情况下,这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的初始值为 ENNAT。

MDEXP (10 位有符号整数)

消息生存期。

这是由放置消息的应用程序设置的以十分之一秒为单位的时间段。 在此时间段经过之前,尚未从目标队列中移除的消息将变得可被废弃。

该值将递减,以反映消息在目标队列上以及在任何中间传输队列 (如果放置到远程队列) 上所花费的时间。 消息通道代理程序也可以对其进行递减,以反映传输时间 (如果这些时间很重要)。 同样,将此消息转发到另一个队列的应用程序可能会在必要时减小该值 (如果它已保留此消息相当长的时间)。 但是,到期时间被视为近似,并且无需减小该值以反映较小的时间间隔。

当应用程序使用 MQGET 调用检索消息时, MDEXP 字段表示仍保留的原始到期时间量。

在经过消息的到期时间之后,队列管理器将有资格将其废弃。 在当前实现中,当发生浏览或非浏览 MQGET 调用时,如果消息尚未到期,那么将废弃该消息。 例如,将 MQGMO 中的 GMMO 字段设置为 MONONE 从 FIFO 有序队列读取的非浏览 MQGET 调用将导致废弃所有到期消息,直到第一条未到期消息为止。 使用优先级排序队列时,同一调用将废弃优先级较高的到期消息和在第一条未到期消息之前到达队列的优先级相同的消息。

不会将已到期的消息返回到应用程序 (通过浏览或非浏览 MQGET 调用) ,因此成功 MQGET 调用后消息描述符的 MDEXP 字段中的值大于零或特殊值 EIULIM。

如果将消息放在远程队列上,那么在消息到达目标队列之前,消息在中间传输队列上时可能会到期 (并被废弃)。

如果消息指定了其中一个 ROEXP* 报告选项,那么将在废弃到期消息时生成报告。 如果未指定任何这些选项,那么不会生成此类报告; 假定消息在此时间段后不再相关 (可能是因为稍后的消息已取代该消息)。

根据到期时间废弃消息的任何其他程序也必须发送相应的报告消息 (如果已请求)。
注:
  1. 如果将消息放入 MDEXP 时间为零,那么 MQPUT 或 MQPUT1 调用将失败,原因码为 RC2013; ; 在此情况下不会生成报告消息。
  2. 由于具有已经过的到期时间的消息可能直到稍后才实际被废弃,因此队列中可能存在已超过其到期时间的消息,因此这些消息不适合检索。 但是,出于所有目的 (包括深度触发) ,这些消息将计入队列中的消息数。
  3. 如果请求,将在实际废弃消息时生成到期报告,而不是在其符合废弃条件时生成到期报告。
  4. 废弃到期消息以及生成到期报告 (如果请求) 从来不是应用程序工作单元的一部分,即使消息被调度为由于在工作单元中运行的 MQGET 调用而废弃也是如此。
  5. 如果工作单元中的 MQGET 调用检索到接近到期的消息,并且随后回退了该工作单元,那么该消息可能会在可以再次检索之前被废弃。
  6. 如果使用 GMLK 的 MQGET 调用锁定了近乎到期的消息,那么该消息可能会在可由使用 GMMUC 的 MQGET 调用检索之前被废弃; 如果发生此情况,那么会在此后续 MQGET 调用上返回原因码 RC2034 。
  7. 检索到到期时间大于零的请求消息时,应用程序可以在发送应答消息时执行下列其中一项操作:
    • 将剩余到期时间从请求消息复制到应答消息。
    • 将应答消息中的到期时间设置为大于零的显式值。
    • 将应答消息中的到期时间设置为 EIULIM。
    要执行的操作取决于应用程序套件的设计。 但是,将消息放入死信 (undelivered-message) 队列的缺省操作应该是保留消息的剩余到期时间,并继续将其递减。
  8. 触发器消息始终使用 EIULIM 生成。
  9. 具有 MDFMT 名称 FMXQH 的消息 (通常在传输队列上) 在 MQXQH 中具有第二个消息描述符。 因此,它有两个关联的 MDEXP 字段。 在这种情况下,应注意以下补充要点:
    • 当应用程序将消息放在远程队列上时,队列管理器会将消息初始放在本地传输队列上,并以 MQXQH 结构作为应用程序消息数据的前缀。 队列管理器将两个 MDEXP 字段的值设置为与应用程序指定的值相同。

      如果应用程序将消息直接放在本地传输队列上,那么消息数据必须已以 MQXQH 结构开头,并且格式名称必须为 FMXQH (但队列管理器不会强制这样做)。 在这种情况下,应用程序无需将这两个 MDEXP 字段的值设置为相同。 (队列管理器不会检查 MQXQH 中的 MDEXP 字段是否包含有效值,甚至不会检查消息数据是否足以包含该值。)

    • 从队列中检索 MDFMT 名称为 FMXQH 的消息 (无论是正常队列还是传输队列) 时,队列管理器会将 这些 MDEXP 字段与在队列中等待所耗用的时间一起递减。 如果消息数据的长度不足以在 MQXQH 中包含 MDEXP 字段,那么不会发生任何错误。
    • 队列管理器使用单独的消息描述符 (即, MQXQH 结构中嵌入的消息描述符中的字段) 中的 MDEXP 字段来测试消息是否适合废弃。
    • 如果两个 MDEXP 字段的初始值不同,那么在检索消息时,可能会在单独的消息描述符中的 MDEXP 时间大于零 (因此消息不适合废弃) ,而根据 MQXQH 中的 MDEXP 字段的时间已过去。 在这种情况下, MQXQH 中的 MDEXP 字段设置为零。
可识别以下特殊值:
EIULIM
无限生命周期。

消息具有无限的到期时间。

这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的初始值为 EIULIM。

MDFB (10 位有符号整数)

反馈或原因码。

这与类型为 MTRPRT 的消息配合使用以指示报告的性质,并且仅对该类型的消息有意义。 该字段可以包含其中一个 FB* 值或其中一个 RC* 值。 反馈代码分组如下:
FBNONE
未提供反馈。
FBSFST
系统生成的反馈的最小值。
FBSLST
系统生成的反馈的最高值。

系统通过 FBSLST 生成的反馈代码 FBSFST 的范围包括本节 (FB*) 后面列出的一般反馈代码,以及无法将消息放入目标队列时可能发生的原因码 (RC*)。

FBAFST
应用程序生成的反馈的最低值。
FBALST
应用程序生成的反馈的最高值。

生成报告消息的应用程序不应使用系统范围内的反馈代码 (FBQUIT 除外) ,除非它们想要模拟由队列管理器或消息通道代理程序生成的报告消息。

在 MQPUT 或 MQPUT1 调用上,指定的值必须是 FBNONE ,或者在系统范围或应用程序范围内。 无论 MDMT的值是什么,都将选中此选项。

常规反馈代码:
FBCOA
确认到达目标队列 (请参阅 ROCOA)。
FBCOD
确认送达接收申请 (见 ROCOD)。
FBEXP
消息已到期。

由于在到期时间过去之前未将消息从目标队列中除去,因此已废弃该消息。

FBPAN
肯定操作通知 (请参阅 ROPAN)。
FBNAN
否定操作通知 (请参阅 RONAN)。
FBQUIT
应用程序应该结束。

这可由工作负载调度程序用于控制正在运行的应用程序的实例数。 向应用程序的实例发送带有此反馈代码的 MTRPRT 消息,指示该实例应停止处理。 但是,遵守此约定是应用程序的事; 队列管理器不会强制执行此约定。

IMS-bridge 反馈代码: 当 IMS 网桥接收到非零 IMS-OTMA 检测代码时, IMS 网桥会将检测代码从十六进制转换为十进制,添加值 FBIERR (300) ,并将结果放在应答消息的 MDFB 字段中。 当发生 IMS-OTMA 错误时,这将导致反馈代码具有 FBIFST (301) 到 FBILST (399) 范围内的值。

IMS 网桥可以生成以下反馈代码:
FBDLZ
数据长度为零。

消息的应用程序数据中的段长度为零。

FBDLN
数据长度为负数。

消息的应用程序数据中的段长度为负数。

FBDLTB
数据长度太大。

段长度在消息的应用程序数据中过大。

FBBUFO
缓冲区溢出。

其中一个长度字段的值将导致数据溢出消息缓冲区。

FBLOB1
错误长度为 1。

其中一个长度字段的值是一个字节太短。

FBIIH
MQIIH 结构无效或缺失。

MQMD 中的 MDFMT 字段指定 FMIMS,但消息未以有效的 MQIIH 结构开头。

FBNAFI
未授权用户标识在 IMS中使用。

消息描述符 MQMD 中包含的用户标识或 MQIIH 结构中 IIAUT 字段中包含的密码未能通过 IMS 网桥执行的验证。 因此,消息未传递到 IMS

FBIERR
IMS返回了意外错误。

IMS返回了意外错误。 请参阅 IMS 网桥所在系统上的 IBM MQ 错误日志,以获取有关该错误的更多信息。

FBIFST
IMS生成的反馈的最小值。

IMS生成的反馈代码占用 FBIFST (300) 到 FBILST (399) 的范围。 IMS-OTMA 检测代码本身为 MDFB 减去 FBIERR。

FBILST
IMS生成的反馈的最大值。
CICS-bridge 反馈代码: CICS bridge可以生成以下反馈代码:
FBCAAB
应用程序异常终止。

消息中指定的应用程序异常结束。 此反馈代码仅出现在 MQDLH 结构的 DLREA 字段中。

FBCANS
无法启动应用程序。

消息中指定的应用程序的 EXEC CICS LINK 失败。 此反馈代码仅出现在 MQDLH 结构的 DLREA 字段中。

FBCBRF
CICS bridge 异常终止,但未完成正常错误处理。
FBCCSE
字符集标识无效。
FBCIHE
CICS 信息头结构缺失或无效。
FBCCAE
CICS commarea 的长度无效。
FBCCIE
相关标识无效。
FBCDLQ
死信队列不可用。

CICS bridge 任务无法将对此请求的应答复制到死信队列。 请求已回退。

FBCENE
编码无效。
FBCINE
CICS bridge 迂到意外错误。

此反馈代码仅出现在 MQDLH 结构的 DLREA 字段中。

FBCNTA
用户标识未授权或密码无效。

此反馈代码仅出现在 MQDLH 结构的 DLREA 字段中。

FBCUBO
已回退工作单元。
由于下列原因之一,工作单元已回退:
  • 在同一工作单元中处理另一个请求时检测到故障。
  • 工作单元正在进行时发生 CICS 异常终止。
FBCUWE
工作单元控制字段 CIUOW 无效。
MQ 原因码: 对于异常报告消息, MDFB 包含 MQ 原因码。 可能的原因码包括:
RC2051
(2051 , X'803 ') 对队列禁止 Put 调用。
RC2053
(2053 , X'805 ') 队列已包含最大消息数。
RC2035
(2035, X'7F3') 未获得访问授权。
RC2056
(2056 , X'808 ') 磁盘上没有可用于队列的空间。
RC2048
(2048 , X'800 ') 队列不支持持久消息。
RC2031
(2031,X'7EF') 报文长度超过队列管理器的最大值。
RC2030
(2030,X'7EE')报文长度超过队列最大值。

这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的初始值为 FBNONE。

MDFMT (8 字节字符串)

消息数据的格式名。

这是消息发送方可用于向接收方指示消息中数据的性质的名称。 可以为该名称指定队列管理器字符集中的任何字符,但建议将该名称限制为以下内容:
  • 大写 A 到 Z
  • 数字数字 0 到 9
如果使用其他字符,那么可能无法在发送队列管理器和接收队列管理器的字符集之间转换名称。

应在该字段的长度中填充空格,或在该字段结束前使用空字符来终止该名称; 将空字符和任何后续字符视为空格。 不要指定带有前导空格或嵌入空格的名称。 对于 MQGET 调用,队列管理器将使用空白填充的名称返回到字段的长度。

队列管理器不会检查该名称是否符合先前描述的建议。

以大写,小写和混合大小写开头的名称具有队列管理器定义的含义; 您不应将以这些字母开头的名称用于自己的格式。 队列管理器内置格式为:
FMNONE
无格式名称。

未定义数据的性质。 这意味着使用 GMCONV 选项从队列中检索消息时无法转换数据。

如果在 MQGET 调用上指定了 GMCONV ,并且消息中数据的字符集或编码与 MSGDSC 参数中指定的字符集或编码不同,那么将返回带有以下完成代码和原因码的消息 (假定没有其他错误):
  • 完成代码 CCWARN 和原因码 RC2110 (如果 FMNONE 数据位于消息的开头)。
  • 完成代码 CCOK 和原因码 RCNONE (如果 FMNONE 数据位于消息末尾 (即,前面有一个或多个 MQ 头结构))。 在这种情况下,会将 MQ 头结构转换为请求的字符集和编码。
FMADMN
命令服务器请求/应答消息。

该消息是可编程命令格式 (PCF) 的命令-服务器请求或应答消息。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。 有关使用可编程命令格式消息的更多信息,请参阅 使用可编程命令格式

FMCICS
CICS 信息头。

消息数据以 CICS 信息头 MQCIH 开头,后跟应用程序数据。 应用程序数据的格式名称由 MQCIH 结构中的 CIFMT 字段提供。

FMCMD1
输入 1 命令应答消息。

此消息是包含对象计数,完成代码和原因码的 MQSC 命令服务器应答消息。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

FMCMD2
输入 2 命令应答消息。

该消息是 MQSC 命令服务器应答消息,其中包含有关所请求对象的信息。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

FMDLH
死信头。

消息数据以死信头 MQDLH 开头。 原始消息中的数据紧跟 MQDLH 结构。 原始消息数据的格式名称由 MQDLH 结构中的 DLFMT 字段提供; 请参阅 IBM i 上的 MQDLH (死信头) 以获取此结构的详细信息。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

对于具有 FMDLH MDFMT 的消息,不会生成 COA 和 COD 报告。

FMDH
分发列表标题。

消息数据以 distribution-list 头 MQDH 开头; 这包括 MQOR 和 MQPMR 记录的数组。 分发列表头后面可跟有其他数据。 附加数据 (如果有) 的格式由 MQDH 结构中的 DHFMT 字段提供; 请参阅 IBM i 上的 MQDH (分发头) 以获取此结构的详细信息。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换格式为 FMDH 的消息。

FMEVNT
事件消息。

此消息是报告发生的事件的 MQ 事件消息。 事件消息具有与可编程命令相同的结构; 有关此结构的更多信息,请参阅 命令和响应的结构。 有关事件的信息,请参阅 事件监视

如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换 Version-1 事件消息。

FMIMS
IMS 信息头。

消息数据以 IMS 信息头 MQIIH 开头,后跟应用程序数据。 应用程序数据的格式名称由 MQIIH 结构中的 IIFMT 字段提供。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

FMIMVS
IMS 变量字符串。
消息是 IMS 变量字符串,它是格式为 llzzccc的字符串,其中:
ll
是一个 2 字节长度字段,用于指定 IMS 变量字符串项的总长度。 此长度等于 ll (2 字节) 的长度加上 zz (2 字节) 的长度加上字符串本身的长度。 ll 是由 MDENC 字段指定的编码中的 2 字节二进制整数。
zz
是包含对 IMS重要的标志的 2 字节字段。 zz 是由两个 1 字节的位字符串字段组成的字节字符串,传输时不会更改从发送方到接收方 (即, zz 不受任何转换限制)。
ccc
是包含 ll-4 个字符的变长字符串。 ccc 位于 MDCSI 字段指定的字符集中。

如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

FMMDE
消息描述符扩展。

消息数据以消息描述符扩展 MQMDE 开头,并且可以选择后跟其他数据 (通常是应用程序消息数据)。 MQMDE 之后的数据的格式名称,字符集和编码由 MQMDE 中的 MEFMTMECSIMEENC 字段提供。 请参阅 IBM i 上的 MQMDE (消息描述符扩展) 以获取此结构的详细信息。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

FMPCF
可编程命令格式 (PCF) 的用户定义消息。

该消息是符合可编程命令格式 (PCF) 消息的结构的用户定义的消息。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。 有关使用可编程命令格式消息的更多信息,请参阅 使用可编程命令格式

FMRMH
参考消息头。

消息数据以参考消息头 MQRMH 开头,并且可以选择后跟其他数据。 数据的格式名称,字符集和编码由 MQRMH 中的 RMFMTRMCSIRMENC 字段提供。 请参阅 IBM i 上的 MQRMH (参考消息头) 以获取此结构的详细信息。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

FMRFH
规则和格式化头。

消息数据以规则和格式化头 MQRFH 开头,并且可以选择后跟其他数据。 数据的格式名称,字符集和编码 (如果有) 由 MQRFH 中的 RFFMTRFCSIRFENC 字段提供。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

FMRFH2
规则和格式化头版本 2。

消息数据以 version-2 规则和格式化头 MQRFH2开头,并且可以选择后跟其他数据。 可选数据 (如果有) 的格式名称,字符集和编码由 MQRFH2中的 RF2FMTRF2CSIRF2ENC 字段提供。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

FMSTR
完全由字符组成的消息。

应用程序消息数据可以是 SBCS 字符串 (单字节字符集) 或 DBCS 字符串 (双字节字符集)。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

FMTM
触发消息。

该消息是 MQTM 结构所描述的触发器消息; 请参阅 MQTM-Trigger 消息 以获取此结构的详细信息。 如果在 MQGET 调用上指定了 GMCONV 选项,那么可以转换此格式的消息。

FMWIH
工作信息标题。

消息数据以工作信息头 MQWIH 开头,后跟应用程序数据。 应用程序数据的格式名称由 MQWIH 结构中的 WIFMT 字段提供。

FMXQH
传输队列头。

消息数据以传输队列头 MQXQH 开头。 原始消息中的数据紧跟 MQXQH 结构。 原始消息数据的格式名称由 MQMD 结构中的 MDFMT 字段提供,该 MQMD 结构是传输队列头 MQXQH 的一部分。 请参阅 IBM i 上的 MQXQH (传输队列头) 以获取此结构的详细信息。

对于 MDFMT 为 FMXQH 的消息,不会生成 COA 和 COD 报告。

这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的长度由 LNFMT 给出。 此字段的初始值为 FMNONE。

MDGID (24 字节位字符串)

组标识。

这是一个字节字符串,用于标识物理消息所属的特定消息组或逻辑消息。 如果消息允许分段,那么也会使用 MDGID 。 在所有这些情况下, MDGID 都具有非空值,并且在 MDMFL 字段中设置了以下一个或多个标志:
  • MF联格观察团
  • MFL联格观察团
  • MFSEG
  • MFLSEG
  • MFSEGA
如果未设置任何这些标志,那么 MDGID 具有特殊的空值 GINONE。
在以下情况下,应用程序无需在 MQPUT 或 MQGET 调用上设置此字段:
  • 在 MQPUT 调用上,指定了 PMLOGO。
  • 在 MQGET 调用上,未指定 MOGRPI。
请考虑将这些调用用于非报告消息的消息。 但是,如果应用程序需要更多控制,或者调用为 MQPUT1,那么应用程序必须确保将 MDGID 设置为适当的值。
仅当组标识唯一时,才能正确处理消息组和段。 因此, 应用程序不应生成其自己的组标识 ; 相反,应用程序应执行下列其中一项操作:
  • 如果指定了 PMLOGO ,那么队列管理器会自动为逻辑消息的组或段中的第一条消息生成唯一的组标识,并将该组标识用于逻辑消息的组或段中的其余消息,因此应用程序不需要执行任何特殊操作。 请考虑使用此过程。
  • 如果未指定 PMLOGO ,那么应用程序应通过在逻辑消息的组或段中的消息的第一个 MQPUT 或 MQPUT1 调用上将 MDGID 设置为 GINONE 来请求队列管理器生成组标识。 然后,队列管理器在该调用的输出上返回的组标识应该用于逻辑消息的组或段中的其余消息。 如果消息组包含分段消息,那么必须将同一组标识用于该组中的所有分段和消息。

    如果未指定 PMLOGO ,那么可以按任何顺序 (例如,按相反顺序) 放置逻辑消息的组和段中的消息,但是必须由针对其中任何消息发出的 first MQPUT 或 MQPUT1 调用分配组标识。

在 MQPUT 和 MQPUT1 调用的输入上,队列管理器使用 PMOPT中详细描述的值。 在 MQPUT 和 MQPUT1 调用的输出上,如果打开的对象是单个队列而不是分发列表,但如果打开的对象是分发列表,那么队列管理器会将此字段设置为随消息一起发送的值。 在后一种情况下,如果应用程序需要知道生成的组标识,那么应用程序必须提供包含 PRGID 字段的 MQPMR 记录。

在 MQGET 调用的输入中,队列管理器使用 表 1中详细描述的值。 在 MQGET 调用的输出上,队列管理器将此字段设置为检索到的消息的值。

定义了以下特殊值:
GINONE
未指定组标识。

对于字段的长度,该值为二进制零。 这是用于不在组中,不在逻辑消息段中且不允许分段的消息的值。

此字段的长度由 LNGID 给出。 此字段的初始值为 GINONE。 如果 MDVER 小于 MDVER2,那么将忽略此字段。

MDMFL (10 位带符号整数)

消息标志。

这些标志指定消息的属性或控制其处理。 这些标志分为以下类别:
  • 分段标志
  • 状态标志
这些都是反过来描述的。

分段标志: 当消息对于队列过大时,将消息放入队列的尝试通常会失败。 分段是一种技术,通过此技术,队列管理器或应用程序将消息分割为称为段的小块,并将队列上的每个段作为单独的物理消息放置。 检索消息的应用程序可以逐个检索段,也可以请求队列管理器将段重新组合到 MQGET 调用返回的单个消息中。 后者是通过在 MQGET 调用上指定 GMCMPM 选项并提供足以容纳完整消息的缓冲区来实现的。 (请参阅 IBM i 上的 MQGMO (Get-message 选项) 以获取 GMCMPM 选项的详细信息。) 消息的分段可以在发送队列管理器,中间队列管理器或目标队列管理器上发生。

您可以指定下列其中一项以控制消息的分段:
MFSEGI
已禁止分段。

此选项可防止队列管理器将消息分解成段。 如果为已经是分段的消息指定了此选项,那么此选项将防止分段分解为较小的分段。

此标志的值为二进制零。 这是缺省值。

MFSEGA
允许分段。

此选项允许队列管理器将消息分为多个段。 如果为已经是段的消息指定了此选项,那么此选项允许将段细分为更小的段。 可以在不设置 MFSEG 或 MFLSEG 的情况下设置 MFSEGA。

当队列管理器对消息进行分段时,队列管理器会在随每个分段一起发送的 MQMD 副本中打开 MFSEG 标志,但不会更改应用程序在 MQPUT 或 MQPUT1 调用上提供的 MQMD 中这些标志的设置。 对于逻辑消息中的最后一个段,队列管理器还会在随该段一起发送的 MQMD 中打开 MFLSEG 标志。

注: 在使用 MFSEGA 但没有 PMLOGO 的情况下放入消息时,需要小心。 如果消息为:
  • 不是客户细分,
  • 不在一个组中,
  • 未转发,
应用程序必须记住在 每个 MQPUT 或 MQPUT1 调用之前将 MDGID 字段重置为 GINONE ,以便使队列管理器为每条消息生成唯一的组标识。 如果未执行此操作,那么不相关的消息可能会无意中以相同的组标识结束,这可能会导致后续处理不正确。 有关何时必须重置 MDGID 字段的更多信息,请参阅 MDGID 字段和 PMLOGO 选项的描述。
队列管理器根据需要将消息分割成段,以确保段 (以及可能需要的任何头数据) 适合队列。 但是,队列管理器生成的段的大小有一个下限,并且只有从消息创建的最后一个段才能小于此限制。 (应用程序生成的段大小的下限为一个字节。) 队列管理器生成的段的长度可能不相等。 队列管理器按如下所示处理消息:
  • 用户定义的格式在边界上拆分,边界是 16 个字节的倍数。 这意味着队列管理器不会生成小于 16 字节的段 (最后一个段除外)。
  • 除 FMSTR 以外的内置格式在适合于现有数据的性质的点处进行拆分。 但是,队列管理器从不在 MQ 头结构中间拆分消息。 这意味着包含单个 MQ 头结构的段不能由队列管理器进一步拆分,因此该消息的最小可能段大小大于 16 字节。
    队列管理器生成的第二个或更高版本段将以下列其中一个开头:
    • MQ 头结构
    • 应用程序消息数据的开始
    • 通过应用程序消息数据的部分方法
  • FMSTR 是分开的,而不考虑存在的数据 (SBCS , DBCS 或混合 SBCS/DBCS) 的性质。 当字符串是 DBCS 或混合 SBCS/DBCS 时,这可能导致段不能从一个字符集转换为另一个字符集。 队列管理器从不将 FMSTR 消息分割为小于 16 字节的段 (最后一个段除外)。
  • 每个段的 MQMD 中的 MDFMTMDCSIMDENC 字段由队列管理器设置,以正确描述段的 start 处存在的数据; 格式名称将是内置格式的名称或用户定义的格式的名称。
  • 修改 MDOFF 大于零的段的 MQMD 中的 MDREP 字段,如下所示:
    • 对于每种报告类型,如果报告选项为 RO* D ,但分段不能包含前 100 个字节的任何用户数据 (即,可能存在的任何 MQ 头结构之后的数据) ,那么报告选项将更改为 RO*。
队列管理器遵循先前的规则,但以其他方式无法预测地拆分消息; 请勿假定消息在何处拆分
对于 持久 消息,队列管理器只能在工作单元中执行分段:
  • 如果 MQPUT 或 MQPUT1 调用在用户定义的工作单元中运行,那么将使用该工作单元。 如果调用在分段过程中失败,那么队列管理器将除去由于调用失败而放置在队列上的任何段。 但是,该故障不会阻止成功落实工作单元。
  • 如果调用在用户定义的工作单元外部运行,并且不存在用户定义的工作单元,那么队列管理器仅在调用期间创建工作单元。 如果调用成功,那么队列管理器将自动落实工作单元 (应用程序不需要执行此操作)。 如果调用失败,那么队列管理器将回退工作单元。
  • 如果调用在用户定义的工作单元外部运行,但用户定义的工作单元 存在 ,那么队列管理器无法执行分段。 如果消息不需要分段,那么调用仍可成功。 但是,如果消息 确实 需要分段,那么调用将失败,原因码为 RC2255。

对于 非持久 消息,队列管理器不需要工作单元即可执行分段。

必须特别考虑可能分段的消息的数据转换:
  • 如果数据转换仅由 MQGET 调用上的接收应用程序执行,并且应用程序指定了 GMCMPM 选项,那么数据转换出口将传递完整的消息以供出口转换,并且该消息已分段的事实对该出口不会很明显。
  • 如果接收应用程序一次检索一个段,那么将调用数据转换出口以一次转换一个段。 因此,出口必须能够独立于任何其他段中的数据转换段中的数据。

    如果消息中数据的性质使得 16 字节边界上的数据的任意分段可能导致无法由出口转换的段,或者格式为 FMSTR 且字符集为 DBCS 或混合 SBCS/DBCS ,那么发送应用程序应自行创建并放置这些段,指定 MFSEGI 以禁止进一步分段。 这样,发送应用程序可以确保每个分段包含足够的信息,以允许数据转换出口成功转换分段。

  • 如果为发送消息通道代理程序 (MCA) 指定了发送方转换,那么 MCA 仅转换不是逻辑消息段的消息; MCA 从不尝试转换属于段的消息。

此标志是 MQPUT 和 MQPUT1 调用上的输入标志,以及 MQGET 调用上的输出标志。 在后一个调用中,队列管理器还会将该标志的值回传到 MQGMO 中的 GMSEG 字段。

此标志的初始值为 MFSEGI。

状态标志: 这些标志指示物理消息是属于消息组,是逻辑消息的段,两者都是,还是两者都不是。 可以在 MQPUT 或 MQPUT1 调用上指定以下一项或多项,也可以由 MQGET 调用返回:
MF联格观察团
消息是组的成员。
MFL联格观察团
消息是组中的最后一条逻辑消息。

如果设置了此标志,那么队列管理器将在随消息一起发送的 MQMD 副本中打开MF联格,但不会在 MQPUT 或 MQPUT1 调用上的应用程序提供的 MQMD 中更改这些标志的设置。

组仅由一条逻辑消息组成是有效的。 如果是这种情况,那么将设置MFL联格,但 MDSEQ 字段具有值 1。

MFSEG
消息是逻辑消息的段。

当指定 MFSEG 而不指定 MFLSEG 时,段中应用程序消息数据的长度 ( 不包括 可能存在的任何 MQ 头结构的长度) 必须至少为 1。 如果长度为零,那么 MQPUT 或 MQPUT1 调用将失败,原因码为 RC2253。

MFLSEG
消息是逻辑消息的最后一个段。

如果设置了此标志,那么队列管理器将在随消息一起发送的 MQMD 副本中打开 MFSEG ,但不会更改应用程序在 MQPUT 或 MQPUT1 调用上提供的 MQMD 中这些标志的设置。

对于仅由一个段组成的逻辑消息,它是有效的。 如果是这种情况,那么将设置 MFLSEG ,但 MDOFF 字段的值为零。

当指定 MFLSEG 时,允许段中应用程序消息数据的长度 ( 不包括 可能存在的任何头结构的长度) 为零。

应用程序必须确保在放置消息时正确设置这些标志。 如果指定了 PMLOGO ,或者在队列句柄的先前 MQPUT 调用上指定了 PMLOGO ,那么标志的设置必须与队列管理器为队列句柄保留的组和段信息一致。 当指定 PMLOGO 时,以下条件适用于队列句柄的 连续 MQPUT 调用:
  • 如果没有当前组或逻辑消息,那么所有这些标志 (及其组合) 都有效。
  • 一旦指定了MF联格观察团,它就必须保持开启状态,直到指定了MFL联格观察团。 如果不满足此条件,那么调用将失败,原因码为 RC2241 。
  • 一旦指定了 MFSEG ,它必须保持开启状态,直到指定了 MFLSEG。 如果未满足此条件,那么调用将失败,原因码为 RC2242 。
  • 在没有MF联格观察团的情况下指定 MFSEG 后, MFMIG 必须保持 关闭 状态,直到指定 MFLSEG 为止。 如果未满足此条件,那么调用将失败,原因码为 RC2242 。
表 1 显示标志的有效组合以及用于各种字段的值。

这些标志是 MQPUT 和 MQPUT1 调用上的输入标志,以及 MQGET 调用上的输出标志。 在后一个调用中,队列管理器还会将标志的值回传到 MQGMO 中的 GMGSTGMSST 字段。

缺省标志: 可以指定以下内容以指示消息具有缺省属性:
MFNONE
无消息标志 (缺省消息属性)。

这将禁止分段,并指示消息不在组中并且不是逻辑消息的段。 MFNONE 定义为帮助程序文档。 不打算将此标志与任何其他标志一起使用,但由于其值为零,因此无法检测到此类使用。

MDMFL 字段将分区到子字段中; 有关详细信息,请参阅 IBM i上的报告选项和消息标志

此字段的初始值为 MFNONE。 如果 MDVER 小于 MDVER2,那么将忽略此字段。

MDMID (24 字节位字符串)

消息标识。

这是用于区分一条消息和另一条消息的字节字符串。 通常,任何两条消息都不应具有相同的消息标识,尽管队列管理器不允许这样做。 消息标识是消息的永久属性,并且在队列管理器重新启动时持久存在。 由于消息标识是字节字符串而不是字符串,因此当消息从一个队列管理器流向另一个队列管理器时,不会在字符集之间转换消息标识。

对于 MQPUT 和 MQPUT1 调用,如果应用程序指定了 MINONE 或 PMNMID ,那么队列管理器将在放入消息时生成唯一消息标识 1 ,并将其放入随消息一起发送的消息描述符中。 队列管理器还在属于发送应用程序的消息描述符中返回此消息标识。 应用程序可以使用此值来记录有关特定消息的信息,以及响应来自应用程序其他部分的查询。

如果将消息放入主题中,那么队列管理器将根据发布的每条消息的需要生成唯一的消息标识。 如果应用程序指定了 PMNMID ,那么队列管理器将生成唯一消息标识以在输出时返回。 如果应用程序指定了 MINONE ,那么 MQMD 中 MDMID 字段的值在从调用返回时保持不变。

请参阅 PMOPT 中 PMRET 的描述,以获取有关保留发布的更多详细信息。

如果将消息放入分发列表,那么队列管理器会根据需要生成唯一消息标识,但 MQMD 中 MDMID 字段的值在从调用返回时保持不变,即使指定了 MINONE 或 PMNMID 也是如此。 如果应用程序需要知道队列管理器生成的消息标识,那么应用程序必须提供包含 PRMID 字段的 MQPMR 记录。

发送应用程序还可以为除 MINONE 以外的消息标识指定特定值; 这将停止队列管理器生成唯一的消息标识。 转发消息的应用程序可以使用此工具来传播原始消息的消息标识。

队列管理器本身不使用此字段,除非:
  • 生成唯一值 (如果请求) ,如先前所述
  • 向发出消息获取请求的应用程序交付值
  • 将该值复制到它生成的关于此消息的任何报告消息的 MDCID 字段 (取决于 MDREP 选项)

当队列管理器或消息通道代理程序生成报告消息时,它将以原始消息的 MDREP 字段 (RONMI 或 ROPMI) 指定的方式设置 MDMID 字段。 生成报告消息的应用程序也应该执行此操作。

对于 MQGET 调用, MDMID 是可用于选择要从队列中检索的特定消息的五个字段之一。 通常, MQGET 调用会返回队列中的下一条消息,但如果需要特定消息,那么可以通过指定五个选择标准中的一个或多个 (任意组合) 来获取此消息; 这些字段为:
  • MDMID
  • MDCID
  • MDGID
  • MDSEQ
  • MDOFF
应用程序将其中一个或多个字段设置为必需值,然后在 MQGMO 的 GMMO 字段中设置相应的 MO* 匹配选项,以指示应将这些字段用作选择标准。 只有在这些字段中具有指定值的消息才是要检索的候选项。 GMMO 字段 (如果未被应用程序改变) 的缺省值是同时匹配消息标识和相关标识。

通常,返回的消息是队列上满足选择条件的 第一条 消息。 但是,如果指定了 GMBRWN ,那么返回的消息将是满足选择标准的 下一条 消息; 此消息的扫描将从消息 跟在 当前光标位置之后开始。

注: 对于满足选择标准的消息,将按顺序扫描队列,因此检索时间将比未指定选择标准时要慢,尤其是如果在找到合适的消息之前必须扫描许多消息。

有关如何在各种情况下使用选择标准的更多信息,请参阅 表 1

指定 MINONE 作为消息标识与不指定 MOMSGI 具有相同的效果,即,任何消息标识都将匹配。

如果在 MQGET 调用的 GMO 参数中指定了 GMMUC 选项,那么将忽略此字段。

从 MQGET 调用返回时, MDMID 字段将设置为返回的消息的消息标识 (如果有)。

可以使用以下特殊值:
MINONE
未指定消息标识。

对于字段的长度,该值为二进制零。

这是 MQGET , MQPUT 和 MQPUT1 调用的输入/输出字段。 此字段的长度由 LNMID 给出。 此字段的初始值为 MINONE。

MDMT (10 位有符号整数)

消息类型。

这指示消息的类型。 消息类型分组如下:
MTSFST
系统定义的消息类型的最小值。
MTSLST
系统定义的消息类型的最大值。
当前在系统范围内定义了以下值:
MTDGRM
消息不需要应答。

消息是不需要应答的消息。

地铁 QST
需要应答的消息。

消息是需要应答的消息。

必须在 MDRQ 字段中指定应答应发送到的队列的名称。 MDREP 字段指示如何设置应答的 MDMIDMDCID

中期计划
回复先前的请求消息。

该消息是对先前请求消息 (MTRQST) 的应答。 应将消息发送至请求消息的 MDRQ 字段所指示的队列。 应该使用请求的 MDREP 字段来控制如何设置应答的 MDMIDMDCID

注: 队列管理器不会强制实施请求/应答关系; 这是应用程序的责任。
中期审查
报告消息。

该消息正在报告某些预期或意外情况,通常与其他消息相关 (例如,接收到包含无效数据的请求消息)。 应将消息发送到原始消息的消息描述符的 MDRQ 字段所指示的队列。 应设置 MDFB 字段以指示报告的性质。 原始消息的 MDREP 字段可用于控制应该如何设置报告消息的 MDMIDMDCID

队列管理器或消息通道代理程序生成的报告消息始终发送到 MDRQ 队列,并且如前所述设置了 MDFBMDCID 字段。

系统范围内的其他值可以在 MQI 的未来版本中定义,并且 MQPUT 和 MQPUT1 调用会接受这些值而不会发生错误。

还可以使用应用程序定义的值。 它们必须在以下范围内:
MTAFST
应用程序定义的消息类型的最小值。
MTALST
应用程序定义的消息类型的最大值。

对于 MQPUT 和 MQPUT1 调用, MDMT 值必须在系统定义的范围或应用程序定义的范围内; 否则,调用将失败,原因码为 RC2029。

这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的初始值为 MTDGRM。

MDOFF (10 位带符号整数)

物理消息中的数据与逻辑消息开头的偏移量。

这是物理消息中数据从数据构成部分的逻辑消息开始的偏移量 (以字节为单位)。 此数据称为 。 偏移量在 0 到 999 999 999 999 之间。 非逻辑消息段的物理消息的偏移量为零。

在以下情况下,应用程序无需在 MQPUT 或 MQGET 调用上设置此字段:
  • 在 MQPUT 调用上,指定了 PMLOGO。
  • 在 MQGET 调用上,未指定 MOOFFS。
这些是对非报告消息的消息使用这些调用的建议方法。 但是,如果应用程序不符合这些条件,或者调用为 MQPUT1,那么应用程序必须确保将 MDOFF 设置为相应的值。
在 MQPUT 和 MQPUT1 调用的输入上,队列管理器使用 表 1中详细描述的值。 在 MQPUT 和 MQPUT1 调用的输出上,队列管理器将此字段设置为随消息一起发送的值。

对于报告逻辑消息段的报告消息, MDOLN 字段 (如果不是 OLUNDF) 用于更新队列管理器保留的段信息中的偏移量。

在 MQGET 调用的输入中,队列管理器使用 表 1中详细描述的值。 在 MQGET 调用的输出上,队列管理器将此字段设置为检索到的消息的值。

此字段的初始值为零。 如果 MDVER 小于 MDVER2,那么将忽略此字段。

MDOLN (10 位有符号整数)

原始消息的长度。

此字段仅与作为段的报告消息相关。 它指定与报告消息相关的消息段的长度; 它不指定段构成部分的逻辑消息的长度,也不指定报告消息中数据的长度。

注: 为作为段的消息生成报告消息时,队列管理器和消息通道代理程序会将原始消息中的 MDGIDMDSEQMDOFFMDMFL字段复制到报告消息的 MQMD 中。 因此,报告消息也是一个分段。 建议生成报告消息的应用程序执行相同的操作,并确保正确设置 MDOLN 字段。
定义了以下特殊值:
奥罗达夫
未定义消息的原始长度。
MDOLN 是 MQPUT 和 MQPUT1 调用上的输入字段,但仅在特定情况下才接受应用程序提供的值:
  • 如果要放入的消息是段并且也是报告消息,那么队列管理器将接受指定的值。 该值必须为:
    • 如果分段不是最后一个分段,那么大于零
    • 如果分段是最后一个分段,那么不小于 0
    • 不小于消息中存在的数据长度
    如果不满足这些条件,那么调用将失败,原因码为 RC2252。
  • 如果要放入的消息是段而不是报告消息,那么队列管理器将忽略该字段并改为使用应用程序消息数据的长度。
  • 在所有其他情况下,队列管理器将忽略该字段并改为使用值 OLUNDF。

这是 MQGET 调用上的输出字段。

此字段的初始值为 OLUNDF。 如果 MDVER 小于 MDVER2,那么将忽略此字段。

MDPAN (28 字节字符串)

放置消息的应用程序的名称。

这是消息的 源上下文 的一部分。 有关消息上下文的更多信息,请参阅 消息上下文控制上下文信息

MDPAN 的格式取决于 MDPAT的值。

当此字段由队列管理器 (即,对于除 PMSETA 以外的所有选项) 设置时,它将设置为由环境确定的值:
  • z/OS上,队列管理器使用:
    • 对于 z/OS 批处理,来自 JES JOB 卡的 8 字符作业名
    • 对于 TSO ,这是 7 字符的 TSO 用户标识
    • 对于 CICS, 8 字符 applid ,后跟 4 字符 tranid
    • 对于 IMS,这是 8-character IMS 系统标识,后跟 8-character PSB 名称
    • 对于 XCF ,这是 8 字符的 XCF 组名,后跟 16 字符的 XCF 成员名
    • 对于队列管理器生成的消息,队列管理器名称的前 28 个字符
    • 对于没有 CICS的分布式排队,通道启动程序的 8 字符作业名后跟放入死信队列的模块的 8 字符名称,后跟 8 字符任务标识。
    • 对于使用 IBM MQ for z/OSUNIX System Services 环境创建的地址空间的 8 字符作业名的 MQSeries® Java 语言绑定处理。 通常,这将是追加了单个数字字符的 TSO 用户标识。
    名称和字段的其余部分中的任何空格一样,每个名称都用空格填充在右边。 如果有多个名称,那么它们之间没有分隔符。
  • 在 PC DOS 和 Windows 系统上,队列管理器使用:
    • 对于 CICS 应用程序, CICS 事务名称
    • 对于非CICS 应用程序,可执行文件的标准名称的最右边 28 个字符
  • IBM i上,队列管理器使用标准作业名。
  • HP Integrity NonStop Server上,队列管理器使用: 可执行文件的标准名称的最右边 28 个字符 (如果此名称可供队列管理器使用) ,否则为空白
  • UNIX上,队列管理器使用:
    • 对于 CICS 应用程序, CICS 事务名称
    • 对于非CICS 应用程序,这是可执行文件的标准名称的最右边 14 个字符 (如果此名称可供队列管理器使用) ,否则为空白 (例如,在 AIX 上)
  • 在 VSE/ESA上,队列管理器使用 8 字符 applid ,后跟 4 字符 tranid。

对于 MQPUT 和 MQPUT1 调用,如果在 PMO 参数中指定了 PMSETA ,那么这是输入/输出字段。 将废弃字段中空字符后面的任何信息。 队列管理器将空字符和任何后续字符转换为空白。 如果未指定 PMSETA ,那么此字段将在输入时被忽略,并且是仅输出字段。

这是 MQGET 调用的输出字段。 此字段的长度由 LNPAN 给出。 此字段的初始值为 28 个空白字符。

MDPAT (10 位有符号整数)

放置消息的应用程序的类型。

这是消息的 源上下文 的一部分。 有关消息上下文的更多信息,请参阅 消息上下文控制上下文信息

MDPAT 可能具有下列其中一种标准类型。 也可以使用用户定义的类型,但应限制为通过 ATULST 的 ATUFST 范围内的值。
ATAIX
AIX 应用程序 (与 ATUNIX的值相同)。
ATBRKR
代理。
ATCICS
CICS 事务。
ATCICB
CICS bridge.
ATVSE
CICS/VSE 事务。
ATDOS
PC DOS 上的 IBM MQ MQI client 应用程序。
ATDQM
分布式队列管理器代理程序。
ATGUAR
"同步守护程序" 应用程序 (与 ATNSK 的值相同)。
ATIMS
IMS 应用程序。
ATIMSB
IMS 网桥。
ATJAVA
Java.
ATMVS
MVS 或 TSO 应用程序 (与 ATZOS 值相同)。
ATNOTE
Lotus Notes 代理程序应用程序。
ATNSK
串联 NonStop 内核应用程序。
AT390
OS/390® 应用程序 (与 ATZOS 值相同)。
AT400
IBM i 应用程序。
ATQM
队列管理器。
ATUNIX
UNIX 应用程序。
ATVOS
Stratus VOS 应用程序。
ATWIN
16 位 Windows 应用程序。
ATWINT
32 位 Windows 应用程序。
ATXCF
XCF。
ATZOS
z/OS 应用程序。
ATDEF
缺省应用程序类型。

这是运行应用程序的平台的缺省应用程序类型。

注: 此常量的值特定于环境。
ATUNK
未知应用程序类型。

此值可用于指示应用程序类型未知,即使存在其他上下文信息也是如此。

ATUFST
用户定义的应用程序类型的最小值。
ATULST
用户定义的应用程序类型的最大值。
还可能出现以下特殊值:
ATNCON
消息中不存在上下文信息。

此值由队列管理器在放入没有上下文的消息时设置 (即,指定了 PMNOC 上下文选项)。

检索消息时,可以针对此值测试 MDPAT 以确定消息是否具有上下文 (如果任何其他上下文字段为非空白,那么建议应用程序使用 PMSETA 将 MDPAT 从不设置为 ATNCON)。

ATSIB
指示消息源自另一个 IBM MQ 消息传递产品,并通过 SIB (服务 Integration Bus) 网桥到达。

当队列管理器作为应用程序 put 的结果生成此信息时,该字段将设置为由环境确定的值。 请注意,在 IBM i上,它设置为 AT400; 队列管理器从不在 IBM i上使用 ATCICS

对于 MQPUT 和 MQPUT1 调用,如果在 PMO 参数中指定了 PMSETA ,那么这是输入/输出字段。 如果未指定 PMSETA ,那么此字段将在输入时被忽略,并且是仅输出字段。

成功完成 MQPUT 或 MQPUT1 调用后,此字段包含随消息一起传输的 MDPAT (如果将其放入队列)。 这将是保留消息时随消息一起保留的 MDPAT 的值 (请参阅 PMRET 描述以获取有关保留发布的更多详细信息) ,但在将消息作为发布发送给订户时不用作 MDPAT ,因为它们提供了一个值以覆盖发送给订户的所有发布中的 MDPAT 。 如果消息没有上下文,那么该字段将设置为 ATNCON。

这是 MQGET 调用的输出字段。 此字段的初始值为 ATNCON。

MDPD (8 字节字符串)

放入消息的日期。

这是消息的 源上下文 的一部分。 有关消息上下文的更多信息,请参阅 消息上下文控制上下文信息

队列管理器生成此字段的日期所使用的格式为:
  • YYYYMMDD
其中字符表示:
YYYY
年 (四位数字)
MM
年月 (01 至 12)
DD
月日 (01 到 31)

格林威治标准时间 (GMT) 用于 MDPDMDPT 字段,前提是系统时钟精确设置为 GMT。

如果将消息作为工作单元的一部分放入,那么日期是放入消息的时间,而不是落实工作单元的日期。

对于 MQPUT 和 MQPUT1 调用,如果在 PMO 参数中指定了 PMSETA ,那么这是输入/输出字段。 队列管理器不会检查该字段的内容,只是会废弃该字段中空字符之后的任何信息。 队列管理器将空字符和任何后续字符转换为空白。 如果未指定 PMSETA ,那么此字段将在输入时被忽略,并且是仅输出字段。

成功完成 MQPUT 或 MQPUT1 调用后,此字段包含随消息一起传输的 MDPD (如果将其放入队列)。 这将是保留消息时随消息一起保留的 MDPD 的值 (请参阅 PMRET 描述以获取有关保留发布的更多详细信息) ,但在将消息作为发布发送给订户时不用作 MDPD ,因为它们提供了一个值以覆盖发送给订户的所有发布中的 MDPD 。 如果消息没有上下文,那么该字段完全为空白。

这是 MQGET 调用的输出字段。 此字段的长度由 LNPDAT 给出。 此字段的初始值为 8 个空白字符。

MDPER (10 位带符号整数)

消息持久性。

这指示消息是否在队列管理器的系统故障和重新启动后仍然存在。 对于 MQPUT 和 MQPUT1 调用,该值必须是下列其中一项:
PEPER
消息是持久消息。

这意味着消息在系统故障和队列管理器重新启动后仍然存在。 一旦放入消息,并且 putter 的工作单元已落实 (如果将消息作为工作单元的一部分放入) ,那么该消息将保留在辅助存储器上。 在从队列中除去消息并落实 getter 方法的工作单元 (如果将消息作为工作单元的一部分进行检索) 之前,它将保留在此位置。

将持久消息发送到远程队列时,将使用存储转发机制在路由到目标的每个队列管理器上保存消息,直到已知消息已到达下一个队列管理器为止。

无法将持久消息放在以下位置:
  • 临时动态队列数
  • 耦合设施结构级别小于 3 或耦合设施结构不可恢复的共享队列。
持久消息可以放置在永久动态队列,预定义队列和共享队列上,其中耦合设施结构级别为 3 ,并且耦合设施可恢复。
彭珀尔
消息不是持久消息。

这意味着消息通常不会在系统故障或队列管理器重新启动后继续存在。 即使在重新启动队列管理器期间在辅助存储器上找到消息的完整副本,这也适用。

在共享队列的特殊情况下,非持久消息 do 会在队列共享组中的队列管理器重新启动后存活下来,但不会在用于在共享队列上存储消息的耦合设施发生故障后存活下来。

PEQDEF
消息具有缺省持久性。
  • 如果队列是集群队列,那么将从目标队列管理器中定义的 DefPersistence 属性获取消息的持久性,该目标队列管理器拥有放置消息的队列的特定实例。 通常,集群队列的所有实例都具有相同的 DefPersistence 属性值,尽管这不是强制的。

    将消息放入目标队列时,会将 DefPersistence 的值复制到 MDPER 字段中。 如果随后更改 DefPersistence ,那么已放入队列中的消息不受影响。

  • 如果该队列不是集群队列,那么将从本地队列管理器上定义的 DefPersistence 属性获取消息的持久性,即使目标队列管理器是远程队列管理器也是如此。
    如果在队列名解析路径中有多个定义,那么将从路径中第一个定义中的此属性值获取缺省持久性。 它可以是:
    • 别名队列
    • 本地队列
    • 远程队列的本地定义
    • 队列管理器别名
    • 传输队列 (例如, DefXmitQName 队列)

    放入消息时,会将 DefPersistence 的值复制到 MDPER 字段中。 如果随后更改了 DefPersistence ,那么已放入的消息不受影响。

持久消息和非持久消息都可以存在于同一队列中。

在回复消息时,应用程序通常应该将请求消息的持久性用于回复消息。

对于 MQGET 调用,返回的值为 PEPER 或 PENPER。

这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的初始值为 PEQDEF。

MDPRI (10 位带符号整数)

这是消息优先级。

对于 MQPUT 和 MQPUT1 调用,值必须大于或等于零; 零是最低优先级。 还可以使用以下特殊值:
PRQDEF
队列的缺省优先级。
  • 如果队列是集群队列,那么将从 DefPriority 属性中获取消息的优先级,如在拥有放置消息的队列的特定实例的目标队列管理器中所定义的那样。 通常,集群队列的所有实例都具有相同的 DefPriority 属性值,尽管这不是强制的。

    将消息放入目标队列时,会将 DefPriority 的值复制到 MDPRI 字段中。 如果随后更改 DefPriority ,那么已放入队列中的消息不受影响。

  • 如果队列不是集群队列,那么将从本地队列管理器上定义的 DefPriority 属性获取消息的优先级,即使目标队列管理器是远程队列管理器也是如此。
    如果在队列名解析路径中有多个定义,那么缺省优先级取自路径中第一个定义中此属性的值。 它可以是:
    • 别名队列
    • 本地队列
    • 远程队列的本地定义
    • 队列管理器别名
    • 传输队列 (例如, DefXmitQName 队列)

    放入消息时,会将 DefPriority 的值复制到 MDPRI 字段中。 如果随后更改了 DefPriority ,那么已放入的消息不受影响。

MQGET 调用返回的值始终大于或等于零; 从不返回值 PRQDEF。

如果消息的优先级高于本地队列管理器支持的最大值 (此最大值由 MaxPriority 队列管理器属性提供) ,那么队列管理器将接受该消息,但该消息将以队列管理器的最大优先级放在队列上; MQPUT 或 MQPUT1 调用将完成,并带有 CCWARN 和原因码 RC2049。 但是, MDPRI 字段保留由放置消息的应用程序指定的值。

在应答消息时,应用程序通常应该将请求消息的优先级用于应答消息。 在其他情况下,指定 PRQDEF 允许在不更改应用程序的情况下执行优先级调整。

这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的初始值为 PRQDEF。

MDPT (8 字节字符串)

放入消息的时间。

这是消息的 源上下文 的一部分。 有关消息上下文的更多信息,请参阅 消息上下文控制上下文信息

队列管理器生成此字段时使用的格式为:
  • HHMMSSTH
其中字符表示 (按顺序):
HH
小时 (00 到 23)
MM
分钟 (00 到 59)
SS
秒 (00 到 59; 请参阅 注释 )
T
十分之一秒 (0 到 9)
H
百分之一秒 (0 到 9)
注: 如果系统时钟同步到非常准确的时间标准,那么在极少数情况下,可能会在 MDPT中返回 60 或 61 的秒数。 当将闰秒插入全局时间标准时,会发生此情况。

格林威治标准时间 (GMT) 用于 MDPDMDPT 字段,前提是系统时钟精确设置为 GMT。

如果将消息作为工作单元的一部分放入,那么时间是放入消息的时间,而不是落实工作单元的时间。

对于 MQPUT 和 MQPUT1 调用,如果在 PMO 参数中指定了 PMSETA ,那么这是输入/输出字段。 队列管理器不会检查该字段的内容,只是会废弃该字段中空字符之后的任何信息。 队列管理器将空字符和任何后续字符转换为空白。 如果未指定 PMSETA ,那么此字段将在输入时被忽略,并且是仅输出字段。

成功完成 MQPUT 或 MQPUT1 调用之后,此字段包含随消息一起传输的 MDPT 值 (如果将该值放入队列)。 这将是保留消息时随消息一起保留的 MDPT 的值 (请参阅 PMRET 描述以获取有关保留发布的更多详细信息) ,但在将消息作为发布发送给订户时不用作 MDPT ,因为它们提供了一个值以覆盖发送给订户的所有发布中的 MDPT 。 如果消息没有上下文,那么该字段完全为空白。

这是 MQGET 调用的输出字段。 此字段的长度由 LNPTIM 给出。 此字段的初始值为 8 个空白字符。

MDREP (10 位带符号整数)

报告消息的选项。

报告消息是关于另一条消息的消息,用于通知应用程序与原始消息相关的预期事件或意外事件。 MDREP 字段使发送原始消息的应用程序能够指定需要哪些报告消息,是否要将应用程序消息数据包括在这些消息中,以及 (对于报告和应答) 如何设置报告或应答消息中的消息和相关标识。 可以请求以下类型的任何或全部 (或无) 报告消息:
  • 异常
  • 到期
  • 到达时确认 (COA)
  • 交付时确认 (COD)
  • 肯定操作通知 (PAN)
  • 否定操作通知 (NAN)
如果需要多种类型的报告消息,或者需要其他报告选项,那么可以将值一起添加 (请勿多次添加相同的常量)。

接收报告消息的应用程序可以通过检查 MQMD 中的 MDFB 字段来确定生成报告的原因; 请参阅 MDFB 字段以获取更多详细信息。

将消息放入主题时使用报告选项可能会导致生成零条,一条或多条报告消息并将其发送到应用程序。 这是因为发布消息可能被发送到零个,一个或多个预订应用程序。

异常选项: 您可以指定下列其中一个选项来请求异常报告消息。
活动

需要活动报告

此报告选项允许在支持应用程序处理具有此报告选项集的消息时生成活动报告。

任何队列管理器都必须接受具有此报告选项集的消息,即使它们不 "了解" 该选项也是如此。 这允许对任何用户消息设置报告选项,即使这些用户消息由先前的队列管理器处理也是如此。 要实现此目的,请将报告选项放在 ROAUM 子字段中。

如果进程 (队列管理器或用户进程) 对设置了 ROACT 的消息执行 "活动" ,那么它可以选择生成并放置活动报告。

活动报告选项允许在队列管理器网络中跟踪任何消息的路由。 可以在任何当前用户消息上指定报告选项,并立即开始计算消息通过网络的路由。 如果生成消息的应用程序无法启用活动报告生成,那么可以使用队列管理器管理员提供的 API 交叉出口将其启用。

有几个条件适用于活动报告:
  1. 如果网络中能够生成活动报告的队列管理器较少,那么路由将不太详细。
  2. 为了确定采用的路线,活动报告可能不容易 "订购"。
  3. 活动报告可能无法找到到其请求的目标的路径。
ROEXC
需要异常报告。

当消息发送到另一个队列管理器并且无法将消息传递到指定的目标队列时,消息通道代理可以生成此类型的报告。 例如,目标队列或中间传输队列可能已满,或者消息对于队列可能太大。

异常报告消息的生成取决于原始消息的持久性,以及原始消息通过的消息通道 (正常或快速) 的速度:
  • 对于所有持久消息以及通过正常消息通道传输的非持久消息,仅当发送应用程序针对错误情况指定的操作可以成功完成时,才会生成异常报告。 发送应用程序可以指定下列其中一项操作,以在出现错误情况时控制原始消息的处置:
    • RODLQ (这会导致原始消息放置在死信队列上)。
    • RODISC (这将导致废弃原始消息)。
    如果发送应用程序指定的操作无法成功完成,那么原始消息将保留在传输队列上,并且不会生成异常报告消息。
  • 对于通过快速消息通道传输的非持久消息,将从传输队列中除去原始消息,并且 即使 无法成功完成针对错误情况的指定操作,也会生成异常报告。 例如,如果指定了 RODLQ ,但无法将原始消息放在死信队列上,因为 (例如) 该队列已满,那么将生成异常报告消息并废弃原始消息。

    请参阅 消息持久性 ,以获取有关正常和快速消息通道的更多信息。

如果放置原始消息的应用程序可以通过 MQPUT 或 MQPUT1 调用返回的原因码同步通知问题,那么不会生成异常报告。

应用程序还可以发送异常报告,以指示无法处理它收到的消息 (例如,因为它是借记交易,会导致帐户超出其贷记限额)。

报告消息不包含来自原始消息的消息数据。

请勿指定多个 ROEXC , ROEXCD 和 ROEXCF。

ROEXCD
需要数据的异常报告。

这与 ROEXC 相同,只是原始消息中的应用程序消息数据的前 100 个字节包含在报告消息中。 如果原始消息包含一个或多个 MQ 头结构,那么除了 100 字节的应用程序数据外,还会将这些头结构包括在报告消息中。

请勿指定多个 ROEXC , ROEXCD 和 ROEXCF。

ROEXCF
需要完整数据的异常报告。

这与 ROEXC 相同,只是原始消息中的所有应用程序消息数据都包含在报告消息中。

请勿指定多个 ROEXC , ROEXCD 和 ROEXCF。

到期选项: 您可以指定下列其中一个选项来请求到期报告消息。
ROEXP
需要到期报告。

此类型的报告由队列管理器生成,前提是消息在传递到应用程序之前被废弃,因为其到期时间已过 (请参阅 MDEXP 字段)。 如果未设置此选项,那么当由于此原因 (即使指定了其中一个 ROEXC* 选项) 而废弃消息时,不会生成报告消息。

报告消息不包含来自原始消息的消息数据。

请勿指定多个 ROEXP , ROEXPD 和 ROEXPF。

ROEXPD
需要具有数据的到期报告。

这与 ROEXP 相同,只是原始消息中的应用程序消息数据的前 100 个字节包含在报告消息中。 如果原始消息包含一个或多个 MQ 头结构,那么除了 100 字节的应用程序数据外,还会将这些头结构包括在报告消息中。

请勿指定多个 ROEXP , ROEXPD 和 ROEXPF。

ROEXPF
需要具有完整数据的到期报告。

这与 ROEXP 相同,只是原始消息中的所有应用程序消息数据都包含在报告消息中。

请勿指定多个 ROEXP , ROEXPD 和 ROEXPF。

到达时确认选项: 您可以指定下列其中一个选项来请求到达时确认报告消息。
ROCOA
需要 "到达时确认" 报告。

此类型的报告由拥有目标队列的队列管理器在将消息放入目标队列时生成。 报告消息不包含来自原始消息的消息数据。

如果将消息作为工作单元的一部分放入,并且目标队列是本地队列,那么只有在落实工作单元时,队列管理器生成的 COA 报告消息才可用于检索。

如果消息描述符中的 MDFMT 字段是 FMXQH 或 FMDLH ,那么不会生成 COA 报告。 如果将消息放在传输队列上,或者无法传递消息并将其放在死信队列上,那么这将阻止生成 COA 报告。

请勿指定多个 ROCOA , ROCOAD 和 ROCOAF。

ROCOAD
需要数据的 "到达时确认" 报告。

这与 ROCOA 相同,只是原始消息中应用程序消息数据的前 100 个字节包含在报告消息中。 如果原始消息包含一个或多个 MQ 头结构,那么除了 100 字节的应用程序数据外,还会将这些头结构包括在报告消息中。

请勿指定多个 ROCOA , ROCOAD 和 ROCOAF。

罗科卡
需要完整数据的 "到达时确认" 报告。

这与 ROCOA 相同,只是原始消息中的所有应用程序消息数据都包含在报告消息中。

请勿指定多个 ROCOA , ROCOAD 和 ROCOAF。

废弃和到期选项: 可以指定以下选项来设置报告消息的到期时间和废弃标志。
ROPDAE
设置报告消息到期时间和废弃标志。
此选项确保报告消息和应答消息从其原始消息继承到期时间和废弃标志 (无论是否废弃)。 通过此选项集,报告和应答消息:
  1. 继承 RODISC 标志 (如果已设置)。
  2. 如果消息不是到期报告,那么继承消息的剩余到期时间。 如果消息是到期报告,那么到期时间设置为 60 秒。
使用此选项集时,以下内容适用:
注:
  1. 报告和应答消息是使用废弃标志和到期值生成的,并且不能保留在系统中。
  2. 阻止跟踪路由消息到达启用了非跟踪路由的队列管理器上的目标队列。
  3. 如果通信链路中断,那么将阻止队列填充无法传递的报告。
  4. 命令服务器响应将继承请求的剩余到期时间。
传递时确认选项: 您可以指定下列其中一个选项来请求传递时确认报告消息。
ROCOD
需要 "在交付时确认" 报告。

当应用程序以导致从队列中删除消息的方式从目标队列中检索消息时,队列管理器将生成此类型的报告。 报告消息不包含来自原始消息的消息数据。

如果将消息作为工作单元的一部分进行检索,那么将在同一工作单元中生成报告消息,以便在落实工作单元之前报告不可用。 如果回退工作单元,那么不会发送报告。

如果消息描述符中的 MDFMT 字段为 FMDLH ,那么不会生成 COD 报告。 如果无法传递消息并将其放入死信队列中,那么这将阻止生成 COD 报告。

如果目标队列是 XCF 队列,那么 ROCOD 无效。

请勿指定多个 ROCOD , ROCODD 和 ROCODF。

ROCODD
需要数据时确认交付报告。

这与 ROCOD 相同,只是原始消息中的应用程序消息数据的前 100 个字节包含在报告消息中。 如果原始消息包含一个或多个 MQ 头结构,那么除了 100 字节的应用程序数据外,还会将这些头结构包括在报告消息中。

如果在原始消息的 MQGET 调用上指定了 GMATM ,并且检索的消息被截断,那么放入报告消息中的应用程序消息数据量至少为:
  • 原始消息的长度
  • 100 字节。

如果目标队列是 XCF 队列,那么 ROCODD 无效。

请勿指定多个 ROCOD , ROCODD 和 ROCODF。

ROCODF
确认交付时报告,需要完整的数据。

这与 ROCOD 相同,只是原始消息中的所有应用程序消息数据都包含在报告消息中。

如果目标队列是 XCF 队列,那么 ROCODF 无效。

请勿指定多个 ROCOD , ROCODD 和 ROCODF。

操作-通知选项: 您可以指定以下一个或两个选项,以请求接收应用程序发送肯定操作或否定操作报告消息。
ROPAN
需要肯定操作通知报告。

此类型的报告由检索消息并对其执行操作的应用程序生成。 它指示已成功执行消息中请求的操作。 生成报告的应用程序确定是否要将任何数据包含在报告中。

除了将此请求传达给检索消息的应用程序之外,队列管理器不会根据此选项执行任何操作。 检索应用程序负责生成报告 (如果适用)。

罗南
需要否定操作通知报告。

此类型的报告由检索消息并对其执行操作的应用程序生成。 它指示未成功执行消息中请求的操作。 生成报告的应用程序确定是否要将任何数据包含在报告中。 例如,可能需要包含一些数据,以指示无法执行请求的原因。

除了将此请求传达给检索消息的应用程序之外,队列管理器不会根据此选项执行任何操作。 检索应用程序负责生成报告 (如果适用)。

确定哪些条件对应于积极行动,哪些条件对应于消极行动是申请方的责任。 但是,建议如果仅部分执行了请求,那么应生成 NAN 报告而不是 PAN 报告 (如果请求)。 还建议每个可能的条件都应该对应于肯定操作或否定操作,但不能同时对应于两者。

消息标识选项: 您可以指定下列其中一个选项,以控制如何设置报告消息 (或应答消息) 的 MDMID
RONMI
新消息标识。

这是缺省操作,指示如果由于此消息而生成报告或应答,那么将为报告或应答消息生成新的 MDMID

ROPMI
传递消息标识。

如果由于此消息而生成报告或应答,那么会将此消息的 MDMID 复制到报告或应答消息的 MDMID

对于接收发布副本的每个订户,发布消息的 MsgId 将不同,因此复制到报告或回复消息中的 MsgId 将不同。

如果未指定此选项,那么将采用 RONMI。

相关标识选项: 您可以指定下列其中一个选项,以控制如何设置报告消息 (或应答消息) 的 MDCID
罗 CMTC
将消息标识复制到相关标识。

这是缺省操作,指示如果由于此消息而生成报告或应答,那么此消息的 MDMID 将复制到报告或应答消息的 MDCID

对于接收发布副本的每个订户,发布消息的 MsgId 将不同,因此复制到报告或回复消息的 CorrelId 中的 MsgId 将不同。
ROPCI
传递相关标识。

如果由于此消息而生成报告或应答,那么会将此消息的 MDCID 复制到报告或应答消息的 MDCID

发布消息的 MDCID 将特定于订户,除非它使用 SOSCID 选项并将 MQSD 中的 SCDIC 字段设置为 CINONE。 因此,复制到报告或应答消息的 MDCID 中的 MDCID 可能对于每个报告或应答消息不同。

如果未指定此选项,那么将采用 ROCMTC。

建议回复请求或生成报告消息的服务器检查是否在原始消息中设置了 ROPMI 或 ROPCI 选项。 如果是,那么服务器应执行针对这些选项描述的操作。 如果两者都未设置,那么服务器应执行相应的缺省操作。

: 您可以指定下列其中一个选项,以在无法将原始消息传递到目标队列时控制其处置。 如果发送应用程序请求了异常报告消息,那么这些选项仅适用于会导致生成异常报告消息的那些情况。 应用程序可以独立于请求异常报告来设置处置选项。
RODLQ
将消息放在死信队列上。
这是缺省操作,指示如果无法将消息传递到目标队列,那么应将该消息放在死信队列上。 在以下情况下会发生此情况:
  • 当放置原始消息的应用程序无法通过 MQPUT 或 MQPUT1 调用返回的原因码同步通知问题时。 如果发送方请求了异常报告消息,那么将生成异常报告消息。
  • 将原始消息放入主题的应用程序

如果发送方请求了异常报告消息,那么将生成异常报告消息。

RODISC
废弃消息。
这指示如果无法将消息传递到目标队列,那么应将其废弃。 在以下情况下会发生此情况:
  • 当放置原始消息的应用程序无法通过 MQPUT 或 MQPUT1 调用返回的原因码同步通知问题时。 如果发送方请求了异常报告消息,那么将生成异常报告消息。
  • 将原始消息放入主题的应用程序

如果发送方请求了异常报告消息,那么将生成异常报告消息。

如果需要将原始消息返回给发送方,而未将原始消息放在死信队列上,那么发送方应使用 ROEXCF 指定 RODISC。

缺省选项: 如果不需要任何报告选项,那么可以指定以下内容:
RONONE
不需要报告。

此值可用于指示未指定任何其他选项。 定义 RONONE 是为了帮助程序文档。 不打算将此选项与任何其他选项一起使用,但由于其值为零,因此无法检测到此类使用。

常用信息
  1. 发送原始消息的应用程序必须特别请求所需的所有报告类型。 例如,如果请求 COA 报告但未请求异常报告,那么在将消息放入目标队列时会生成 COA 报告,但如果消息到达目标队列时目标队列已满,那么不会生成异常报告。 如果未设置 MDREP 选项,那么队列管理器或消息通道代理 (MCA) 不会生成任何报告消息。

    即使本地队列管理器无法识别某些报告选项,也可以指定这些报告选项; 当 destination 队列管理器要处理该选项时,这很有用。 请参阅 IBM i上的报告选项和消息标志 以获取更多详细信息。

    如果请求了报告消息,那么必须在 MDRQ 字段中指定要将报告发送到的队列的名称。 接收到报告消息时,可以通过检查消息描述符中的 MDFB 字段来确定报告的性质。

  2. 如果生成报告消息的队列管理器或 MCA 无法将报告消息放在应答队列上 (例如,由于应答队列或传输队列已满) ,那么会将报告消息改为放在死信队列上。 如果该 失败,或者没有死信队列,那么执行的操作取决于报告消息的类型:
    • 如果报告消息是异常报告,那么导致生成异常报告的消息将保留在其传输队列上; 这将确保消息不会丢失。
    • 对于所有其他报告类型,将废弃报告消息并正常继续处理。 执行此操作的原因是原始消息已安全传递 (对于 COA 或 COD 报告消息) ,或者不再感兴趣 (对于到期报告消息)。
    将报告消息成功放入队列 (目标队列或中间传输队列) 后,该消息将不再接受特殊处理; 它将与任何其他消息一样受到处理。
  3. 生成报告时,将打开 MDRQ 队列,并使用 MDUID 的权限将报告消息放入导致报告的消息的 MQMD 中,以下情况除外:
    • 接收 MCA 生成的异常报告将与 MCA 在尝试放置导致报告的消息时使用的任何权限放在一起。 CDPA 通道属性确定使用的用户标识。
    • 队列管理器生成的 COA 报告与在生成报告的队列管理器上放置导致报告的消息时所使用的任何权限放在一起。 例如,如果消息是由接收 MCA 使用 MCA 的用户标识放入的,那么队列管理器将使用 MCA 的用户标识放入 COA 报告。
    生成报告的应用程序通常应该使用用于生成应答的相同权限; 这通常应该是原始消息中用户标识的权限。

    如果报告必须传输到远程目标,那么发送方和接收方可以决定是否接受该报告,其方式与它们对其他消息的方式相同。

  4. 如果请求包含数据的报告消息:
    • 报告消息始终与原始消息的发送方所请求的数据量一起生成。 如果报告消息对于应答队列太大,那么将发生先前描述的处理; 报告消息从不截断以适合应答队列。
    • 如果原始消息的 MDFMT 是 FMXQH ,那么报告中包含的数据不包含 MQXQH。 报告数据从原始消息中 MQXQH 之外的数据的第一个字节开始。 如果队列是传输队列,那么会发生此情况。
  5. 如果在应答队列中接收到 COA , COD 或到期报告消息,那么将保证原始消息已到达,已传递或已到期 (视情况而定)。 但是,如果请求了这些报告消息中的一条或多条,但未收到这些消息,那么无法假定发生反向操作,因为可能发生了以下情况之一:
    1. 报告消息已挂起,因为链接已关闭。
    2. 由于中间传输队列或应答队列中存在阻塞情况 (例如,队列已满或禁止放入) ,因此报告消息被挂起。
    3. 报告消息位于死信队列上。
    4. 队列管理器尝试生成报告消息时,无法将其放在相应的队列上,也无法将其放在死信队列上,因此无法生成报告消息。
    5. 在所报告的操作 (到达,传递或到期) 与生成相应的报告消息之间,队列管理器发生故障。 (如果应用程序在工作单元中检索原始消息,那么 COD 报告消息不会发生此情况,因为 COD 报告消息是在同一工作单元中生成的。)

    由于先前的原因 1 , 2 和 3 ,异常报告消息可能会以相同方式挂起。 但是,当 MCA 无法生成异常报告消息 (报告消息不能放在应答队列或死信队列上) 时,原始消息将保留在发送方的传输队列上,并且通道已关闭。 无论报告消息是在通道的发送端还是接收端生成,都会发生此情况。

  6. 如果临时阻塞原始消息 (导致生成异常报告消息,并将原始消息放入死信队列) ,但阻塞会清除,然后应用程序从死信队列中读取原始消息并将其再次放入其目标,那么可能会发生以下情况:
    • 即使生成了异常报告消息,原始消息也最终成功到达其目标。
    • 针对单个原始消息生成了多个异常报告消息,因为该原始消息稍后可能会迂到另一个阻塞。
放入主题时的报告消息:
  1. 将消息放入主题时,可以生成报告。 此消息将发送到主题的所有订户,这些订户可以是零,一个或多个。 在选择使用报告选项时,应该考虑这一点,因为可能会生成大量报告消息。
  2. 将消息放入主题时,可能有许多要为其提供消息副本的目标队列。 如果其中一些目标队列存在问题 (例如队列已满) ,那么 MQPUT 的成功完成取决于 NPMSGDLV 或 PMSGDLV 的设置 (取决于消息的持久性)。 如果设置为必须成功将消息传递到目标队列 (例如,它是持久订户的持久消息,并且 PMSGDLV 设置为 ALL 或 ALLDUR) ,那么成功定义为满足以下条件之一:
    • 成功放入订户队列
    • 如果订户队列无法接收消息,请使用 RODLQ 并成功将其放入死信队列
    • 如果订户队列无法获取消息,请使用 RODISC。
报告消息段的消息:
  1. 可以为允许分段的消息请求报告消息 (请参阅 MFSEGA 标志的描述)。 如果队列管理器发现需要对消息进行分段,那么可以为随后迂到相关情况的每个分段生成报告消息。 因此,应准备应用程序接收针对所请求的每种类型的报告消息的多个报告消息。 报告消息中的 MDGID 字段可用于将多个报告与原始消息的组标识相关联, MDFB 字段用于标识每个报告消息的类型。
  2. 如果使用 GMLOGO 来检索分段的报告消息,请注意后续 MQGET 调用可能会返回 不同类型 的报告。 例如,如果针对队列管理器分段的消息同时请求 COA 和 COD 报告,那么针对报告消息的 MQGET 调用可能会以不可预测的方式返回 COA 和 COD 报告消息。 可通过使用 GMCMPM 选项 (可选择使用 GMATM) 来避免此情况。 GMCMPM 会导致队列管理器重新组合具有相同报告类型的报告消息。 例如,第一个 MQGET 调用可能会重新组装与原始消息相关的所有 COA 消息,而第二个 MQGET 调用可能会重新组装所有 COD 消息。 首先重新组合的内容取决于在队列中最先出现的报告消息的类型。
  3. 自己放置分段的应用程序可以为每个分段指定不同的报告选项。 但应注意以下几点:
    • 如果使用 GMCMPM 选项检索段,那么队列管理器仅使用 第一个 段中的报告选项。
    • 如果逐个检索细分市场,并且其中大部分都有一个 ROCOD* 选项,但至少有一个细分市场没有,那么将无法使用 GMCMPM 选项通过单个 MQGET 调用来检索报告消息,或者使用 GMASGA 选项来检测所有报告消息何时已到达。
  4. 在 MQ 网络中,队列管理器可能具有不同的功能。 如果段的报告消息是由不支持分段的队列管理器或 MCA 生成的,那么缺省情况下,队列管理器或 MCA 不会在报告消息中包含必需的段信息,这可能导致难以识别导致生成报告的原始消息。 通过使用报告消息 (即通过指定相应的 RO* D 或 RO* F 选项) 来请求数据,可以避免此困难。 但是,请注意,如果指定了 RO* D ,那么如果报告消息由不支持分段的队列管理器或 MCA 生成,那么可能会将 少于 个字节的应用程序消息数据返回到检索报告消息的应用程序。

报告消息的消息描述符的内容: 当队列管理器或消息通道代理 (MCA) 生成报告消息时,它会将消息描述符中的字段设置为以下值,然后以正常方式放置消息。

MQMD 中的字段 使用的值
MDSID MDSIDV
MDVER MDVER2
MDREP RONONE
MDMT 中期审查
MDEXP EIULIM
MDFB 酌情说明报告的性质 (FBCOA , FBCOD , FBEXP 或 RC* 值)
MDENC 已从原始消息描述符复制
MDCSI 已从原始消息描述符复制
MDFMT 已从原始消息描述符复制
MDPRI 已从原始消息描述符复制
MDPER 已从原始消息描述符复制
MDMID 由原始消息描述符中的报告选项指定
MDCID 由原始消息描述符中的报告选项指定
MDBOC 0
MDRQ 空白
MDRM 队列管理器的名称
MDUID 由 PMPASI 选项设置
MDACC 由 PMPASI 选项设置
MDAID 由 PMPASI 选项设置
MDPAT ATQM 或适当的消息通道代理程序
MDPAN 队列管理器名称或消息通道代理程序名称的前 28 个字节。 对于由 IMS 网桥生成的报告消息,此字段包含与消息相关的 IMS 系统的 XCF 组名和 XCF 成员名。
MDPD 发送报告消息的日期
MDPT 发送报告消息的时间
MDAOD 空白
MDGID 已从原始消息描述符复制
MDSEQ 已从原始消息描述符复制
MDOFF 已从原始消息描述符复制
MDMFL 已从原始消息描述符复制
MDOLN 从原始消息描述符复制 (如果不是 OLUNDF) ,并设置为原始消息数据的长度,否则
建议生成报告的应用程序设置类似的值,但以下值除外:
  • 可以将 MDRM 字段设置为空白 (放入消息时,队列管理器会将此字段更改为本地队列管理器的名称)。
  • 应该使用用于应答的选项 (通常是 PMPASI) 来设置上下文字段。

分析报告字段: MDREP 字段包含子字段; 因此,需要检查消息发送方是否请求了特定报告的应用程序应使用 在 IBM i上分析报告字段中描述的其中一种方法。

这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的初始值为 RONONE。

MDRM (48 字节字符串)

应答队列管理器的名称。

这是应将应答消息或报告消息发送到的队列管理器的名称。 MDRQ 是在此队列管理器上定义的队列的本地名称。

如果 MDRM 字段为空,那么本地队列管理器将在其队列定义中查找 MDRQ 名称。 如果存在具有此名称的远程队列的本地定义,那么传输的消息中的 MDRM 值将替换为远程队列定义中的 RemoteQMgrName 属性的值,当接收应用程序对消息发出 MQGET 调用时,将在消息描述符中返回此值。 如果远程队列的本地定义不存在,那么随消息一起传输的 MDRM 是本地队列管理器的名称。

如果指定了该名称,那么它可能包含尾部空格; 它后面的第一个空字符和字符被视为空格。 但是,否则,不会检查名称是否满足队列管理器的命名规则,或者此名称对于发送队列管理器是否已知; 如果在传输的消息中替换了 MDRM ,那么对于传输的名称也是如此。

如果不需要应答队列,那么建议 (尽管未选中此选项) 将 MDRM 字段设置为空白; 不应将该字段保留为未初始化。

对于 MQGET 调用,队列管理器始终将使用空白填充的名称返回到字段的长度。

这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的长度由 LNQMN 给出。 此字段的初始值为 48 个空白字符。

MDRQ (48 字节字符串)

应答队列的名称。

这是发出消息获取请求的应用程序应该向其发送 MTRPLY 和 MTRPRT 消息的消息队列的名称。 该名称是在由 MDRM标识的队列管理器上定义的队列的本地名称。 此队列不应该是模型队列,尽管发送队列管理器在放入消息时不会验证此队列。

对于 MQPUT 和 MQPUT1 调用,如果 MDMT 字段的值为 MTRQST ,或者如果 MDREP 字段请求了任何报告消息,那么此字段不得为空。 但是,指定 (或替换) 的值将传递到发出消息获取请求的应用程序 (无论消息类型如何)。

如果 MDRM 字段为空,那么本地队列管理器将在其自己的队列定义中查找 MDRQ 名称。 如果存在具有此名称的远程队列的本地定义,那么传输的消息中的 MDRQ 值将替换为远程队列定义中的 RemoteQName 属性的值,当接收应用程序对消息发出 MQGET 调用时,将在消息描述符中返回此值。 如果远程队列的本地定义不存在,那么 MDRQ 保持不变。

如果指定了该名称,那么它可能包含尾部空格; 它后面的第一个空字符和字符被视为空格。 但是,否则,不会检查名称是否满足队列的命名规则; 如果在传输的消息中替换了 MDRQ ,那么对于传输的名称也是如此。 所做的唯一检查是,如果情况需要,那么已指定名称。

如果不需要应答队列,那么建议 (尽管未选中此选项) 将 MDRQ 字段设置为空白; 不应将该字段保留为未初始化。

对于 MQGET 调用,队列管理器始终将使用空白填充的名称返回到字段的长度。

如果无法传递需要报告消息的消息,并且该报告消息也无法传递到指定的队列,那么原始消息和报告消息都将转至死信 (undelivered-message) 队列。 请参阅 IBM i上队列管理器的属性中描述的 DeadLetterQName 属性。

这是 MQGET 调用的输出字段,也是 MQPUT 和 MQPUT1 调用的输入字段。 此字段的长度由 LNQN 给出。 此字段的初始值为 48 个空白字符。

MDSEQ (10 位带符号整数)

组中逻辑消息的序号。

序号从 1 开始,并针对组中的每条新逻辑消息增加 1 ,最多为 999 999 999 999。 不在组中的物理消息的序号为 1。

在以下情况下,应用程序无需在 MQPUT 或 MQGET 调用上设置此字段:
  • 在 MQPUT 调用上,指定了 PMLOGO。
  • 在 MQGET 调用上,未指定 MOSEQN。
这些是对非报告消息的消息使用这些调用的建议方法。 但是,如果应用程序需要更多控制,或者调用为 MQPUT1,那么应用程序必须确保将 MDSEQ 设置为适当的值。
在 MQPUT 和 MQPUT1 调用的输入上,队列管理器使用 表 1中详细描述的值。 在 MQPUT 和 MQPUT1 调用的输出上,队列管理器将此字段设置为随消息一起发送的值。

在 MQGET 调用的输入中,队列管理器使用 表 1中详细描述的值。 在 MQGET 调用的输出上,队列管理器将此字段设置为检索到的消息的值。

此字段的初始值为 1。 如果 MDVER 小于 MDVER2,那么将忽略此字段。

MDSID (4 字节字符串)

结构标识。

该值必须为:
MDSIDV
消息描述符结构的标识。

这始终是一个输入字段。 此字段的初始值为 MDSIDV。

MDUID (12 字节字符串)

用户标识。

这是消息的 身份上下文 的一部分。 有关消息上下文的更多信息,请参阅 消息上下文控制上下文信息

MDUID 指定发起消息的应用程序的用户标识。 队列管理器将此信息视为字符数据,但不定义其格式。

收到消息后,可以在后续 MQOPEN 或 MQPUT1 调用的 OBJDSC 参数的 ODAU 字段中使用 MDUID ,以便对 MDUID 用户而不是执行打开操作的应用程序执行授权检查。

当队列管理器为 MQPUT 或 MQPUT1 调用生成此信息时,队列管理器将使用从环境中确定的用户标识。

从环境确定用户标识时:
  • z/OS上,队列管理器使用:
    • 对于批处理,是 JES JOB 卡或启动式任务中的用户标识
    • 对于 TSO ,登录用户标识
    • 对于 CICS,这是与任务关联的用户标识
    • 对于 IMS,用户标识取决于应用程序类型:
      • 针对:
        • 非消息 BMP 区域
        • 非消息 IFP 区域
        • 未成功发出 GU 调用的消息 BMP 和消息 IFP 区域
        队列管理器使用区域 JES JOB 卡中的用户标识或 TSO 用户标识。 如果这些值为空白或空,那么它将使用程序规范块 (PSB) 的名称。
      • 针对:
        • 发出成功 GU 调用的消息 BMP 和消息 IFP 区域
        • MPP 区域
        队列管理器使用下列其中一项:
        • 与消息关联的注册用户标识
        • 逻辑终端 (LTERM) 名称
        • 区域 JES JOB 卡中的用户标识
        • TSO 用户标识
        • PSB 名称
  • IBM i上,队列管理器使用与应用程序作业关联的用户概要文件的名称。
  • HP Integrity NonStop Server上,队列管理器使用为 MQSeries 主体数据库中的 Tandem 用户标识定义的 MQSeries 主体。
  • UNIX上,队列管理器使用:
    • 应用程序的登录名
    • 进程的有效用户标识 (如果没有可用的登录)
    • 与事务关联的用户标识 (如果应用程序是 CICS 事务)
  • 在 VSE/ESA上,这是保留字段。
  • Windows上,队列管理器使用已登录用户名的前 12 个字符。

对于 MQPUT 和 MQPUT1 调用,如果在 PMO 参数中指定了 PMSETI 或 PMSETA ,那么这是输入/输出字段。 将废弃字段中空字符后面的任何信息。 队列管理器将空字符和任何后续字符转换为空白。 如果未指定 PMSETI 或 PMSETA ,那么此字段将在输入时被忽略,并且是仅输出字段。

成功完成 MQPUT 或 MQPUT1 调用后,此字段包含随消息一起传输的 MDUID (如果将其放入队列)。 这将是保留消息时随消息一起保留的 MDUID 的值 (请参阅 PMRET 描述以获取有关保留发布的更多详细信息) ,但在将消息作为发布发送给订户时不用作 MDUID ,因为它们提供了一个值以覆盖发送给订户的所有发布中的 MDUID 。 如果消息没有上下文,那么该字段完全为空白。

这是 MQGET 调用的输出字段。 此字段的长度由 LNUID 给出。 此字段的初始值为 12 个空白字符。

MDVER (10 位有符号整数)

结构版本号。

值必须为以下其中一项:
MDVER1
Version-1 消息描述符结构。
MDVER2
Version-2 消息描述符结构。

注: 使用 version-2 MQMD 时,队列管理器会对应用程序消息数据开头可能存在的任何 MQ 头结构执行其他检查; 有关更多详细信息,请参阅 MQPUT 调用的使用说明。
仅在结构的最新版本中存在的字段在字段的描述中标识为此类字段。 以下常量指定当前版本的版本号:
MDVERC
消息描述符结构的当前版本。

这始终是一个输入字段。 此字段的初始值为 MDVER1。

初始值

表 1. MQMD 中字段的初始值
字段名称 常量的名称 常量值
MDSID MDSIDV 'MD¬¬'
MDVER MDVER1 1
MDREP RONONE 0
MDMT MTDGRM 8
MDEXP EIULIM -1
MDFB FBNONE 0
MDENC ENNAT 取决于环境
MDCSI CSQM 0
MDFMT FMNONE 空白
MDPRI PRQDEF -1
MDPER PEQDEF 2
MDMID MINONE Null
MDCID CINONE Null
MDBOC None 0
MDRQ None 空白
MDRM None 空白
MDUID None 空白
MDACC Null
MDAID None 空白
MDPAT ATNCON 0
MDPAN None 空白
MDPD None 空白
MDPT None 空白
MDAOD None 空白
MDGID GINONE Null
MDSEQ None 1
MDOFF None 0
MDMFL MFNONE 0
MDOLN 奥罗达夫 -1
备注信息:
  1. 符号 ¬ 表示单个空白字符。

RPG 声明

     D*..1....:....2....:....3....:....4....:....5....:....6....:....7..
     D*
     D* MQMD Structure
     D*
     D* Structure identifier
     D  MDSID                  1      4    INZ('MD  ')
     D* Structure version number
     D  MDVER                  5      8I 0 INZ(1)
     D* Options for report messages
     D  MDREP                  9     12I 0 INZ(0)
     D* Message type
     D  MDMT                  13     16I 0 INZ(8)
     D* Message lifetime
     D  MDEXP                 17     20I 0 INZ(-1)
     D* Feedback or reason code
     D  MDFB                  21     24I 0 INZ(0)
     D* Numeric encoding of message data
     D  MDENC                 25     28I 0 INZ(273)
     D* Character set identifier of messagedata
     D  MDCSI                 29     32I 0 INZ(0)
     D* Format name of message data
     D  MDFMT                 33     40    INZ('        ')
     D* Message priority
     D  MDPRI                 41     44I 0 INZ(-1)
     D* Message persistence
     D  MDPER                 45     48I 0 INZ(2)
     D* Message identifier
     D  MDMID                 49     72    INZ(X'00000000000000-
     D                                     0000000000000000000000-
     D                                     000000000000')
     D* Correlation identifier
     D  MDCID                 73     96    INZ(X'00000000000000-
     D                                     0000000000000000000000-
     D                                     000000000000')
     D* Backout counter
     D  MDBOC                 97    100I 0 INZ(0)
     D* Name of reply queue
     D  MDRQ                 101    148    INZ
     D* Name of reply queue manager
     D  MDRM                 149    196    INZ
     D* User identifier
     D  MDUID                197    208    INZ
     D* Accounting token
     D  MDACC                209    240    INZ(X'00000000000000-
     D                                     0000000000000000000000-
     D                                     0000000000000000000000-
     D                                     000000')
     D* Application data relating toidentity
     D  MDAID                241    272    INZ
     D* Type of application that put themessage
     D  MDPAT                273    276I 0 INZ(0)
     D* Name of application that put themessage
     D  MDPAN                277    304    INZ
     D* Date when message was put
     D  MDPD                 305    312    INZ
     D* Time when message was put
     D  MDPT                 313    320    INZ
     D* Application data relating toorigin
     D  MDAOD                321    324    INZ
     D* Group identifier
     D  MDGID                325    348    INZ(X'00000000000000-
     D                                     0000000000000000000000-
     D                                     000000000000')
     D* Sequence number of logical messagewithin group
     D  MDSEQ                349    352I 0 INZ(1)
     D* Offset of data in physical messagefrom start of logical message
     D  MDOFF                353    356I 0 INZ(0)
     D* Message flags
     D  MDMFL                357    360I 0 INZ(0)
     D* Length of original message
     D  MDOLN                361    364I 0 INZ(-1)
1 队列管理器生成的 MDMID 由 4 字节产品标识 (ASCII 或 EBCDIC 中的 AMQ¬CSQ¬ ,其中 ¬ 表示单个空白字符) 组成,后跟特定于产品的唯一字符串实现。 在 IBM MQ 中,这包含队列管理器名称的前 12 个字符,以及从系统时钟派生的值。 因此,所有可以相互通信的队列管理器都必须具有在前 12 个字符中不同的名称,以确保消息标识是唯一的。 生成唯一字符串的能力还取决于不向后更改系统时钟。 要消除队列管理器生成的消息标识与应用程序生成的消息标识重复的可能性,应用程序应避免生成具有以 ASCII 或 EBCDIC (X'41 '到 X'49' 和 X'C1'到 X'C9') 表示的 A 到 I 范围内的初始字符的标识。 但是,不会阻止应用程序生成具有这些范围中的初始字符的标识。