使用 JZOS 工具包的 JCL 作业中所有 z/OS DD 语句的列表

Posted

技术标签:

【中文标题】使用 JZOS 工具包的 JCL 作业中所有 z/OS DD 语句的列表【英文标题】:List of all z/OS DD statements in JCL job using JZOS toolkit 【发布时间】:2019-12-09 19:01:51 【问题描述】:

是否可以使用 z/OS JZOS Java 工具包找到为给定步骤定义的所有 DD 语句的列表?

我可以使用ZFile.readJFCB 方法按名称获取有关特定DD 语句的信息,但我没有找到任何可以列出所有DD 语句的方法。

是否可以使用 C/C++ API 和 JNI 来实现?

【问题讨论】:

【参考方案1】:

是的,可以获得分配给您的作业步骤的 DD 语句列表。

完成此操作的典型方法是扫描称为“任务 I/O 表”或 TIOT 的 z/OS 数据结构。 TIOT 包含每个当前分配的 DD 语句的条目,包括连接文件等。

这通常是大型机汇编语言的任务,但如果您不反对使用指针,您可以使用 C(或 Java)来完成。我要做的是运行 IBM 的“C DSECT”实用程序,它将汇编语言数据结构转换为 C 结构,以便您可以将它们包含在您的 C 程序中。除了 TIOT 的汇编器映射宏(它是 IEFTIOT1),您还需要“任务控制块”(TCB - 宏 IKJTCB)和可能的“前缀存储区”(PSA - IHAPSA)。

当您的应用程序代码正在运行时,绝对位置 0 是 PSA,标签 PSATOLD 指向最后分派的 TCB - 这将是您正在运行的任务。在 TCB 中有一个指向 TIOT - TCBTIO 的指针。因此,几行 C 就可以让您开始 TIOT。

TIOT 有一个前缀,因此您想访问标签“TIOENTRY”……每个分配的文件都有一个前缀。在其中,您将看到 TIOEDDNM - DDNAME(或空白,用于连接文件),因此如果您只是遍历 TIOENTRY 结构,则可以收集所有 DDNAME。

我跳过了一些小细节 - 您需要验证 TIOENTRY 结构以确保它们不是“可用空间”条目(这在 TSO 中很常见)并且您需要知道TIOELNGH 具有您添加到 TIOENTRY 以到达下一个的 TIOENTRY 长度。一旦您像我描述的那样轻松地扫描 TIOT,您会发现它指向您可能需要确定给定文件的几乎任何特征的所有结构。

【讨论】:

很好的答案!您可以使用固定偏移量和JZOS ZUtil.peekOSMemory 方法在纯Java 中跟踪PSA/TCB/TIOT 控制块。有一个例子here。【参考方案2】:

根据JZOS documentation,这是不可能的。 但是你为什么需要它呢?

您无法处理程序中所有可能的 DD 语句。你应该只期待特定的。如果要传递动态数量的 DD 语句(几个输入文件),可以使用预定义的名称。

例如:

//INPUT01 DD DSN=...  
//INPUT02 DD DSN=...

在您的 Java 代码中,您可以创建一个循环来检查 INPUT01-99 是否存在 -> 然后使用它。

【讨论】:

基于 Java 的系统取代了旧系统。在旧系统中,最终用户能够添加任意 DD 语句,并且程序能够发现名称并使用它。我无法提供有关如何完成的更多详细信息,只是不知道。我假设它是通过某种低级 C API 完成的。

以上是关于使用 JZOS 工具包的 JCL 作业中所有 z/OS DD 语句的列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 z/OS 上将 java 作为作业步骤运行

z/VSE 示例 jcl 将顺序文件打印到假脱机

从 z/OS 批处理作业运行 XA/JTA 事务

识别环境、z/OS UNIX 与 JCL 或 TSO

如何通过 Java Web 应用在 IBM z OS 中提交 JCL?

在 z/OS Assembler 中,我可以读取 JCL 输入流两次吗?