在 CICS 中读取动态命名的平面文件

Posted

技术标签:

【中文标题】在 CICS 中读取动态命名的平面文件【英文标题】:Reading a dynamically-named flat file in CICS 【发布时间】:2016-11-30 18:14:50 【问题描述】:

假设我有一个批处理作业,它之前已经运行并创建了一个固定记录长度的平面输出文件。 (每次运行作业的输出文件名都会有所不同。)

我有一个在服务器环境中运行的 CICS 程序,它将接收来自 Web 浏览器的作业结果请求,我想读取文件并返回内容。 (假设要使用的特定文件名将包含在文本中。)

我正在尝试弄清楚如何在 CICS 中实际访问该文件。

我设法使用 CEEENV 动态指定文件名,但后来发现我不能使用本机 OPEN/READ 命令。 我知道有 CICS 读取和浏览命令,但它们似乎都需要事先将文件定义给 CICS?我还看到了使用瞬态数据队列访问顺序文件的参考,但同样,队列需要预先定义。

该文件没有任何特定的结构或合适的键,所以看起来我应该使用 BDAM 文件命令。这似乎需要FCT entry。但我找不到任何像样的例子来说明如何创建它。

显然,Web 服务可能会被频繁地同时调用,所以我需要某种方法来临时将文件与访问它的方式关联起来,一旦我完成它就可以释放它。

显然,我对 CICS 环境不是很熟悉。我觉得我要么错过了一些简单的东西,要么有一个根本原因无法做到这一点。欢迎指点任何一个!

【问题讨论】:

据我所知,您想在 CICS 中读取的任何文件都必须在该特定 CICS 区域中定义。如果您正在运行多个 CICS 区域,或者有 CICS plexing,这可能是一个问题,除非在每个区域中都定义了该文件。另外,因为这种动态分配也会很痛苦。我想知道在这种情况下使用队列是否会更好。 您也许可以在 CICS 中定义一个 GDG 并输入一次并让 CICS 程序获取最新一代,如果我错了,请有人纠正我,但我只能这样考虑让动态分配的文件在 CICS 中工作。 实现您的业务需求的唯一方法是您的站点希望如何实现。有许多方法可以满足您的业务需求,并且“动态分配的文件”极不可能出现在您的解决方案中,更何况是非 VSAM 数据集。您的网站具有服务于安全性和可用性、可维护性、审计、合规性和监管问题的政策、标准和实践(如果业务不是“金融”,则后者较少。在您的网站上询问,而不是在互联网上询问。 此时我只是试图回答是否可以在 CICS 中访问先前由批处理 JCL 创建的顺序平面文件的技术问题。这是要求的具体原因,我不打算讨论。如果不可能,我将不得不考虑其他方法。 “在您的网站上询问,而不是在互联网上询问”在某种程度上违背了 Stack Overflow 的全部目的,但我感谢您的建设性回应 @SaggingRufus 我认为可以使用 CICS SPI 和 enq/define/read/disable/discard/deq 一个指向动态文件的 TD 队列,但是有足够的安全性(和其他)含义,即使是像我这样的人,其理智已经受到怀疑,也不会提及它。等等,哎呀... 【参考方案1】:

我已经通过从 COBOL 调用 C 运行时例程来处理 Unix 系统服务文件。 FOPEN,等。人。可供您使用。

您的程序必须在开放的 TCB 上执行并且线程安全。

如果您运行的是 CICS TS 4.2 或更高版本,则必须将您的程序定义为 CONCURRENCY(REQUIRED),以便您知道它在开放式 TCB 上而不是 QR TCB 上。在 QR TCB 上执行 I/O 不利于性能和吞吐量,并可能影响您的继续工作。如果您执行 I/O 的程序不是事务中的第一个程序,您必须 LINK 处理它,而不是动态地 CALL 它,以便自动进行 TCB 切换。

如果您正在运行 CICS TS 4.1 或更早版本,则必须跳过一些环节才能将事务强制到打开的 TCB 上。希望您使用的是更新的版本。

向您的 CICS 系统程序员解释这一点,您将执行 QSAM I/O,但您将确保您在一个开放的 TCB 上以避免性能问题。

如果您不知道不同 TCB 的含义,请查阅文档。有一个 redbook on the topic of thread safety 涵盖了 TCB。这很值得你花时间。

实现此目的的另一种方法是在批处理作业结束时将数据加载到 DB2 表中(如果您的商店有 DB2)。

【讨论】:

感谢您,我很欣赏有关潜在性能问题的警告。我一直在考虑将 DB 选项作为后备选项,但这可能是更安全的选项。 就像一般的 ROT,根据我的经验,不要混合非 VSAM 文件和 CICS。正如你所看到的,箍是相当广泛的,非常吐和保释线。对于顺序文件,您可以使用 ESDS,但即使在物理上可行,实现逻辑也可能很麻烦。您可能还想查看使用 WMQ 或类似方法的消息类型实现。 @zarchasmpgmr 绝对同意。 “是否可能”、“是否允许”和“这是一个好主意”之间存在显着差异。有时会夹在“不能”和“必须”之间。【参考方案2】:

您可以使用 CICS SPI 动态地为文件进行资源定义,但这不是一个好主意,真的更让人头疼,有太多的考虑因素——高可用性,哪个文件拥有区域,令人头疼的事情比比皆是。

任何事情都可以完成,毕竟它只是一台计算机,但是您将违反过去半个世纪左右构建 CICS/TS 框架的所有假设。它管理资源以获得所有正在运行的任务的最大并发性,从而最大限度地提高所有机器资源的效率。执行您建议的操作可能会使整个区域进入操作系统等待状态并锁定所有内容,除非您正确地对其进行按摩。

如果它只是一个简单的平面文件,请在创建它的作业结束时将其复制到预定义的 ESDS 中并触发您的 CICS 任务从那里读取它,您的调试生活会容易得多,您的 CICS SysProgs 不会恨你,永远诅咒你的名字。或者您可以使用带有唯一文件名和记录序列号的 KSDS,并使用 STARTBROWSE/READNEXT/ENDBROWSE 处理这些记录。

【讨论】:

我同意与 CICS 合作比反对它更好。我们通常使用 KSDS(在这些情况下使用适当的密钥,例如请求 ID)。数据库(DB2 ?)将是 KSDS 的替代方案 - 保存从 CICS 分配/取消分配文件。【参考方案3】:

由于该文件是一个平面文件而不是某种 VSAM 集群,我建议您将其作为输入阅读 Extra Partition Transient Data Queue (Extra TDQ)。

数据集名称可以包含在resource definition 中,但由于无法使用系统编程接口更改数据集名称,因此可以使用 CICS ADYN 工具更改为新数据集,但我建议关闭并使用SET TDQUEUE 命令禁用队列,然后在程序中将其替换为CREATE 命令。

或者,您可以使用某种机制为每个请求创建一个新队列,以确保名称在 CICS 区域内是唯一的,读取队列,然后再次丢弃队列。

【讨论】:

以上是关于在 CICS 中读取动态命名的平面文件的主要内容,如果未能解决你的问题,请参考以下文章

z/OS 如何调用 Web 服务? [关闭]

C++学习笔记:高级编程:文件和流,异常处理,动态内存,命名空间

如何在 Spring Batch 中分别读取平面文件头和正文

插入多个文本文件

循环电子邮件读取平面文件

在 Smalltalk 中读取超时的文件流(命名管道)