假设我有一个先前运行并创建了固定记录长度的平面输出文件的批处理作业。 (输出文件名将因作业的每次运行而异。)
我在服务器环境中运行的CICS程序将从Web浏览器接收作业结果的请求,我想读取该文件并返回内容。 (假设要使用的特定文件名将包含在文本中。)
我正在尝试研究如何在CICS中实际访问该文件。
我设法使用CEEENV动态指定文件名,但后来发现我不能使用本机OPEN / READ命令。 我知道有CICS读取和浏览命令,但它们似乎都需要事先将文件定义到CICS?我也看到过使用瞬态数据队列来访问顺序文件的引用,但同样需要预先定义队列。
该文件没有任何特定的结构或合适的密钥,因此看起来我应该使用BDAM文件命令。这似乎需要FCT entry。但我找不到任何关于如何创建它的正确例子。
显然,Web服务可以经常和同时调用,所以我需要一些临时关联文件的方法来访问它,一旦我完成它就可以释放它。
显然,我对CICS环境并不熟悉。我觉得我要么缺少一些简单的东西,要么就是为什么不能这样做的根本原因。我们欢迎指向任何一个的指针!
答案 0 :(得分:3)
我通过从COBOL调用C运行时例程来完成Unix Systems Services文件。 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的redbook on the topic of thread safety。这非常值得您花时间。
实现此目的的另一种方法是在批处理作业结束时将数据加载到DB2表中(如果您的商店有DB2)。
答案 1 :(得分:1)
您可以使用CICS SPI动态地为文件执行资源定义,但这不是一个好主意,实际上更多的是痛苦,有太多的考虑因素 - 高可用性,哪个文件拥有地区,头痛比比皆是。
任何事情都可以完成,毕竟它只是一台计算机,但是你将违反在过去半个世纪左右构建CICS / TS框架的所有假设。它管理资源以获得所有运行的任务的最大并发性,从而最大限度地提高所有机器资源的效率。按照你的建议做可以将整个区域置于操作系统等待状态并将所有内容锁定,除非你正好按摩它。
如果它只是一个简单的平面文件,请在创建它的作业结束时将其复制到预定义的ESDS中并触发您的CICS任务从那里读取它,您的调试生命将更加容易,并且您的CICS SysProgs将不会恨你,永远诅咒你的名字。或者您可以使用键入唯一文件名和记录序列号的KSDS,并使用STARTBROWSE / READNEXT / ENDBROWSE处理这些记录。
答案 2 :(得分:1)
由于该文件是平面文件,而不是某种VSAM群集,因此建议您将其作为输入Extra Partition Transient Data Queue (Extra TDQ)阅读。
数据集名称可以包含在resource definition中,但是由于无法使用系统编程接口更改数据集名称,因此可以使用CICS ADYN工具来更改为新数据集。建议使用SET TDQUEUE命令关闭并禁用队列,然后在程序中使用CREATE命令替换该队列。
或者,您可以使用某种机制为每个请求创建一个新队列,以确保名称在CICS区域内是唯一的,读取该队列,然后再次丢弃该队列。