CICS TDQ概述1

CICS TDQ概述

1、CICS queues (队列设施)

有时候CICS应用的程序间可能需要传递超过32K的数据,此时COMMAREA就无法完 成,通常我们用队列来过渡进行程序间大量数据的传递.

CICS中有两类队列:瞬时数据队列(TDQ) 和临时存储队列(TSQ).

TDQ – Transient Data Queue

TSQ – Temporary Storage Queue

1.1 Two CICS services

Temporary storage control- Provides a simple way to store data outside the working storage area of a program. The data is stored in simple files called Temporary Storage Queues, Data will be lost if CICS is shut down.

Transient data control- Provides a convenient way to use sequential files called Destinations to store data. Records written to a destination are added to the end of the destination. Records are read sequentially from a destination and then deleted.

瞬时数据队列(TDQ)又分为两种:

内部(Intrapartition transient data)瞬时数据队列

外部(Extrapartition transient data)瞬时数据队列

队列在CICS中又称为目的地(Destination).

内部TDQ的所有队列的元素(数据项)存储在一个特定的VSAM数据集中,这个数据集由CICS进行管理,它只能被CICS访问,它在CICS启动的JCL或PROC中用DD语句指定,一旦CICS启动后它就被CICS独占,其它批处理程序(batch)是不能直接访问的;而外部TDQ的每一个队列是一个单独的顺序数据集,由用户或管理员用CICS的资源定义工具,如CEDA,定义到CSD文件中去.它允许在不出现冲突的情况下同时被CICS程序和批程序读取.

瞬时数据队列TDQ允许写到队列中的数据被另外一个事务程序使用或脱机处理,它必须预先定义在DCT (Destination Control Table)中.

目的地如果与分配给CICS区域的设施关联,就是内部(IntraPartition)瞬时数据队列;如果数据是要导出到 CICS区域外的目的地的,则是外部的(ExtraPartition) 瞬时数据队列.

CICS对瞬时数据队列提供了3个应用编程接口:

(1)写数据到一个瞬时数据队列(WRITEQ TD命令);

(2)从一个瞬时数据队列读数据(READQ TD命令);

(3)删除一个内部瞬时数据队列(DELETEQ TD命令).

内部(Intrapartition)瞬时数据是指作为独立任务运行的一个或多个程序所用的在直接访问的存储设备 (DASD)上的数据, 被导入/导出内部的存储地点的数据被称为内部瞬时数据,它必须由可变长的记录组成.

1.2 内部瞬时数据的特性

(1)所有的队列使用同一个VSAM(ESDS)数据集,也就是说某个CICS区域使用一个ESDS格式的VSAM文件来存储该区域里的所有的内部瞬时数据队列的元素.

(2)记录是可变长度格式.

(3)每个队列的记录必须按照一个接一个地顺序写入.

(4)每个队列的记录被顺序检索.一旦一个记录被读出, 它就不能再被任何任务所访问(record will be removed),也就是说对内部瞬时数据队列的读是破坏性读取.

(5)可用内部瞬时数据队列进行自动进行任务初始化(Auto Task Initiate ,ATI).

(6)不可修改记录.

访问瞬时数据队列

当执行READQ/WRITEQ TD命令时,通过TDP访DCT,来对内部瞬时数据集VSAM (ESDS)数据集进行顺序操作.

1.3 外部瞬时数据

外部(Extrapartition)目的地是:存放任一种顺序设备(sequential device)(DASD, 磁带, 打印机,等等)上的队列(数据集),这些数据集是被在CICS区域内(或外)的程序访问的。通常来说,顺序外部瞬时数据队列用来存储和获得在CICS区域外的数据。

外部(Extrapartition)队列的记录格式必须在DCT中被系统程序员定义。

向瞬时数据队列写入数据 WRITEQ命令既可用于内部数据队列又可用于外部瞬时数据队列的写操作。

命令基本格式为:

EXEC CICS WRITEQ TD QUEUE (name) FROM (data-area) [LENGTH (data -value)]

