本地确定的错误
本地确定的错误信息,包括 MQI 调用失败、系统中断和包含错误数据的信息。
- MQI 调用失败;例如,由于队列已满导致调用失败
- 应用程序所依赖的系统的某部分运行中断;例如,队列管理器中断
- 无法成功处理包含数据的消息
如果使用的是异步放入功能,那么将不会立即报告错误。 使用 MQSTAT 调用可以检索上一个异步放置操作的状态信息。
MQI 调用失败
队列管理器可立即报告 MQI 调用编码中的任何错误。 它使用预定义的返回码完成此操作。 返回码分为完成代码和原因码。
为了显示调用是否成功,队列管理器会在调用完成后返回一个完成代码。 完成代码包含三种,指示调用成功、部分完成和调用失败。 队列管理器还会返回一个原因代码,说明调用部分完成或失败的原因。
将在 返回码中列出每个调用的完成代码和原因码以及该调用的描述。 有关更多详细信息,包括纠正措施的想法,请参阅 信息和原因代码。
设计您的程序以处理每个调用可能产生的所有返回码。
系统中断
如果应用程序所连接的队列管理器必须从系统故障中恢复,那么应用程序可能感知不到任何中断。 但是,您必须设计自己的应用程序,以使其在发生此类中断时能够确保不丢失任何数据。
AIX®, Linux®, and Windows 系统- 在这些环境中,您可以按常规方式调用 MQPUT 和 MQGET,但必须使用 MQCMIT 和 MQBACK 调用声明同步点(请参阅 提交和退出工作单元)。 在 CICS® 环境中,MQCMIT和MQBACK命令被禁用,因为您可以在 CICS 管理的单元内进行MQPUT和MQGET调用。
IBM® i- 您可以在由 IBM i 落实控制管理的全局工作单元中执行 MQPUT 和 MQGET 调用。 您可以使用本机 IBM i COMMIT 和 ROLLBACK 命令或特定于语言的命令来声明同步点。 本地工作单元由 IBM MQ 使用 MQCMIT 和 MQBACK 调用进行管理。
z/OS®- 在 CICS 和 IMS 环境中,您可以在由 CICS 或 IMS 管理的工作单元内调用 MQPUT 和 MQGET。 在批处理环境中,可以使用相同的方式实施 MQPUT 和 MQGET 调用,但是必须使用以下方式声明同步点:
- IBM MQ for z/OS MQCMIT 和 MQBACK 调用(请参阅 提交和退出工作单元),或
- z/OS 事务管理和可恢复 Resource Manager 服务 (RRS) ,用于提供两阶段同步点支持。 RRS 允许您在单个逻辑工作单元中更新 IBM MQ 和其他支持 RRS 的产品资源,例如 Db2® 存储过程资源。 有关 RRS 同步点支持的信息,请参阅 事务管理和可恢复资源管理器服务。
在 AIX, Linux, and Windows 上使用 IBM MQ 时,应用程序中的 MQGET 或 MQPUT 调用将在填充所有日志文件时失败,并显示信息 MQRC_RESOURCE_PROBLEM。 有关 AIX, Linux, and Windows 上日志文件的更多信息,请参阅 日志:确保信息不会丢失。
有关z/OS,请参阅规划z/OS上的日志记录环境。
如果操作员在应用程序运行期间停止队列管理器,那么通常会使用停顿选项。 队列管理器将进入停顿状态,在该状态下应用程序可以继续运行,但必须尽快终止。 小的快速应用程序可以忽略该停顿状态并继续,直到其正常终止。 运行时间较长的应用程序或等待接收消息的应用程序,应当在使用 MQOPEN、MQPUT、MQPUT1 和 MQGET 调用时使用如果停顿则失败选项。 这些选项意味着当队列管理器停顿时调用将失败,但应用程序仍有时间通过发出忽略停顿状态的调用来彻底终止。 此类应用程序还可以落实或放弃所做的更改,然后再终止。
如果强制停止队列管理器(即不停顿,直接停止),那么当应用程序实施 MQI 调用时将收到 MQRC_CONNECTION_BROKEN 原因码。 退出应用程序,或者,在 IBM MQ for IBM i, AIX, Linux, and Windows 系统上,发出 MQDISC 调用。
包含不正确数据的消息
在应用程序中使用工作单元时,如果程序无法成功处理从队列检索的消息,那么将回退 MQGET 调用。
队列管理器会在消息描述符的 BackoutCount 字段中保持发生回退的次数。 它会在受影响的每个消息的描述符中保持该计数。 该计算可以提供关于应用程序效率的有价值信息。 回退计数随时间增大的消息表明遭反复拒绝;请设计您的应用程序,以使其分析出现此情况的原因并相应地处理此类消息。
在IBM MQ for z/OS上,要使退订计数在队列管理器重启后仍能继续使用,请将HardenGetBackout属性设置为 MQQA_BACKOUT_HARDENED;否则,如果队列管理器必须重启,它将无法保持每条消息的准确退订计数。 使用这种方法设置属性会增加额外处理。
在 IBM MQ for
IBM i, AIX, Linux, and Windows 系统上,后退计数始终会在队列管理器重启后继续存在。
此外,在 IBM MQ for z/OS上,当您从工作单元内的队列中移除消息时,您可以标记一条消息,以便在应用程序退出工作单元时不再提供该消息。 对于标记的消息,会将其视为已在新的工作单元下检索。 在使用 MQGET 调用时,使用 MQGMO_MARK_SKIP_BACKOUT 选项 (在 MQGMO 结构中) 标记要跳过回退的消息。 有关此技术的更多信息,请参阅 Skipping backout 。