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…