分发列表
分发列表允许您在单个 MQPUT 或 MQPUT1 调用中将消息放置到多个目标。可以使用单个 MQOPEN 来打开多个队列,然后可以使用单个 MQPUT 来将消息放置到那些队列中的每个队列。MQI 结构中用于此过程的一些通用信息可由与分发列表中的各个目标关联的特定信息取代。
对象记录 (MQOR) 结构用于提供分发列表中每个目标的 ObjectName 和 ObjecQMgrName。对象描述符 (MQOD) 中的字段 RecsPresent 指示正在使用某个分发列表。如果 RecsPresent 大于零,则它包含分发列表中的对象记录数量。
对象描述符中有两个指向对象记录的字段:ObjectRecOffset 和 ObjectRecPtr。这些字段是相互排斥的。
ObjectRecOffset 是第一个 MQOR 相对于对象描述符开头的偏移。此方法有利于不支持指针数据类型或实现指针数据类型的方法在环境之间不可移植(例如,COBOL)的编程语言。
ObjectRecPtr 是指向 MQOR 数组开头的指针。建议对以可移植的方式支持指针数据类型的编程语言(例如 C 语言)使用此方法。
每个 MQOR 中的 ObjectName 是队列名称,而且一定不能是模型队列ObjectQMgrName 是队列所在的队列管理器的名称。请注意,MQOD 是由应用程序构建的;分发列表不是管理员定义的 WebSphere MQ 对象。
在为分发列表中的所有队列构建 MQOR 并为对象描述符设置 RecsPresent 与 ObjectRecOffset 或 ObjectRecPtr 时,将发出 MQOPEN。
每个目标队列都单独地打开,意味着有些可能成功,其他无效的则会失败。如果所有队列都成功打开,则从 MQOPEN 返回的完成代码将是 MQCC_OK。如果所有队列都未能打开,则完成代码将是 MQCC_FAILED。然而,如果有些队列成功打开而有些队列未能打开,则完成代码将是 MQCC_WARNING。对于失败和警告,原因代码都将是 MQRC_MULTIPLE_REASONS。
对象描述符中的三个 *_DEST_COUNT 字段将在 MQOPEN 后被更新:
| KnownDestCount | 成功打开的本地队列数量。 |
| UnknownDestCount | 成功打开的远程队列数量。 |
| InvalidDestCount | 未能成功打开的队列数量。 |
所打开的每个队列的完成代码和原因代码将在一个称为响应记录 (MQRR) 的结构中返回。与前面的对象记录一样,对象描述符的 RecsPresent 字段给出响应记录的数量。而且与前面一样,有两种对 MQRR 数组寻址的方法:定义偏移的 ResponseRecOffset 或指向地址的 ResponseRecPtr。MQRR 记录和偏移或指针必须在调用 MQOPEN 之前设置。
放置消息选项 (MQPMO) 结构中有几个字段与分发列表相关。
PutmsgRecFields 包括标志,指示放置消息记录 (MQPMR) 结构中存在哪些字段。可以指定一个或多个标志:
| MQPMRF_MSG_ID | 消息标识符 |
| MQPMRF_CORREL_ID | 相关性标识符 |
| MQPMRF_GROUP_ID | 组标识符 |
| MQPMRF_FEEDBACK | 反馈 |
| MQPMRF_ACCOUNTING_TOKEN | 记帐令牌 |
| MQPMRF_NONE | 不存在放置消息记录 |
RecsPresent 字段提供放置消息记录的数量计数。PutMsgRecOffset 和 PutMsgRecPtr 分别提供第一个放置消息记录的偏移或第一个放置消息记录的地址,并且是相互排斥的。如果不存在放置消息记录,则两个字段都应该包含零。
放置消息记录 (MQPMR) 结构最多可以包含五个字段:
| MsgId | 将用于发送到如下队列的消息的消息标识符,该队列的名称由 MQOPEN 或 MQPUT1 调用上提供的 MQOR 结构数组中的对应元素所指定。对于那些没有包含 MsgId 的 MQPMR,则使用消息描述符 MsgId 字段中的值。如果该值为 MQMI_NONE,则为那些目标中的每一个生成唯一的 MsgId(不会有两个目标具有相同的 MsgId)。如果指定了 MQPMO_NEW_MSG_ID,则为分发列表上的每个目标生成新的 MsgId,而不管它们是否有 MQPMR 记录。 |
| CorrelId | 将用于发送到如下队列的消息的相关性标识符,该队列的名称由 MQOPEN 或 MQPUT1 调用上提供的 MQOR 结构数组中的对应元素所指定。如果此字段不存在,或者 MQPMR 比目标少,则使用消息描述符的 CorrelId 字段。如果指定了 MQPMO_NEW_CORREL_ID,则生成单个新的相关性标识符,并用于分发列表中的所有消息。 |
| GroupId | 将用于发送到如下队列的消息的组标识符,该队列的名称由 MQOPEN 或 MQPUT1 调用上提供的 MQOR 结构数组中的对应元素所指定。消息描述符的 GroupId 的使用方式与上面对 MsgId 和 CorrelId 描述的条件相同。 |
| Feedback | 用于发送到如下队列的消息,该队列的名称由 MQOPEN 或 MQPUT1 调用上提供的 MQOR 结构数组中的对应元素所指定。如果不存在,则使用消息描述符的 Feedback 字段。 |
| AccountingToken | 用于发送到如下队列的消息,该队列的名称由 MQOPEN 或 MQPUT1 调用上提供的 MQOR 结构数组中的对应元素所指定。如果不存在,则使用消息描述符的 AccountingToken 字段。 |
正如在用于分发列表的 MQOPEN 中所描述的,同样的情况也适用于 MQPUT。仅当所有放置都成功时,才会返回 MQCC_OK。仅当所有放置都失败时,才会返回 MQCC_FAILED,并在有些成功而有些失败时返回 MQCC_WARNING。如果返回 MQCC_WARNING 或 MQCC_FAILED,则原因代码将为 MQRC_MULTIPLE_REASONS。
每个队列的响应记录将包含针对该队列的放置操作的完成代码和原因代码。由于队列管理器对每个队列发出一个单独的 MQPUT,因此单独跟踪每个放置操作是可能的。
MQPMO 结构的 KnownDestCount、UnknownDestCount 和 InvalidDestCount 字段分别提供成功发送到本地队列的消息、成功发送到远程队列的消息和未能成功发送的消息的计数。
尝试进行的每个放置操作的完成代码和原因代码将在一个称为响应记录 (MQRR) 的结构中返回。MQPMO 结构的 RecsPresent 字段给出响应记录数量。而且与前面一样,有两种对 MQRR 数组寻址的方法:定义偏移的 ResponseRecOffset 或指向地址的 ResponseRecPtr。MQRR 记录和偏移或指针必须在调用 MQOPEN 之前设置。
关闭分发列表时,除 MQCO_NONE 以外的任何关闭选项都将产生原因代码 MQRC_OPTION_NOT_VALID_FOR_TYPE 或 MQRC_OPTIONS_ERROR。
只有 MQCLOSE 的完成代码和原因代码可用于诊断目的。不返回任何单独的完成代码和原因代码,并且不标识任何遇到错误的队列。即使可能发生故障,队列管理器也会继续处理,并尝试关闭分发列表中的其余队列。