CICS -- TD瞬时队列 TS临时存储 详细说明

CICS -- TD瞬时队列 TS临时存储 详细说明
CICS -- TD瞬时队列 TS临时存储 详细说明

CICS 应用编程 - 8

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 临时存储的总体情况

1.8 写临时存储队列

对队列增加一个新记录项的命令为:

说明:

以上命令中 QUEUE(name): 指定队列名,1-8个字节

QNAME( name):同QUEUE,但可指定1-16 字节长的队列名字

FROM( data-area):指定要写入QUEUE 的数据区

LENGTH( data-value):半字长二进制参数,指定要写入的字节数

ITEM( data-area):半字长二进制参数,指定要写入的记录号(与REWRITE 选项同时使用)

NUMITEMS( data-area):半字长二进制参数,CICS用来返回写入后队列里一共有多少记录

REWRITE:指明更新一条记录的数据

MAIN:指明TSQ 数据存放在内/主存

1.9 读取临时存储队列

EXEC CICS READQ TS

QUEUE(name)

INTO(data-area)

LENGTH(data-area)

[ITEM(data area) | NEXT]

[NUMITEMS (data-area )]

END-EXEC

1.10临时存储队列的删除

1.11临时存储顺序输出例子

WORKI1NG-STORAGE SECTION

01 WRKFLDS

05 TS-RECL PIC S9(4) COMP VALUE 80.

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

05 TS-ITEMNO PIC S9(4) COMP.

05 TS- ID PIC X(8).

PROCEDURE DIVISION.

...

STRING EIBTRMID EIBTRNID DELIMITED BY SIZE INTO TS-ID.

EXEC CICS WRITEQ TS QUEUE(TS-ID)

FROM(TS-REC)

LENGTH(TS-RECL)

ITEM(TS-ITMENO)

RESP(TS-ER-CODE)

END EXEC.

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

PERFORM ERROR-ROUTINE

END-IF.

说明:

(1)该临时存储队列ID是通过STRING命令动态构造的。开头的四个字节包含从EIB 块中的EIBTRMID字段获得的终端ID和结尾的四个字符包含从EIB获得的事务ID。这描述了动态为在多终端上执行的事务创建唯一不重复临时存储ID的技术.

(2)WRITEQ TS命令执行之后,TS-ITEMNO域包含了刚写入的记录的项目编号。我们可能希望把这个信息和其他记录的标识一起存储,以便以后对这个记录的访问和更新。ITEM(TS-ITEMNO)将写入的记录的项目编号保存到 TS-ITEMNO变量中去。

1.12更新临时存储记录例子

WORKING STORAGE SECTION

01 WRKFLDS

05 TS-RECL PIC S9(4) COMP VALUE S0.

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

05 TS-ITEMNO PIC S9(4) COMP.

05 TS-ID PIC X(8).

01 TS-REC PIC X(80)

PROCEDURE DIVIS1ON

STRING EIBTRMID EIBTRNID DELIMITED BY SIZE INTO TS-ID.

MOVE 20 TO TS-ITEMNO.

EXEC CICS WRITEQ TSQ QUEUE(TS-ID)

REWRITE FROM(TS-REC)

LENGTH(TS-RECL)

ITEM(TS-ITEMNO)

RESP (TS-ERR-CODE )

END-EXEC.

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

PERFORM ERROR ROUT1NE

END-IF.

. . .

变量TS-ITEMNO用于WRITEQ命令的ITEM选项里。它必须包含要更新的队列记录的项目编号。

1.13 TSQ 和TDQ的区别

1、临时存储队列的数据可以随即读取,而瞬时数据对列的数据必须顺序读取

2、临时存储队列的数据可以反复读取,因为数据一直保持可用直到整个队列被删除;而瞬时数据队列的数据只能读一次

3、临时存储队列中的数据可以修改,而瞬时数据队列中的数据则不允许

4、临时存储队列可以存储到主存储器或辅存,而瞬时数据队列只能写到磁盘上

5、临时存储队列的名字可以动态定义,而瞬时数据队列的名字必须事先定义到DCT 中

6、临时存储队列的名字长度最多为8个字符,而瞬时数据队列为4个字符

1.14 CEBR命令

CICS为队列的处理提供了一个专门的内部事务CEBR.

使用CEBR可以对当前CICS区域中的一些临时存储队列的内容进行浏览。

CEBR默认打开与当前终端相关的TSQ。

CEBR命令在ENTER COMMAND===>后可输入几个命令:

1、TERM 浏览其他终端的TSQ

2、QUEUE 打开新的QUEUE

3、PUT 把当前TSQ的内容拷贝到一个TDQ 中去

4、GET 打开一个TDQ的内容来浏览

5、PURGE 删除当前TSQ的所有记录

CICS队列对于DFHCOMMAREA来说是存储和比较信息的另一可选的方法。

在伪会话设计中,临时存储TS用作信息的存储和比较的过程如图所示.

1)在伪会话式的设计中,临时存储可能会被用于保留在第一部分的对话中提供给用户的记录数据。

2)当该记录在会话的第二部分被读出时,它就被与跟从临时存储器得到的存储的数据相比较。

3)如果记录没有被其化的任务所修改,更新就会继续;否则,用户就会被提醒该记录数据已被修改并且要选择下一步要怎样做。

相关主题
相关文档
最新文档