其功能为将data-area指定的COBOL变量的内容作为一条记录写入名字为name的TDQ队列中。

从瞬时数据队列读入数据READQ命令既可用于内部数据队列又可用于外部瞬时数据队列的读取。

命令基本格式为:

EXEC CICS READQ TD QUEUE (name) INTO (data-area) [LENGTH (data-area)]

其功能为从名字为 name的 TDQ中读取记录放到 data-area指定的COBOL变量中。

TDQ队列的删除

没有专门对于队列中项记录进行删除的命令,只能对整个队列即所有项的删除的操作。

前面讲过对TDQ队列的读是一种破坏性读取,当某条记录被读后,相当于该记录也被删除了。并且DELETEQ命令只适用于内部瞬时队列的删除。它用于删除所有与该队列名相关的记录。所有在内部VSAM数据集上与该队列相关的内容会被删除,而相应的存储空间会被释放。很显然DELETEQ是一种物理删除,因此需谨慎考虑好再删除。

EXEC CICS DELETEQ TD QUEUE (name)

其功能为删除名为name的整个内部TD。

1.4 写瞬时数据队列的例子

WORKING-STORAGE SECTION.

01 WRKFLDS.

05 TD-RECL PIC S9(4) COMP.

05 TD-ERR-CODE PIC S9(8) COMP.

05 F-ERR-CODE PIC S9(8) COMP.

05 F-NUMB PIC X(6) VALUE ZERO.

01 TD-REC.

02 TD DATE PIC X(8).

02 TD-NUMB PIC X(6).

02 TD-AMOUNT PIC X(8).

0l FILEREC

02 STAT PIC X.

02 NUMB PIC X(6).

02 AMOUNT PIC X(8).

PROCEDURE DIVISION.

EXEC CICS STARTBR FILE(‘FILEA’ )

RIDFLD(F-NUMB)

GTEQ

END-EXEC.

PERFORM UNTIL F-ERR-CODE EQUAL DFHRESP(ENDFILE)

EXEC CICS READNEXT FILE(‘FILEA’ )

INTO (FILEREC )

RIDFLD(F-NUMB)

RESP (F-ERR-CODE)

END-EXEC.

IF F-ERR-CODE EQUAL DFHRESP(NORMAL)

MOVE EIBDATE TO TD-DATE

MOVE NUMB TO TD-NUMB

MOVE AMOUNT TO TD-AMOUNT

MOVE 22 TO TD-RECL

EXEC CICS WRITEQ TD QUEUE(‘LSTC’ )

FROM(TD-REC )

LENGTH (TD-RECL )

RESP (TD-ERR-CODE )

END-EXEC.

IF TD-ERR-CODE NOT EQUAL DFHRESP(NORMAL)

PERFORM ERROR-ROUTINE

END-IF

ELSE

IF F-ERR-CODE NOT EQUAL DFHRESP(ENDFILE)

PERFORM ERROR-ROUTINE

END-IF

END-IF

END-PERFORM

EXEC CICS ENDBR FILE(‘FILEA’ )

END EXEC.

EXEC CICS RETURN END-EXEC.

说明:

1、例子中的GTEQ为大于等于之意。

EXEC CICS STARTBR FILE(‘FITEA’ )

RIDFLD(F-NUMB)

GTEQ

END-EXEC.

2、程序中斜体部分为将长度为TD-RECL的记录TDREC写向队列LSTC中,并将返回码写入TDERR-CODE中。

3、

IF F-ERR-CODE NOT EQUAL DFHRESP(ENDFILE)

PERFORM ERROR ROUTINE

END-IF

表示如果F-ERR-CODE不为NORMAL,即所读文件时出现异常,则执行ERRORROUTINE程序。

4、最后程序循环执行读,一直读到ENDFILE。

1.5 瞬时数据输入例子

获取瞬时数据队列里的所有记录

WORKING-STORAGE SECTION.

01 WORKFLDS.

05 TD-RECL PIC S9(4) COMP.

05 TD-ERR-CODE PIC S9(8) COMP.

01 TD-REC.

02 TD DATE PIC X(8).

