0

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

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

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

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

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

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

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

4

3 回答 3

3

我已经通过从 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 是关于什么的,请查阅文档。有一本关于线程安全主题的红皮书涵盖了 TCB。这很值得你花时间。

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

于 2016-11-30T20:52:58.233 回答
1

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

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

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

于 2016-12-03T17:54:01.090 回答
1

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

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

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

于 2018-06-27T11:46:19.177 回答