TXSeries入门系列文章10

 

inShare 
Tweet

三单元 数据管理

第三部分 TDQ/TSQ

关于本部分

TXSeries中,有两种类型的队列——TDQ(暂存数据队列)和TSQ(临时存储队列),在其中可以存储数据并以先进先出的顺序读取数据,也可以通过索引直接读取。不同于使用文件存储数据,队列用于在交易间传递数据,甚至是在不同region的交易之间。队列可以将信息记录到纯文本,而代替并不被推荐的”fprintf“。

本部分将介绍TDQTSQ,并将其进行对比,还会讲解如何使用APIs去读取、写入和删除队列。

 
 

参阅:

关于队列:

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/concepts/c_queues.html?lang=en

1. TDQ介绍

TDQ以先进先出的顺序管理,无论何时从TDQ中读取记录,这条记录将会被删除,记录的指针总会指向队列中第一个(最旧的)记录。换句话说,TDQ中的数据只能被读取一次。应用程序在使用任何APIs管理TDQ之前, 必须在TDD类型中定义TDQ。根据不同的存储目的,可以分为intrapartition TDQextrapartition TDQ

1intrapartition TDQ

在文件管理器(例如SFS)中进行管理,属于指定的region。用于在同一region中的不同交易间传递数据。Intrapartition TDQ可以预定义一个触发器和交易,当触发条件达到时这个交易会自动启动。

2extrapartition TDQ

在任何文件系统中进行管理,例如操作系统中的文本文档。用于在不同region或不同设备的交易间传递数据,记录日志数据、统计数据和错误信息。Extrapartition TDQ不能被删除。

 
 

参阅:

关于TDQ

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/concepts/c_abt_tdq.html?lang=en

关于intrapartition TDQ

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/concepts/c_intraprtition_trnsient_data.html?lang=en

关于extrapartition TDQ

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/concepts/c_extrprtition_dstinanations.html?lang=en

 
 

2. TSQ介绍

不同于TDQTSQ中的记录可以被多次读取和更新 。记录是顺序存储在队列中的,可以通过指定索引来检索任何数据。TSQ会在第一次写入队列时自动被创建,所以不需要在region中预定义TSQTSQ也有两种类型,一种是auxiliary TSQ,是存储于文件管理器中的文件,当数据需要长久存储时使用。另一个是main TSQ,存储于内存,当少量数据需要短期存储时使用。

 
 

参阅:

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/concepts/c_abt_tsq.html?lang=en

 
 

3. TDQ和TSQ的区别

下表中是TDQTSQ的主要区别:

TDQ

TSQ

在被应用程序使用前,TDQ必须在TDD中定义。

当第一条WRITEQ命令执行时TSQ被创建

记录必须顺序读取,且每条记录只能被读取一次

如果没有明确使用命令进行删除,数据和队列的生命周期一致

因为只能被读取一次,所以记录不能更改

记录可以更改

只存储在文件中

存储在内存或辅存

可以在物理上和逻辑上被恢复

只有辅存的队列可以被恢复

在intra和extra partition之间可以方便的进行切换,只需要修改TDD stanza而不必修改应用程序

不支持

 
 

4. TDQ的APIs

现在是时候学习操作队列的APIs了。用户可以通过APIs来对TDQ进行写入、读取和删除的操作。但是要注意,在编程之前要定义一个TDD

1)添加TDD定义

这里只介绍用户所需要的最简单的选项。TDD必须在region启动之前定义。

a. intrapartition TDQ

语法

cicsadd -c tdd -r <regionName> <TDD entry> DestType=intrapartition RSLKey=public

TriggerLevel=<triggerLevel> TriggeredTransId=<triggeredTransId>

选项

<triggerLevel>             triggerLevel的范围是032767。只对intrapartition TDQ有效。

<triggeredTransId> :       指定一个当triggerLevel达到时被触发的交易。只对intrapartition TDQ有效。

 
 

b. extrapartition TDQ

语法

cicsadd -c tdd -r <regionName> <TDD entry> DestType=extrapartition RSLKey=public

ExtrapartitionFile=”<extrapartitionFilePath>” RecordType=<recordType> IOMode=<output/input>

选项

<extrapartitionFileName>      extrapartition文件的路径和名称。如果只指定了名称,文件会在”/var/cics_regions/<regionName>/data“目录下。

<recordType>              指定extrapartition文件的格式,包括fixed_lengthvariable_lengthline_orientednull_terminatedbyte_terminatedfixed_length是默认的,但是推荐使用variable_length。如果指定了fixed_length,同时也应该指定RecordLen

<output/input>       指定extrapartition文件是只能写入(output,向这个文件写入)还是只能读取(input,从这个文件读取)。”output“是默认值。

 
 

参阅:

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/reference/r_transnt_data_defns.html?lang=en

 
 

2)向TDQ写入

通过使用WRITEQ TD命令,数据会被追加到TDQ的末尾。对于extrapartition TDQ,一条记录会被追加到extrapartition文件的末尾。

语法

WRITEQ TD QUEUE(“<TDD entry>”) FROM(<dataSet>)

LENGTH(<lengthVariable>)

选项

<TDD entry>    步骤1添加的TDD

<dataSet>       写入TDQ的数据。例如,一个字符集”data“(char data[200])。

<lengthVariable>        指定数据长度的变量。如果正在写入intrapartition TDQ(只适用C程序)或者没有使用fixed_lengthextrapartition TDQ,这个选项必须存在。

如果在TDD中定义了TriggerLevelTriggeredTransId,例如TriggerLevel=4TriggeredTransId=ABCD“。那么当向TDQ写入第4次后(包括4次),当WRITED TD执行时交易ABCD会被触发。

注意,在使用WRITEQ TD命令之前,必须为extrapartition TDQTDD定义指定IOMode=output(或使用默认值)。

 
 

参阅:

http://www-01.ibm.com/support/knowledgecenter/SSGMCP_5.1.0/com.ibm.cics.ts.applicationprogramming.doc/commands/dfhp4_writeqtd.html?lang=en

 
 

3)从 TDQ读取

READQ TD命令从TDQ的头部读取记录,每个记录只能被读取一次——当被读取后记录会从队列中移除。

语法

READQ TD QUEUE(“<TDD entry>”) INTO(<dataSet>) LENGTH(<lengthVariable>)

选项

<dataSet>                   存储从TDQ读取的数据。

<lengthVariable>        当从intrapartition TDQ或者没有使用fixed_lengthextrapartition TDQ读取数据时,必须指定这个选项。谨慎地设置这个变量的值,否则可能会收到LENGERR

注意,在使用READQ TD命令之前,必须为extrapartition TDQTDD定义指定IOMode=input

 
 

参阅:

http://www-01.ibm.com/support/knowledgecenter/SSAL2T_8.1.0/com.ibm.cics.tx.doc/reference/r_readq_td.html?lang=en

4)删除TDQ

只能对intrapartition TDQ使用命令进行删除,对于 extrapartition TDQ不适用。

语法

DELETEQ TD QUEUE(“<TDD entry>”)

     

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

发表评论

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