02 TD-NUMB PIC X(6).

02 TD-AMOUNT PIC X(8).

PROCEDURE DIV1SlON

MOVE 22 TO TD RECL.

PERFORM UNTIL TD-ERR-CODE EQUAL DFHRESP(QZERO)

EXEC CICS READQ TD QUEUE (‘LSTC’ )

INTO(TD-REC)

LEN (TD-RECL )

RESP (TD-ERR-CODE)

END-EXEC.

IF TD-ERR-CODE EQUAL DFHRESP(NORMAL)

ELSE

IF TD ERR-CODE NOT EQUAL DEHRESP(QZERO)

PERFORM ERROR ROUTINE

END-IF

END-IF

END-PERFORM.

说明:

(1)在这个例子里,读取瞬时数据队列LSTC的所有记录,采用的技术是一宜读到异常条件QZERO产生为止。

(2)QZERO条件标明了这个内部队列为空或已读到一个外部目的地文件的末端。

1.6 自动事务初却始化(Auto Task Initiation)

对于内部瞬时数据队列,CICS提供了一个自动事务初始化(ATI)选项。

下面是一个ATI队列的实例:

DFHDCT TYPE=INTRA

DESTID=MSGS

TRANSID=MSW1

TRIGLEV=500

MSGS是一个TDQ,当MSGS的记录数量达到500条时(由TRIGLEV=500指定),CICS能自动初始化并启动事务MSW1(由TRANSID=MSW1指定),通常这个事务是用来 进行消息交换或报表打印。

CICS provides an area called Temporary Storage that programs can use to store data temporarily. Temporary Storage is divided into one or more Temporary Storage Queues, or just TSQ. Each TSQ contains one or more records, or items stored by application program.

TSQ 是Temporary Storage Queue 的缩写,它是放在主存或可直接访问的辅存内。每个TSQ 有一个1-8 个字节的名字,TSQ 不必预先定义,队列在第一个程序向其中写入数据时创建,每个TSQ 中的记录可以通过逻辑记录号来读取,直到队列被删除,TSQ 中的数据都不变,可以被读取任意次,即使写入TSQ 的TASK 结束了,其他TASK 的程序仍然能够读取它写入的数据。

TSQ 的数据是不可恢复(not recoverable)的数据,当CICS 再次启动时,原来在里面的数据将全部丢失。

临时数据可以存在主存或辅存中。通常来说,若数据在短时间内要使用,则应存放在主存中;若数据要长时间存放,则要用到辅存(auxiliary storage)。CICS结束后,存放在辅存的数据被保留并可以在下一次启动时恢复,而存放在主存里的数据则不能被恢复。

CICS提供以下几个应用编程接口来对临时存储队列进行操作:

(1)向临时存储队列写数据(WRITEQ TS命令)

(2)更新在临时存储队列中的数据(WRITEQ TS REWRITE命令);

(3)从临时存储队列中读数据(REAQQ TS命令);

(4)从临时存储队列中读下一条数据(READQ TS NEXT命令);

(5)删除临时存储队列(DELETEQ TS命令)

对于临时存储,我们可以归纳出以下特点:

(1)临时存储记录是变长的。

(2)临时存储数据ID不需在CICS系统中预先定义。应用程序在命令中指出1~8字符的ID。如果该队列不存在,就会分配一个。

(3)可选择要求一个可恢复队列,系统程序员必须把它定义在临时存储表(TST)中。

(4)记录可存在主存或辅助数据集,这依赖于:临时存储在系统初始化时的定义;存储媒体在WRITEQ TS命令中的指定.

(5)所有的辅存存储队列共享一个ESDS格式的VSAM文件.

(6)记录可以被顺序或直接获得,并且可以被更新.

(7)无破坏性的读.

(8)不支持自动任务初始化.

(9)除非被显式(explicit)删除,在临时存储里的数据一般都是可用的.

1.7 临时存储的总体情况

 

以下文章点击率最高

Loading…

     

如果这文章对你有帮助,请扫左上角微信支付-支付宝,给于打赏,以助博客运营

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注