call message queue(调用消息队列)

调用消息队列用于在一个程序或过程与另一个程序或过程之间发送消息。

只要程序或过程在调用堆栈上 (尚未返回) ,其调用消息队列就处于活动状态,并且可以将消息发送到该程序或过程。 程序或过程返回后,无法再向其发送消息。 可以发送到调用消息队列的消息类型包括参考,请求,完成,诊断,状态,转义和通知。

当调用 OPM 程序或 ILE 过程时,将创建该程序或过程的调用消息队列。 调用消息队列仅与运行程序或过程的调用堆栈项独占关联。 通过标识调用堆栈项来间接标识调用消息队列。 调用堆栈项由在该调用堆栈项中运行的程序或过程的名称标识。

对于 OPM 程序,关联的调用堆栈项由 (最多) 10 个字符的程序名标识。 对于 ILE 过程,关联的调用堆栈项由三个部分的名称标识,该名称由 (最多) 4096 个字符的过程名, (最多) 10 个字符的模块名和 (最多) 10 个字符的程序名组成。 模块名称是编译过程的模块的名称。 ILE 程序名是与模块绑定的 ILE 程序的名称。

当标识 ILE 过程的调用堆栈项时,仅指定过程名称就足够了。 如果过程名称本身不唯一地标识调用堆栈项,那么还可以指定模块名或 ILE 程序名。 如果在发送消息时程序或过程在调用堆栈上多次出现,那么指定的名称将标识最近调用的该程序或过程的出现。

如果编译了 OPM 或 ILE 程序,然后在它位于调用堆栈上时将其替换,那么在使用程序名来引用调用堆栈项时必须小心。 对于堆栈上早于执行替换操作的点的调用堆栈条目,名称引用将解析为 QRPLOBJ 中现在存在的已替换对象。 只要被替换的对象继续存在于 QRPLOBJ 库中,这些名称引用就有效。 对于堆栈上比执行替换操作的点更新的条目,名称引用适用于程序的新版本。 由于确定要使用的版本的方式,因此不应将程序直接放在库 QRPLOBJ 中。 此库应专门用于程序的已替换版本。 对直接放入 QRPLOBJ 中的程序的名称引用将失败。

如果在调用堆栈上出现程序对象时将其除去或重命名,那么对已除去程序的任何名称引用或使用旧名称的任何名称引用都将失败。 对于 ILE 过程,如果仅将过程和模块名称用于引用,那么重命名程序不会影响名称引用。 如果您还在使用 ILE 程序名,那么名称引用将失败。

当程序或过程结束时,程序或过程的调用堆栈项的消息队列不再可用。 只能使用消息的消息引用键在该点引用关联的调用消息队列上的消息。

例如,假定过程 A 调用调用过程 C 的过程 B。 过程 C 向过程 B 发送消息并结束。 该消息可用于过程 B。 但是,当过程 B 结束时,其调用消息队列不再可用。 因此,即使消息显示在作业记录中,您也无法使用过程 A 来访问过程 B。 除非过程 A 具有该消息的消息引用键,否则过程 A 无法访问发送到过程 B 的消息。

call message queue(调用消息队列)
如果过程 A 需要删除特定消息,您可以执行以下操作:
  • 让过程 C 将特定消息发送到过程 A
  • 使过程 B 移动或将消息重新发送到过程 A

下图显示了过程调用,作业消息队列和调用堆栈入口队列的关系。 过程 A 将消息发送至自身和 *EXT ,然后调用过程 B。 过程 B 调用过程 C。过程 C 将消息发送至其调用者 (过程 B) ,然后调用过程 D。过程 D 将消息发送至其自身并调用过程 B。连接线 (-----) 指示与过程的调用关联的消息队列。

过程调用,作业消息队列和调用堆栈入口队列的关系。
在上图中,过程 B 有两个调用堆栈入口队列,每个调用一个用于过程。 过程 C 没有消息队列,因为没有消息发送到过程 C。 当过程 C 向过程 B 发送消息时,该消息将进入过程 B 的最后一次调用的调用堆栈入口队列。
注: 使用命令输入屏幕时,可以通过按 F10 (包括详细消息) 来显示发送到作业消息队列的所有消息。 显示消息后,可以使用其中一个滚动键对其进行滚动。

您还可以使用 Display Job Log (DSPJOBLOG) 命令来显示作业的消息。