![[UNIX、Linux、Windows、IBM i]](ngmulti.gif)
报告和分段消息
在 IBM® MQ for z/OS®上不受支持。
如果消息已分段且您要求生成报告,那么相比于未分段消息,您可能会收到更多报告。
有关分段消息的描述,请参阅 消息分段。
对于 IBM MQ 生成的报告
如果您对消息进行分段或允许队列管理器对消息进行分段,那么只有一种情况可以接收整个消息的单一报告。 那就是当您只请求了 COD 报告,且已在获取应用程序上指定 MQGMO_COMPLETE_MSG 时。
其他情况下,您的应用程序必须准备处理多个报告,通常是每个分段一个报告。
应用程序生成的报告
如果应用程序生成报告,请始终将原始消息数据开头提供的 IBM MQ 头复制到报告消息数据。
然后向报告消息数据添加空内容、100 字节的原始消息数据或所有原始消息数据(或您通常包含的其他数据量)。
Format 名称指示这些 IBM MQ 头:- MQMDE
- MQDLH
- MQXQH
- MQIIH
- MQH*
Format 名称出现在 MQDLH 和 MQXQH 的特定位置,但对于其他 IBM MQ 头,它出现在同一位置。 头的长度包含在一个字段中,该字段也出现在 MQMDE , MQIMS和所有 MQH* 头的相同位置。
如果您使用的是第一版 MQMD,并且您要报告分段或报告组中的消息或报告允许分段的消息,那么报告数据必须以 MQMDE 开头。 将 OriginalLength 字段设置为原始消息数据的长度,不包括您找到的任何 IBM MQ 头的长度。
检索报告
如果要求获取 COA 或 COD 报告,您可以请求使用 MQGMO_COMPLETE_MSG 重新组合这两种报告。
以下情况满足带有 MQGMO_COMPLETE_MSG 的 MQGET:队列上有足够的报告消息(属于一种类型(例如 COA),并带有相同的 GroupId)来表示一条完整的原始消息时。 即使报告消息本身不包含完整原始消息,此情况依然成立;每条报告消息中的 OriginalLength 字段提供由此报告消息表示的原始数据的长度,即使数据本身不存在。
即使队列上存在多种不同的报告类型 (例如, COA 和 COD) ,您也可以使用此方法,因为具有 MQGMO_COMPLETE_MSG 的 MQGET 仅在具有相同的 Feedback 代码时才会重新组合报告消息。 但是,您通常无法将此技术用于异常报告,因为通常,这些报告具有不同的 Feedback 代码。
您可以使用此方法获取整个消息已到达的明确指示。 但是,在大多数情况中,您需要应对一部分分段到达,而另外一部分分段生成异常(或到期,如果您允许)的可能。 在这种情况下,您无法使用 MQGMO_COMPLETE_MSG ,因为通常,您可能会针对不同的段获得不同的 Feedback 代码,并且可能会针对一个段获得多个报告。 但您可以使用 MQGMO_ALL_SEGMENTS_AVAILABLE。
考虑到这点,您可能需要在收到报告时检索报告,然后在应用程序中分析原始消息所发生的状况。 您可以使用报告消息中的 GroupId 字段将报告与原始消息的 GroupId 相关联,并使用 Feedback 字段标识每条报告消息的类型。 执行此操作的方式取决于您的应用程序需求。
- 要求获取 COD 报告和异常报告。
- 经过特定时间后,使用 MQGMO_COMPLETE_MSG 检查是否已收到一组完整的 COD 报告。 如果已经收到,您的应用程序将知道整个消息已处理。
- 如果没有收到,将显示与此消息相关的异常报告,处理问题的方式与未分段消息一样,但会确保清除某些位置上的孤立分段。
- 如果某些分段没有任何类型的报告,原始分段(或报告)可能正在等待重新连接通道,或者是网络在某个时间点超载。 如果未收到任何异常报告(或者您认为收到的异常只是暂时的),您可能会决定让您的应用程序多等待一会儿。
与之前一样,注意事项与处理未分段消息时类似,但必须同时考虑清除孤立分段的可能性。
后备级别队列管理器
当报告由支持分段的队列管理器生成,但在不支持分段的队列管理器上接收时,除了消息中的零个字节、100 个字节或所有原始数据外,报告数据中将始终包含 MQMDE 结构(用于标识由报告表示的 Offset 和 OriginalLength)。
但是,如果消息分段通过不支持分段的队列管理器,并在其中生成了报告,原始消息中的 MQMDE 结构将纯粹地视为数据。 因此,如果请求零字节的原始数据,MQMDE 结构不会包含在报告数据中。 没有 MQMDE,报告消息可能不是很有用。
如果消息可能会通过后备级别队列管理器,请至少请求报告中 100 字节的数据。