MQPMO-Put-message 选项
MQPMO 结构允许应用程序指定用于控制如何将消息放入队列或发布到主题的选项。
概述
- 用途
- 此结构是 MQPUT 和 MQPUT1 调用上的输入/输出参数。
- 版本
- MQPMO 的当前版本为 PMVER2。 仅在结构的最新版本中存在的字段在随后的描述中标识为此类字段。
提供的 COPY 文件包含环境支持的最新 MQPMO 版本,但
PMVER字段的初始值设置为 PMVER1。 要使用 version-1 结构中不存在的字段,应用程序必须将PMVER字段设置为所需版本的版本号。 - 字符集和编码
- MQPMO 中的数据必须包含由
CodedCharSetId队列管理器属性提供的字符集以及由 ENNAT 提供的本地队列管理器的编码。 但是,如果应用程序作为 IBM® MQ 客户机运行,那么结构必须采用客户机的字符集和编码。
字段
MQPMO 结构包含以下字段; 这些字段按字母顺序描述:
- PMCT (10 位数字带符号整数)
输入队列的对象句柄。
如果指定了 PMPASI 或 PMPASA ,那么此字段必须包含从中获取要与所放入的消息相关联的上下文信息的输入队列句柄。
如果未指定 PMPASI 和 PMPASA ,那么将忽略此字段。
这是一个输入字段。 此字段的初始值为
0。- PMIDC (10 位数字带符号整数)
无法发送的消息数。
这是无法发送到分发列表中的队列的消息数。 计数包括未能打开的队列以及已成功打开但放置操作失败的队列。 将消息放入不在分发列表中的单个队列时,也会设置此字段。
注: 仅当 MQPUT 或 MQPUT1 调用上的CMPCOD参数为 CCOK 或 CCWARN 时,才会设置此字段; 如果CMPCOD参数为 CCFAIL ,那么不会设置此字段。这是输出字段。 此字段的初始值为 0。 如果
PMVER小于 PMVER2,那么不会设置此字段。- PMKDC (10 位有符号整数)
成功发送到本地队列的消息数。
这是当前 MQPUT 或 MQPUT1 调用成功发送到作为本地队列的分发列表中的队列的消息数。 该计数不包括发送到解析为远程队列的队列的消息 (即使最初使用本地传输队列来存储消息)。 将消息放入不在分发列表中的单个队列时,也会设置此字段。
这是输出字段。 此字段的初始值为 0。 如果
PMVER小于 PMVER2,那么不会设置此字段。- PMOPT (10 位数字带符号整数)
用于控制 MQPUT 和 MQPUT1的操作的选项。
可以指定以下任何内容或不指定任何内容。 如果需要多个值,那么可以添加这些值 (请勿多次添加相同的常量)。 将记录无效的组合; 任何其他组合都有效。
发布选项: 以下选项控制将消息发布到主题的方式。- PMSRTO
此出版物的 MQMD 的 MDRQ 和 MDRM 字段中填写的任何信息都不会传递给订户。 如果该选项与需要 "ReplyToQ,的报告选项一起使用,则调用失败,显示RC2027.
- PMRET
要发送的发布将由队列管理器保留。 这允许订户在发布此发布之后使用 MQSUBRQ 调用来请求此发布的副本。 它还允许将出版物发送给在此出版物发布后进行预订的应用程序,除非这些应用程序选择不使用 SONEWP 选项发送该出版物。 如果向应用程序发送了保留的发布内容,那么该发布内容的 mq.IsRetained 消息属性会指示该应用程序。
在主题树的每个节点上只能保留一个发布内容。 这意味着如果已存在此主题的保留出版物 (由任何其他应用程序发布) ,那么会将其替换为此出版物。 因此,最好避免有多个发布程序保留同一主题上的消息。
当订户请求保留发布时,所使用的预订可能在主题中包含通配符,在这种情况下,多个保留发布可能匹配 (在主题树中的各个节点上) ,并且可能会将多个发布发送到请求应用程序。 请参阅 MQSUBRQ-预订请求 调用的描述以获取更多详细信息。
如果使用此选项并且无法保留发布,那么将不会发布消息,并且调用将失败RC2479.
同步点选项: 以下选项与 MQPUT 或 MQPUT1 调用参与工作单元相关:- PMSYP
- 使用同步点控制放置消息。
请求是在正常工作单元协议中运行。 在落实工作单元之前,该消息在工作单元外部不可见。 如果工作单元已回退,那么将删除该消息。
如果未指定此选项和 PMNSYP ,那么 put 请求不在工作单元内。
PMSYP 不得与 PMNSYP 一起指定。
- PMNSYP
- 在没有同步点控制的情况下放入消息。
请求是在正常工作单元协议之外运行。 消息立即可用,无法通过回退工作单元将其删除。
如果未指定此选项和 PMSYP ,那么 put 请求不在工作单元内。
不得将 PMNSYP 与 PMSYP 一起指定。
消息标识和相关标识选项: 以下选项请求队列管理器生成新的消息标识或相关标识:- PMNMID
- 生成新的消息标识。
此选项使队列管理器将 MQMD 中
MDMID字段的内容替换为新的消息标识。 此消息标识随消息一起发送,并在 MQPUT 或 MQPUT1 调用的输出时返回到应用程序。将消息放入分发列表时,也可以指定此选项; 请参阅 MQPMR 结构中
PRMID字段的描述以获取详细信息。使用此选项可使应用程序无需在每次 MQPUT 或 MQPUT1 调用之前将
MDMID字段重置为 MINONE。 - PMNCID
- 生成新的相关标识。
此选项使队列管理器将 MQMD 中
MDCID字段的内容替换为新的相关标识。 此相关标识随消息一起发送,并在 MQPUT 或 MQPUT1 调用的输出时返回到应用程序。将消息放入分发列表时,也可以指定此选项; 请参阅 MQPMR 结构中
PRCID字段的描述以获取详细信息。在应用程序需要唯一相关标识的情况下, PMNCID 很有用。
组和段选项: 以下选项与处理逻辑消息的组和段中的消息相关。 这些定义可能有助于了解选项:- 物理消息
- 这是可以放在队列上或从队列中除去的最小信息单元; 它通常对应于在单个 MQPUT , MQPUT1或 MQGET 调用上指定或检索的信息。 每条物理消息都有自己的消息描述符 (MQMD)。 通常,物理消息由消息标识 (MQMD 中的
MDMID字段) 的不同值进行区分,尽管队列管理器未实施此操作。 - 逻辑消息
- 这是单个应用程序信息单元。 在没有系统约束的情况下,逻辑消息将与物理消息相同。 但是,如果逻辑消息很大,那么系统约束可能建议或需要将逻辑消息拆分为两个或多个物理消息 (称为 段)。
已分段的逻辑消息由具有相同非空组标识 (MQMD 中的
MDGID字段) 和相同消息序号 (MQMD 中的MDSEQ字段) 的两个或多个物理消息组成。 这些段通过段偏移量 (MQMD 中的MDOFF字段) 的不同值进行区分,这将提供物理消息中的数据从逻辑消息中的数据开始的偏移量。 由于每个段都是物理消息,因此逻辑消息中的段通常具有不同的消息标识。未分段但发送应用程序已允许分段的逻辑消息也具有非空组标识,但在这种情况下,如果逻辑消息不属于消息组,那么只有一条具有该组标识的物理消息。 发送应用程序已禁止分段的逻辑消息具有空组标识 (GINONE) ,除非逻辑消息属于消息组。
- 消息组
- 这是一组具有相同非空组标识的一条或多条逻辑消息。 该组中的逻辑消息由消息序号的不同值进行区分,该值是 1 到 n 范围内的整数,其中 n 是该组中的逻辑消息数。 如果对一条或多条逻辑消息进行分段,那么组中的物理消息数超过 n 条。
- PMLOGO
- 逻辑消息的组和段中的消息按逻辑顺序放置。
此选项告诉队列管理器应用程序如何将消息放入逻辑消息的组和段中。 只能对 MQPUT 调用指定此选项;它对于 MQPUT1 调用是无效的。
如果指定了 PMLOGO ,那么它指示应用程序使用连续 MQPUT 调用来执行以下操作:- 按段偏移量的递增顺序(从 0 开始,无间隔)放置每条逻辑消息中的段。
- 将所有段放入一条逻辑消息中,然后再将段放入下一条逻辑消息中。
- 按消息序号的递增顺序(从 1 开始,无间隔)放置每个消息组中的逻辑消息。
- 将所有逻辑消息放入一个消息组中,然后再将逻辑消息放入下一个消息组中。
由于应用程序已告知队列管理器如何将消息放入逻辑消息的组和段中,因此应用程序不必维护和更新有关每个 MQPUT 调用的组和段信息,因为队列管理器会执行此操作。 具体而言,这意味着应用程序不需要在 MQMD 中设置
MDGID,MDSEQ和MDOFF字段,因为队列管理器会将这些字段设置为相应的值。 应用程序仅需要在 MQMD 中设置MDMFL字段,以指示消息何时属于组或逻辑消息段,并指示组中的最后一条消息或逻辑消息的最后一段。消息组或逻辑消息启动后,后续 MQPUT 调用必须在 MQMD 中的
MDMFL中指定相应的 MF* 标志。 如果应用程序尝试在存在未终止的消息组时将消息放入组中,或者在存在未终止的逻辑消息时将不是段的消息放入组中,那么调用将失败并产生原因码RC2241或RC2242(视情况而定)。 但是,队列管理器会保留有关当前消息组或当前逻辑消息的信息,并且应用程序可以通过在重新发出 MQPUT 调用以放置不在组中或不在段中的消息之前发送消息 (可能没有应用程序消息数据) ,根据需要指定MFL联格或 MFLSEG 来终止这些消息。表 1 显示了有效的选项和标志的组合,以及队列管理器在每种情况下使用的MDGID,MDSEQ和MDOFF字段的值。 此表中未显示的选项和标志组合无效。 表中的列具有以下含义:- LOG ORD
- 指示是否在调用上指定了 PMLOGO 选项。
- MIG
- 指示在呼叫上是否指定了MF联格或MFL联格选项。
- SEG
- 指示是在呼叫上指定 MFSEG 还是 MFLSEG 选项。
- SEG OK
- 指示是否在调用上指定 MFSEGA 选项。
- Cur grp
- 指示在调用之前是否存在当前消息组。
- Cur log msg
- 指示在调用之前是否存在当前逻辑消息。
- 其他列
- 显示队列管理器使用的值。 "上一个" 表示用于队列句柄的上一个消息中的字段的值。
- PMRLOC
- 指定 MQPMO 结构中的 PMRQN 必须使用消息实际放入的本地队列的名称完成。 ResolvedQMgrName同样用托管本地队列的本地队列管理器名称完成。 请参阅 OORLOQ 以了解这意味着什么。 如果用户有权将其放入队列,那么他们具有在 MQPUT 调用上指定此标志的必需权限。 不需要特殊权限。
表 1. 与逻辑消息的组和段中的消息相关的 MQPUT 选项 指定的选项 调用前的组和 log-msg 状态 队列管理器使用的值 LOG ORD MIG SEG SEG OK Cur grp Cur log msg MDGIDMDSEQMDOFFYes 否 否 否 否 否 吉诺尼 1 0 Yes 否 否 Yes 否 否 新组标识 1 0 Yes 否 Yes 是或否 否 否 新组标识 1 0 Yes 否 Yes 是或否 否 Yes 前一个组标识 1 前一个偏移量 + 前一个段长 Yes Yes 是或否 是或否 否 否 新组标识 1 0 Yes Yes 是或否 是或否 Yes 否 前一个组标识 前一个序列号 + 1 0 Yes Yes Yes 是或否 Yes Yes 前一个组标识 前一个序列号 前一个偏移量 + 前一个段长 否 否 否 否 是或否 是或否 吉诺尼 1 0 否 否 否 Yes 是或否 是或否 新建组标识 (如果 GINONE) ,否则字段中的值 1 0 否 否 Yes 是或否 是或否 是或否 新建组标识 (如果 GINONE) ,否则字段中的值 1 字段中的值 否 Yes 否 是或否 是或否 是或否 新建组标识 (如果 GINONE) ,否则字段中的值 字段中的值 0 否 Yes Yes 是或否 是或否 是或否 新建组标识 (如果 GINONE) ,否则字段中的值 字段中的值 字段中的值 注:- 在 MQPUT1 调用上, PMLOGO 无效。
- 对于
MDMID字段,如果指定了 PMNMID 或 MINONE ,那么队列管理器将生成新的消息标识,否则将使用该字段中的值。 - 对于
MDCID字段,如果指定了 PMNCID ,那么队列管理器将生成新的相关标识,否则将使用该字段中的值。
当指定了 PMLOGO 时,队列管理器要求将逻辑消息中的组和段中的所有消息与 MQMD 中的
MDPER字段中的相同值放在一起,即,所有消息都必须是持久消息,或者所有消息都必须是非持久消息。 如果不满足此条件,那么 MQPUT 调用将失败并返回原因码RC2185.PMLOGO 选项影响工作单元,如下所示:- 如果将组或逻辑消息中的第一条物理消息放在工作单元中,那么如果使用相同的队列句柄,那么必须将组或逻辑消息中的所有其他物理消息放在工作单元中。 但是,不需要将它们放在同一工作单元中。 这允许将由许多物理消息组成的消息组或逻辑消息拆分为队列句柄的两个或多个连续工作单元。
- 如果未将组或逻辑消息中的第一条物理消息放入一个工作单元内,那么该组或逻辑消息中的所有其他物理消息都不能放入一个工作单元内(如果使用相同的队列句柄)。
指定 PMLOGO 时, MQPUT 调用上提供的 MQMD 不得小于 MDVER2。 如果不满足此条件,那么调用将失败并返回原因码RC2257.
如果未指定 PMLOGO ,那么可以按任何顺序放置逻辑消息的组和段中的消息,并且不需要放置完整的消息组或完整的逻辑消息。 应用程序负责确保
MDGID,MDSEQ,MDOFF和MDMFL字段具有相应的值。这是在发生系统故障后,可用于在中间重新启动消息组或逻辑消息的方法。 系统重新启动时,应用程序可以将
MDGID,MDSEQ,MDOFF,MDMFL和MDPER字段设置为相应的值,然后在将 PMSYP 或 PMNSYP 设置为 必需的情况下发出 MQPUT 调用,但不指定 PMLOGO。 如果此调用成功,那么队列管理器将保留组和段信息,并且使用该队列句柄的后续 MQPUT 调用可以正常指定 PMLOGO。队列管理器为 MQPUT 调用保留的组和段信息与其为 MQGET 调用保留的组和段信息不同。
对于任何给定的队列句柄,应用程序都可以将指定 PMLOGO 的 MQPUT 调用与不指定的 MQPUT 调用混合使用,但应注意以下几点:- 如果未指定 PMLOGO ,那么每个成功的 MQPUT 调用都会导致队列管理器将队列句柄的组和段信息设置为应用程序指定的值; 这将替换队列管理器为队列句柄保留的现有组和段信息。
- 如果未指定 PMLOGO ,那么当存在当前消息组或逻辑消息时,调用不会失败; 但是,调用可能成功并带有 CCWARN 完成代码。 表 2 显示了可能出现的各种个案。 在这些情况下,如果完成代码不是 CCOK ,那么原因码为下列其中一项 (视情况而定):
- RC2241
- RC2242
- RC2185
- RC2245
注: 队列管理器不会检查 MQPUT1 调用的组和段信息。
表 2. MQPUT 或 MQCLOSE 调用与组和段信息不一致时的结果 当前调用是 先前调用是带有 PMLOGO 的 MQPUT 先前调用是没有 PMLOGO 的 MQPUT 带有 PMLOGO 的 MQPUT CCFAIL CCFAIL 没有 PMLOGO 的 MQPUT CCWARN CCOK MQCLOSE,使用未结束的组或逻辑消息 CCWARN CCOK 建议仅希望按逻辑顺序放置消息和段的应用程序指定 PMLOGO ,因为这是要使用的最简单选项。 该选项可使应用程序无需管理组和段信息,因为队列管理器会管理此信息。 但是,专用应用程序可能需要比 PMLOGO 选项提供的更多控制,而这可以通过不指定该选项来实现。 如果执行此操作,那么应用程序必须确保在每个 MQPUT 或 MQPUT1 调用之前正确设置 MQMD 中的
MDGID,MDSEQ,MDOFF和MDMFL字段。例如,要转发其接收的物理消息的应用程序,而不考虑这些消息是在逻辑消息的组还是段中,不得指定 PMLOGO。 原因有二:- 如果按顺序检索和放置消息,那么指定 PMLOGO 将导致向消息分配新的组标识,这可能使消息的发起方难以或不可能关联来自消息组的任何应答或报告消息。
- 在发送和接收队列管理器间具有多条路径的复杂网络中,物理消息到达时可能杂乱无序。 通过在 MQGET 调用上不指定 PMLOGO 和相应的 GMLOGO ,转发应用程序可以在到达时立即检索和转发每条物理消息,而无需按逻辑顺序等待下一条消息到达。
在放置报告消息时,为逻辑消息的组或段中的消息生成报告消息的应用程序也不得指定 PMLOGO。
可以使用任何其他 PM* 选项指定 PMLOGO。
上下文选项: 以下选项控制消息上下文的处理:- PMNOC
- 没有要与消息关联的上下文。标识和源上下文都设置为指示无上下文。 这意味着 MQMD 中的上下文字段设置为:
- 字符字段的空白
- 字节字段的空值
- 数字字段的零
- PMDEFC
- 使用缺省上下文。
对于身份和源,此消息将具有与其关联的缺省上下文信息。 队列管理器按如下所示设置消息描述符中的上下文字段:
有关消息上下文的更多信息,请参阅 消息上下文 和 控制上下文信息。MQMD 中的字段 使用的值 MDUID如果可能,根据环境确定; 否则设置为空白。 MDACC根据环境确定 (如果可能); 否则设置为 ACNONE。 MDAID设置为空白。 MDPAT从环境中确定。 MDPAN如果可能,根据环境确定; 否则设置为空白。 MDPD设置为放入消息时的日期。 MDPT设置为放入消息的时间。 MDAOD设置为空白。 如果未指定上下文选项,那么这是缺省操作。
- PMPASI
- 从输入队列句柄传递身份上下文。
该消息将具有与其关联的上下文信息。 身份上下文取自
PMCT字段中指定的队列句柄。 源上下文信息由队列管理器以与 PMDEFC 相同的方式生成 (请参阅上表以了解值)。 有关消息上下文的更多信息,请参阅 消息上下文 和 控制上下文信息。对于 MQPUT 调用,必须已使用 OOPASI 选项 (或暗示该选项的选项) 打开队列。 对于 MQPUT1 调用,将执行与使用 OOPASI 选项的 MQOPEN 调用相同的授权检查。
- PMPASA
- 从输入队列句柄传递所有上下文。
该消息将具有与其关联的上下文信息。 身份和源上下文都取自
PMCT字段中指定的队列句柄。 有关消息上下文的更多信息,请参阅 消息上下文 和 控制上下文信息。对于 MQPUT 调用,必须已使用 OOPASA 选项 (或暗示该选项的选项) 打开队列。 对于 MQPUT1 调用,将执行与使用 OOPASA 选项的 MQOPEN 调用相同的授权检查。
- PMSETI
- 从应用程序设置身份上下文。
该消息将具有与其关联的上下文信息。 应用程序在 MQMD 结构中指定身份上下文。 源上下文信息由队列管理器以与 PMDEFC 相同的方式生成 (请参阅上表以了解值)。 有关消息上下文的更多信息,请参阅 消息上下文 和 控制上下文信息。
对于 MQPUT 调用,必须已使用 OOSETI 选项 (或暗示该选项的选项) 打开队列。 对于 MQPUT1 调用,将执行与使用 OOSETI 选项的 MQOPEN 调用相同的授权检查。
- PMSETA
- 设置应用程序中的所有上下文。
该消息将具有与其关联的上下文信息。 应用程序在 MQMD 结构中指定身份和源上下文。 有关消息上下文的更多信息,请参阅 消息上下文 和 控制上下文信息。
对于 MQPUT 调用,必须已使用 OOSETA 选项打开队列。 对于 MQPUT1 调用,将执行与使用 OOSETA 选项的 MQOPEN 调用相同的授权检查。
只能指定其中一个 PM* 上下文选项。 如果未指定任何这些选项,那么将采用 PMDEFC。
放置响应类型。 以下选项控制返回到 MQPUT 或 MQPUT1 调用的响应。 只能指定其中一个选项。 如果未指定 PMARES 和 PMSRES ,那么将采用 PMRASQ 或 PMRAST。- PMARES
PMARES 选项请求完成 MQPUT 或 MQPUT1 操作,而无需应用程序等待队列管理器完成调用。 使用此选项可以提高消息传递性能,尤其是对于使用客户机绑定的应用程序。 应用程序可以使用 MQSTAT 动词定期检查在任何先前异步调用期间是否发生了错误。
使用此选项时,仅保证在 MQMD 中完成以下字段;- MDAID
- MDPAT
- MDPAN
- MDAOD
- PMSRES
- 在 MQPMO 结构中为 put 选项指定此值可确保始终同步发出 MQPUT 或 MQPUT1 操作。 如果操作成功,那么将完成 MQMD 和 MQPMO 中的所有字段。 提供它是为了确保同步响应,而不考虑在队列或主题对象上定义的缺省 put 响应值。
- PMRASQ
- 如果为 MQPUT 调用指定了此值,那么将从应用程序打开队列时在队列上指定的 DEFpresP 值中获取所使用的 put 响应类型。 如果客户机应用程序以低于 V 7.0的级别连接到队列管理器,那么它的行为就像指定了 PMSRES 一样。
- PMRAST
- 这是与主题对象配合使用的 PMRASQ 的同义词。
其他选项: 以下选项控制授权检查以及队列管理器停顿时发生的情况:- PMALTU
- 使用指定的用户标识进行验证。
这指示 MQPUT1 调用的
OBJDSC参数中的ODAU字段包含用于验证将消息放入队列的权限的用户标识。 仅当此ODAU有权使用指定的选项打开队列时,调用才能成功,而无论运行应用程序的用户标识是否有权执行此操作。 (这不适用于指定的上下文选项,但这些选项始终根据运行应用程序的用户标识进行检查。)此选项仅对 MQPUT1 调用有效。
- PMFIQ
- 如果队列管理器正在停顿,那么失败。
如果队列管理器处于停顿状态,那么此选项会强制 MQPUT 或 MQPUT1 调用失败。
调用返回完成代码 CCFAIL 和原因码RC2161.
缺省选项: 如果不需要任何先前描述的选项,那么可以使用以下选项:- 无
- 未指定任何选项。
此值可用于指示未指定任何其他选项; 所有选项都采用其缺省值。 PMNONE 是为了帮助程序文档; 不打算将此选项与任何其他选项一起使用,但由于其值为零,因此无法检测到此类使用。
这是一个输入字段。
PMOPT字段的初始值为 PMNONE。- PMPRF (10 位有符号整数)
指示存在哪些 MQPMR 字段的标志。
此字段包含必须设置以指示应用程序提供的放入消息记录中存在哪些 MQPMR 字段的标志。 仅当将消息放入分发列表时,才会使用
PMPRF。 如果PMREC为零,或者PMPRO和PMPRP均为零,那么将忽略该字段。对于存在的字段,队列管理器将相应放置消息记录中的字段中的值用于每个目标。 对于不存在的字段,队列管理器使用 MQMD 结构中的值。
可以指定以下一个或多个标志以指示放入消息记录中存在哪些字段:- PFMID
- 存在消息标识字段。
- PFCID
- 存在相关标识字段。
- PFGID
- 存在组标识字段。
- PFFB
- 存在反馈字段。
- PFACC
- 存在记帐标记字段。
如果指定了此标志,那么必须在
PMOPT字段中指定 PMSETI 或 PMSETA; 如果未满足此条件,那么调用将失败并返回原因码RC2158.
如果不存在 MQPMR 字段,那么可以指定以下内容:- PFNONE
- 不存在放置消息记录字段。
如果指定了此值,那么
PMREC必须为零,或者PMPRO和PMPRP都必须为零。定义 PFNONE 以帮助程序文档。 不打算将此常量与任何其他常量一起使用,但由于其值为零,因此无法检测到此类使用。
如果
PMPRF包含无效的标志,或者提供了放置消息记录,但PMPRF的值为 PFNONE ,那么调用将失败并返回原因码RC2158.这是一个输入字段。 此字段的初始值为 PFNONE。 如果
PMVER小于 PMVER2,那么将忽略此字段。- PMPRO (10 位数字带符号整数)
从 MQPMO 开始的第一条放入消息记录的偏移量。
这是从 MQPMO 结构开始的第一个 MQPMR 放置消息记录的偏移量 (以字节为单位)。 偏移可以是正数或负数。 仅当将消息放入分发列表时,才会使用
PMPRO。 如果PMREC为零,那么将忽略该字段。将消息放入分发列表时,可以提供一个或多个 MQPMR 放置消息记录的数组,以便分别为每个目标指定消息的特定属性; 这些属性为:- 消息标识
- 相关标识 (correlation identifier)
- 组标识
- 反馈值
- 记帐标记
不需要指定所有这些属性,但无论选择什么子集,都必须以正确的顺序指定字段。 请参阅 MQPMR 结构的描述以获取更多详细信息。
通常,打开分发列表时,应该有与 MQOD 指定的对象记录一样多的放置消息记录; 每个放置消息记录都提供相应对象记录所标识的队列的消息属性。 分发列表中未能打开的队列仍必须将为其分配的消息记录放在数组中的相应位置,尽管在这种情况下将忽略消息属性。
放入消息记录数可能与对象记录数不同。 如果放入消息记录少于对象记录,那么将从消息描述符 MQMD 中的相应字段中获取没有放入消息记录的目标的消息属性。 如果存在比对象记录更多的放置消息记录,那么不会使用多余的消息记录 (尽管仍必须可以访问这些消息记录)。 放置消息记录是可选的,但如果提供了这些记录,那么其中必须有
PMREC个记录。可以通过在
PMPRO中指定偏移量或在PMPRP中指定地址,以类似于 MQOD 中的对象记录的方式提供放置消息记录; 有关如何执行此操作的详细信息,请参阅 MQOD-对象描述符中描述的ODORO字段。不能使用多个
PMPRO和PMPRP; 调用失败,原因码为RC2159如果两者都是非零的。这是一个输入字段。 此字段的初始值为 0。 如果
PMVER小于 PMVER2,那么将忽略此字段。- PMPRP (指针)
第一条放入消息记录的地址。
这是第一个 MQPMR 放置消息记录的地址。 仅当将消息放入分发列表时,才会使用
PMPRP。 如果PMREC为零,那么将忽略该字段。可以使用
PMPRP或PMPRO来指定放入消息记录,但不能同时指定两者; 请参阅 PMRRO 字段的描述以获取详细信息。 如果未使用PMPRP,那么必须将其设置为空指针或空字节。这是一个输入字段。 此字段的初始值为空指针。 如果
PMVER小于 PMVER2,那么将忽略此字段。- PMREC (10 位数字带符号整数)
存在的放置消息记录或响应记录数。
这是应用程序提供的 MQPMR 放入消息记录或 MQRR 响应记录数。 仅当将消息放入分发列表时,此数字才能大于零。 放置消息记录和响应记录是可选的-应用程序无需提供任何记录,也可以选择仅提供一种类型的记录。 但是,如果应用程序提供了这两种类型的记录,那么它必须提供每种类型的
PMREC记录。PMREC的值不必与分发列表中的目标数相同。 如果提供的记录过多,那么不会使用多余的记录; 如果提供的记录过少,那么会将缺省值用于没有放置消息记录的目标的消息属性 (请参阅本主题后面的PMPRO)。如果
PMREC小于零或大于零,但消息未放入分发列表,那么调用将失败并返回原因码RC2154.这是一个输入字段。 此字段的初始值为 0。 如果
PMVER小于 PMVER2,那么将忽略此字段。- PMRMN (48 字节字符串)
目标队列管理器的已解析名称。
这是本地队列管理器执行名称解析后的目标队列管理器的名称。 返回的名称是拥有由
PMRQN标识的队列的队列管理器的名称,并且可以是本地队列管理器的名称。如果
PMRQN是本地队列管理器所属的队列共享组所拥有的共享队列,那么PMRMN是队列共享组的名称。 如果队列由其他某个队列共享组拥有,那么PMRQN可以是队列共享组的名称,也可以是作为队列共享组成员的队列管理器的名称 (返回的值的性质由本地队列管理器中存在的队列定义确定)。仅当对象是单个队列时,才会返回非空白值; 如果对象是分发列表或主题,那么返回的值未定义。
这是输出字段。 此字段的长度由 LNQMN 给出。 此字段的初始值为 48 个空白字符。
- PMRQN (48 字节字符串)
目标队列的已解析名称。
这是本地队列管理器执行名称解析后目标队列的名称。 返回的名称是由
PMRMN标识的队列管理器上存在的队列的名称。仅当对象是单个队列时,才会返回非空白值; 如果对象是分发列表或主题,那么返回的值未定义。
这是输出字段。 此字段的长度由 LNQN 给出。 此字段的初始值为 48 个空白字符。
- PMRRO (10 位数字带符号整数)
从 MQPMO 开始的第一个响应记录的偏移量。
这是从 MQPMO 结构开始的第一个 MQRR 响应记录的偏移量 (以字节为单位)。 偏移可以是正数或负数。 仅当将消息放入分发列表时,才会使用
PMRRO。 如果PMREC为零,那么将忽略该字段。将消息放入分发列表时,可以提供一个或多个 MQRR 响应记录的数组,以标识消息未成功发送到的队列 (MQRR 中的
RRCC字段) 以及每个失败的原因 (MQRR 中的RRREA字段)。 可能由于队列未能打开或由于 put 操作失败而未发送消息。 仅当调用结果混合时,队列管理器才会设置响应记录 (即,某些消息已成功发送,而其他消息失败,或者所有消息都失败,但原因不同); 来自调用的原因码 RC2136 指示此情况。 如果相同原因码适用于所有队列,那么将在 MQPUT 或 MQPUT1 调用的REASON参数中返回该原因,并且不会设置响应记录。通常,当打开分发列表时,应该有与 MQOD 指定的对象记录一样多的响应记录; 必要时,每个响应记录都设置为放入相应对象记录所标识的队列的完成代码和原因码。 分发列表中未能打开的队列仍必须在数组中的相应位置为它们分配响应记录,尽管它们设置为由打开操作而不是 put 操作生成的完成代码和原因码。
响应记录数可能与对象记录数不同。 如果响应记录少于对象记录,那么应用程序可能无法标识放置操作失败的所有目标或失败原因。 如果有比对象记录更多的响应记录,那么不会使用多余的响应记录 (尽管仍必须能够访问这些响应记录)。 响应记录是可选的,但如果提供了这些记录,那么其中必须有
PMREC个记录。可以通过类似于 MQOD 中的对象记录的方式提供响应记录,方法是在
PMRRO中指定偏移量,或者在PMRRP中指定地址; 有关如何执行此操作的详细信息,请参阅 MQOD-对象描述符中描述的ODORO字段。 但是,不能使用多个PMRRO和PMRRP; 调用失败,原因码为RC2156如果两者都是非零的。对于 MQPUT1 调用,此字段必须为零。 这是因为响应信息 (如果请求) 是在对象描述符 MQOD 指定的响应记录中返回的。
这是一个输入字段。 此字段的初始值为 0。 如果
PMVER小于 PMVER2,那么将忽略此字段。- PMRRP (指针)
第一个响应记录的地址。
这是第一个 MQRR 响应记录的地址。 仅当将消息放入分发列表时,才会使用
PMRRP。 如果PMREC为零,那么将忽略该字段。可以使用
PMRRP或PMRRO来指定响应记录,但不能同时指定这两者; 请参阅 PMRRO 字段的描述以获取详细信息。 如果未使用PMRRP,那么必须将其设置为空指针或空字节。对于 MQPUT1 调用,此字段必须是空指针或空字节。 这是因为响应信息 (如果请求) 是在对象描述符 MQOD 指定的响应记录中返回的。
这是一个输入字段。 此字段的初始值为空指针。 如果
PMVER小于 PMVER2,那么将忽略此字段。- PMSID (4 字节字符串)
结构标识。
该值必须为:- PMSIDV
- put-message 选项结构的标识。
这始终是一个输入字段。 此字段的初始值为 PMSIDV。
- PMSL (MQLONG)
此出版物以预订为目标的级别。
只有最高
PMSL小于或等于此值的预订才会收到此发布内容。 此值必须在 0 到 9 的范围内; 零是最低级别。此字段的初始值为 9。
- PMTO (10 位数字带符号整数)
已保留。
这是保留字段; 其值不重要。 此字段的初始值为
-1。- PMUDC (10 位有符号整数)
成功发送到远程队列的消息数。
这是当前 MQPUT 或 MQPUT1 调用已成功发送到分发列表中解析为远程队列的队列的消息数。 队列管理器在分发列表表单中临时保留的消息计数为这些分发列表包含的各个目标的数目。 将消息放入不在分发列表中的单个队列时,也会设置此字段。
这是输出字段。 此字段的初始值为 0。 如果
PMVER小于 PMVER2,那么不会设置此字段。- PMVER (10 位数字带符号整数)
结构版本号。
值必须为以下其中一项:- PMVER1
- Version-1 put-message 选项结构。
- PMVER2
- Version-2 放置消息选项结构。
仅在结构的最新版本中存在的字段在字段描述中标识为此类字段。 以下常量指定当前版本的版本号:- PMVERC
- 当前版本的 put-message 选项结构。
这始终是一个输入字段。 此字段的初始值为 PMVER1。
初始值
| 字段名称 | 常量的名称 | 常量值 |
|---|---|---|
PMSID |
PMSIDV | 'PMO¬' |
PMVER |
PMVER1 | 1 |
PMOPT |
无 | 0 |
PMTO |
None | -1 |
PMCT |
None | 0 |
PMKDC |
None | 0 |
PMUDC |
None | 0 |
PMIDC |
None | 0 |
PMRQN |
None | 空白 |
PMRMN |
None | 空白 |
PMREC |
None | 0 |
PMPRF |
PFNONE | 0 |
PMPRO |
None | 0 |
PMRRO |
None | 0 |
PMPRP |
None | 空指针或空字节 |
PMRRP |
None | 空指针或空字节 |
注:
|
||
RPG 声明
D*..1....:....2....:....3....:....4....:....5....:....6....:....7..
D* MQPMO Structure
D*
D* Structure identifier
D PMSID 1 4 INZ('PMO ')
D* Structure version number
D PMVER 5 8I 0 INZ(1)
D* Options that control the action of MQPUT and MQPUT1
D PMOPT 9 12I 0 INZ(0)
D* Reserved
D PMTO 13 16I 0 INZ(-1)
D* Object handle of input queue
D PMCT 17 20I 0 INZ(0)
D* Number of messages sent successfully to local queues
D PMKDC 21 24I 0 INZ(0)
D* Number of messages sent successfully to remote queues
D PMUDC 25 28I 0 INZ(0)
D* Number of messages that could notbe sent
D PMIDC 29 32I 0 INZ(0)
D* Resolved name of destination queue
D PMRQN 33 80 INZ
D* Resolved name of destination queuemanager
D PMRMN 81 128 INZ
D* Number of put message records or response records present
D PMREC 129 132I 0 INZ(0)
D* Flags indicating which MQPMR fields are present
D PMPRF 133 136I 0 INZ(0)
D* Offset of first put message record from start of MQPMO
D PMPRO 137 140I 0 INZ(0)
D* Offset of first response record from start of MQPMO
D PMRRO 141 144I 0 INZ(0)
D* Address of first put message record
D PMPRP 145 160* INZ(*NULL)
D* Address of first response record
D PMRRP 161 176* INZ(*NULL)
D* Original message handle
D PMOMH 177 184I 0
D* New message handle
D PMNMH 185 190I 0
D* The action being performed
D PMACT 191 194I 0
D* Reserved
D PMRE1 195 198I 0