




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章 高级编程1第一节 CICS服务程序的相互调用11.1 一个调用其它服务程序的例子11.2 跨域调用其它服务程序5第二节 CICS事务的作用域7第三节 深入CICS编程93.1 CICS API简介93.2 SFS的应用113.3 使用ECI17第四章 高级编程相对其它的软件产品,CICS可谓历史悠久,因此也就有非常丰富的内涵和开发手段。本章所讲解的所谓“高级编程”,不过是为了引导熟悉EasyCICS的程序员再深入地了解一些CICS而已。我听到很多用户抱怨说,Microsoft Word提供了几千种功能,可一般人只用几十种就够了,为什么要付钱去那些不用的功能?其实,大多数成熟的软件产品都难以避免这样的尴尬问题。不过,有时,靠软件吃饭的使用者倒可以从反面考虑一下问题:我们如果花费一份时间和精力,学到了某产品10%的功能,而满足了自己80%的需求,往往我们要再花费十份时间和精力,才能学到该产品30%的功能,而最终结果是满足了自己85%的需求。这样的买卖未必总是划算的,对吗?当然,如果某种产品对您关系重大,还是要认真钻研一下。如果您是这样的读者,我要再强调本书仅仅能把您引进CICS的大门,并提供给您一些十分有效的手段。每种CICS产品都附带大量的联机文档,这些文档能为您深入学习CICS提供很多帮助。俗语道:师傅领进门,修行在个人。第一节 CICS服务程序的相互调用1.1 一个调用其它服务程序的例子如果您读完并理解了本章以前的所有内容,那您已经是非常不错的EasyCICS程序员了。您应该很熟悉CICS的客户程序如何调用CICS的服务程序,对了,调用CallProgramAndCommit函数。有人曾经问我CICS的客户程序是否可以调用CICS的客户程序,当然不行,因为如果仅仅是客户的话,是不能接受和应答任何请求的,请再复习一下Client/Server系统机构的概念。但与其它Client/Server系统类似,CICS的服务程序确实可以调用CICS的服务程序。我们来看一个简单的例子。有两个非常简单的服务:EC04和 EC05。EC04基本上什么事都不做,只调用EC05,并根据EC05返回的信息设置返回值。而EC05把当前的日期和时间写到公共数据区里。以下是它们的代码:/*/*- HEADER FILES -*/#include easycics.h/*/*- Global Variables -*/char Ca1BUF_SIZE=;/*/*Functions*/*/* */void main()char s100;if( InitEasyCics() ) ExitEasyCics();SetCurrentCA(Ca1);BeginWrite();CallProgram( EC05 );GetValue( TIME5, s );SetCurrentCA(0);BeginWrite();SetValue( TIME5, s );ExitEasyCics();清单 4-1-1 服务程序EC04/*/*- HEADER FILES -*/#include #include easycics.h/*/*Functions*/*/* */void main()struct tm *newtime;time_t aclock;if( InitEasyCics() ) ExitEasyCics();BeginWrite();time( &aclock );/* Get time in seconds */newtime= localtime( &aclock ); /* Convert time to struct tm form */SetValue( TIME5, asctime(newtime) );PrintStatus( TIME5 );ExitEasyCics();清单 4-1-2 服务程序EC05我们可以用WSH(Windows Scripting Host)作一个最简单的客户程序来访问EC04。以下是代码清单:set oEc = Wscript.CreateObject(EasyCics.App)r = oEc.ConnectServer(CICSNT01, TEST, TEST)if r0 thenMsgBox cant connectelseoEc.BeginWriteoEc.CallProgramAndCommit EC04 MsgBox oEc.GetValue(TIME5), 64, Answer From CICS end if清单 4-1-3 EC14的客户程序运行的结果如下:图 4-1-1我们研究一下这几个程序的代码。EC04的客户程序和EC05服务程序都是极其普通的,现在把EC04服务程序讲解一下:“SetCurrentCA(Ca1);”的作用是切换当前的公共数据区到Ca1,这样以后针对公共数据区的操作(GetValue/SetValue和RsOpen/RsCreate等)都集中到Ca1上。可以类似客户程序那样调用服务程序EC05,但只能使用CallProgram函数。后面调用的“SetCurrentCA(0);”含义是切换当前的公共数据区到原本的公共数据区。了解了这些,其它的代码就一目了然了。需要了解的是,我们这里使用的切换公共数据区函数,只是为了适应更复杂的情况,在EC04,并非是必须的。我们可以把EC04精简到下面的样子:/*/*- HEADER FILES -*/#include easycics.h/*/*- Global Variables -*/char Ca1BUF_SIZE=;/*/*Functions*/*/* */void main()char s100;if( InitEasyCics() ) ExitEasyCics();BeginWrite();CallProgram( EC05 );ExitEasyCics();清单 4-1-1 精简的EC041.2 跨域调用其它服务程序如果在同一个CICS域(region)中,一个服务程序调用另一个服务程序看来十分简易。但如果调用不同的域中的服务程序,就要做一些设置工作。我们大体有两种最简单的办法。无论使用哪种办法,我们都必须先建立两个域的相互连接,这是通过相互设置对方的通信(communication)资源来完成的。应注意以下几点:1. 互相通信的两个域名称和SYSID应不相同;2. (对UNIX和NT系统,)一般把通信资源的Connection Type设置为CICS TCP/IP;3. (对UNIX和NT系统,)一般把通信资源的Remote APPLID或Remote LU Name设置为对方的域名称。第一种跨域调用的方法是建立程序的映射关系。就是说,在建立程序(program)资源时,不设置其PathName属性,而将其Remote System ID属性设置为连接对方的通信资源名称。再设置其Remote Program ID属性为在对方域中的program的名称。这种方法简单易行,程序编码时无须特殊的处理,就象调用本域的程序一样。其实,客户程序也可以用这种方法连接一个域,而实际调用不同的域程序进行处理。第二种跨域调用的方法是使用SYSID。这种方法省去了在本域定义对方域的程序的映射,但一般要修改transaction资源CPMI的安全属性Resource Level Security Key为PUBLIC。在设置这一属性之前应修改另一默认的属性Protect Resource为FALSE,否则不能用图形界面或命令修改其它属性。这样,就可以在调用时直接指出对方的SYSID而调用其它域的程序。调用的函数不再是CallProgram,而是CallProgramSys,其第二个参数即SYSID。以下是示例:CallProgramSys( EC05, ISC1 );第二节 CICS事务的作用域本书不厌其烦地讲解的TELECOM服务程序及其客户程序向我们展示了最简单的CICS事务处理流程。有客户程序调用CallProgramAndCommit函数,服务程序最终执行ExitEasyCics函数。这样做的效果是:如果服务程序没有发生故障,则自动提交事务。如果我们在ExitEasyCics函数之前调用了CicsCommit函数,效果是一样的。更加接近实用的做法是:在服务程序的所有必要的地方调用CicsCommit函数和CicsRollBack函数。这样一个服务程序相当于执行了许多CICS事务,根据调用的是CicsCommit函数还是CicsRollBack函数决定是否提交或回滚。最后,在调用ExitEasyCics函数之前,不主动调用CicsCommit函数也会自动提交。另外,有两点需要注意,其一是,如果服务程序发生故障退出(abend),则事务回滚;其二是,调用CicsRollBack函数后,如果要重新写公共数据区,应再次调用BeginWrite函数。也就是说,CicsCommit函数和CicsRollBack函数并不清空或修改公共数据区。下面的伪代码显示了比较通用的服务程序流程。void main()if( InitEasyCics() ) ExitEasyCics();if ERROR goto ERR_LABELCicsCommit();if ERROR goto ERR_LABELCicsCommit();ExitEasyCics();ERR_LABEL:CicsRollBack();ExitEasyCics();上述的由服务程序来控制的CICS事务处理流程也是本书作者推荐的流程。当然,尽管会带来诸多弊端,也可以有客户程序来控制事务处理流程。函数CallProgramAndCommit和CallProgramDsyncAndCommit由服务程序控制流程,函数CallProgram和CallProgramDsync由客户程序控制流程。调用CallProgram类函数还应注意以下几点:1. 客户程序调用CallProgram函数或CallProgramDsync函数后一定要提交或回滚(调用Commit或RollBack函数),或者直接调用CallProgramAndCommit接口函数。2. 调用CallProgram/CallProgramAndCommit后,如果不调用ConnectServer而直接再次调用SetValue和CallProgram/CallProgramAndCommit,应先调用BeginWrite以清空公共缓冲区(这是因为上次调用CallProgram/CallProgramAndCommit的返回值还在公共缓冲区中)。3. 客户机尽量调用CallProgramAndCommit,此调用效率最高。CallProgramAndCommit是否最终提交取决于CICS Server执行Program的情况:1、服务器没有未截获的错误,正常返回(调用ExitEasyCics)时,事务提交2、服务器没有未截获的错误,并显式调用CicsCommit时,事务提交3、服务器没有未截获的错误,并显式调用CicsRollBack时,事务回滚4、服务器有未截获的错误,事务回滚4. 客户机调用CallProgram和CallProgramDSync时,最终一定要调用Commit或RollBack,事务是否提交以此为准。但是在此期间,program一直占据application server。如果发生网络故障,须等到超时,才能完成事务回滚(默认为3600s),在此期间,可能因数据库记录锁定导致相关存取挂起。5. 客户机调用CallProgram系列函数后,最好调用GetErr函数以判断是否调用成功,若GetErr返回空串,则表示成功;若返回非空,表示出错,应重新调用ConnectServer进行连接。第三节 深入CICS编程3.1 CICS API简介CICS为程序员提供了丰富的CICS API命令,这些命令是嵌入在C或COBOL程序中的编程语句,每条命令都以EXEC CICS起始,在加上一些必要的或可选的参数,对C语言来说,要以分号结束。CICS API在RS6000、AS400、VSE/ESA、HP-UX、Solaris、OS2和Windows NT上的实现基本相同,所以很容易移植。EasyCICS对最常用的CICS API进行了一些封装,所以一般不必直接使用CICS API。但如果想创建强大的、方便移植的CICS服务程序(ANSI C功能有限),应该好好研究一下CICS API。随CICS产品带的联机文档对CICS API有详细的描述。这里我们以列表方式简要介绍几个。注意:1. 表格中的CICS API省去EXEC CICS字头。2. 相关的EasyCICS函数并非仅仅调用此CICS API,一般还会做许多其它的工作。CICS APIADDRESSCOMMAREA(ptr-ref) CWA(ptr-ref) EIB(ptr-ref) TCTUA(ptr-ref) TWA(ptr-ref)EasyCICS函数InitEasyCics说明Gets access to the following areas: l The communication area available to the invoked program (COMMAREA) (公共数据区) l The common work area (CWA) l The EXEC interface block (EIB) l The terminal user area (TCTUA) l The transaction work area (TWA)CICS APIDELAYFORHOURS(data-value)MINUTES(data-value)SECONDS(data-value) |UNTILHOURS(data-value)MINUTES(data-value)SECONDS(data-value)REQID(name)EasyCICS函数说明Delays the processing of a taskCICS APIDELETEQ TD QUEUE(name) SYSID(name)EasyCICS函数说明Deletes an intrapartition transient data queueCICS APIDELETEQ TS QUEUE(name) SYSID(name)EasyCICS函数说明Deletes a temporary storage queueCICS APIFREEMAIN DATA(data-area)EasyCICS函数说明Releases main storage (内存)CICS APIGETMAIN SET(ptr-ref)LENGTH(data-value) | FLENGTH(data-value)INITIMG(data-value) NOSUSPEND SHAREDEasyCICS函数说明Gets main storage (内存)CICS APILINK PROGRAM(name) COMMAREA(data-area) LENGTH(data-value) SYSID(name) SYNCONRETURNTRANSID(data-value) DATALENGTH(data-value) EasyCICS函数CallProgram, CallProgramSys说明Links to another program expecting returnCICS APIREADQ TD QUEUE(name)INTO(data-area) | SET(ptr-ref)LENGTH(data-area) SYSID(name) NOSUSPENDEasyCICS函数说明Reads data from a transient data queueCICS APIREADQ TS QUEUE(name)INTO(data-area) | SET(ptr-ref)LENGTH(data-area) NUMITEMS(data-value)ITEM(data-value) | NEXT SYSID(name)EasyCICS函数说明Reads data from a temporary storage queueCICS APIRETURN TRANSID(name) COMMAREA(data-area) LENGTH(data-value) EasyCICS函数ExitEasyCics说明Returns program controlCICS APISTART AFTER HOURS(data-value) MINUTES(data-value) SECONDS(data-value) |AT HOURS(data-value) MINUTES(data-value) SECONDS(data-value) TRANSID(name) REQID(name)FROM(data-area) LENGTH(data-value)TERMID(name) SYSID(name) RTRANSID(name)RTERMID(name) QUEUE(name) NOCHECK PROTECTEasyCICS函数说明Schedules a task in a local or a remote systemCICS APISYNCPOINT ROLLBACKEasyCICS函数CicsCommit, CicsRollBack说明Establishes a syncpointCICS APIWRITEQ TD QUEUE(name)FROM(data-area) LENGTH(data-value) SYSID(name)EasyCICS函数PrintStatus说明Writes data to a transient data queueCICS APIWRITEQ TS QUEUE(name)FROM(data-area) LENGTH(data-value) ITEM(data-area) REWRITE SYSID(name) MAIN | AUXILIARY NOSUSPENDEasyCICS函数说明Writes data to a temporary storage queueCICS APIXCTL PROGRAM(name) COMMAREA(data-area) LENGTH(data-value) EasyCICS函数CallProgramXCTL说明Transfers program control3.2 SFS的应用在建立CICS域(region)时,我们一般都预先建立了SFS(结构化文件服务器:Structure File Server)。不同于一般的UNIX或Windows NT的文件系统,SFS提供面向记录的可恢复的文件系统服务。SFS提供键值(clustered)、顺序(entry-sequenced (sequential)和相对记录号(relative)的访问支持,对应于IBM大型主机VSAM技术中的KSDS、ESDS和RRDS。随CICS产品带的联机文档对SFS有详细的描述,这里仅简要地介绍一下开发SFS的大致轮廓。下面的表格说明了一些对应关系:types of filesclusteredentry-sequenced (sequential)relativeIn VSAMKSDSESDSRRDSOrganized bykey field(s) of the primary indexentry sequence numbers (ESNs)Relative slot numbers (RSNs)Sample useAccountsMerchandiseOrdersInventoryPrimary indexExplicit: specified when the file is createdImplicit: based on entry sequence number (ESN)Explicit: based on relative slot number (RSN)Optimal type of accessAccess through primary key valueChronological access, by ESNDirect access, by RSNValid record typesFixed or variable lengthFixed or variable lengthFixed length slots, variable length recordsLimitations on updating recordsNew record cannot exceed the maximum record size specified when the file was createdNew record cannot exceed the size of the original recordNew record cannot exceed the maximum record size specified when the file was createdCapability to automatically reuse space from deleted recordsYesNo (must reorganize the file to reuse space)YesMaximum records per file264 10236 - 10232 - 10合法的SFS数据类型:Fixed-length Data Types Value Must Specify Maximum Field Size UnsignedInt16 Unsigned 16-bit integer. SignedInt16 Signed 16-bit integer. UnsignedInt32 Unsigned 32-bit integer. SignedInt32 Signed 32-bit integer. UnsignedInt64 Unsigned 64-bit integer. SignedInt64 Signed 64-bit integer. decimal A decimal number. The field size can be from 1 byte to 18 bytes. Yes float 32-bit floating point number. double 64-bit floating point number. string Array of 8-bit characters. The string must be null-terminated. The length (including the null terminator) must be less than or equal to the maximum field size. Characters following the first null character are ignored. Yes nlsString Array of 8-bit characters. The string must be null-terminated. Characters following the first null character are ignored. NLS strings are ordered as specified by the collating language of the server. Yes byteArray Array of unsigned 8-bit bytes. Yes timestamp An 8-byte field consisting of two 4-byte unsigned integers. The high-order word signifies the number of seconds from (00:00:00) January 1, 1970, GMT. The low-order word contains the number of microseconds within the second. Variable-length Data Types Value Must Specify Maximum Field Size VarLenByteArray Array of unsigned 8-bit bytes with an unsigned 4-byte length header. The length header specifies the number of bytes following the header; it does not include the size of the header itself. Yes ShortVarLenByteArray Array of unsigned 8-bit bytes with an unsigned 2-byte length header. The length header specifies the number of bytes following the header; it does not include the size of the header itself. Yes 下面用一个实例来说明SFS文件的使用。首先建立一个clustered类型的文件,使用如下命令:sfsadmin create clusteredfile PAYFILE 2 sn string 32 bind_index string 19 PAYIND 1 sn sfs_SLRPC这个文件叫做PAYFILE,有两个字段,sn和bind_index,其中sn作为主索引字段。通过sfsadmin指令可以看到文件PAYFILE的信息:D:cicssfsadmin list filesFiles: CICSNT01cicsnlqfile CICSNT01cicsnrectsqfil CICSNT01cicsplqfile CICSNT01cicsrectsqfile CICSNT01cicstdqlgfile CICSNT01cicstdqnofile CICSNT01cicstdqphfile PAYFILED:cicssfsadmin query file PAYFILEFile name: PAYFILEFile organization: btree clusteredRecord fields:Name: sn, Type: string, Size: 32Name: bind_index, Type: string, Size: 19Primary index name: PAYINDUnique: noIndex fields: Name: sn, Ordering: ascendingVolume: sfs_SLRPC, Allocated pages: 0, Utilized pages: 0Max number of records: 3486869406227236544Number of records: 0File state: file OKCreation time: 00-02-13 13:00:08Last read time: 00-02-13 13:00:08Last write time: 00-02-13 13:00:08Last administer time: 00-02-13 13:00:08Primary index status: Number of entries: 0 Btree level: 0 Number of leaves: 0No secondary indices.可以用cicssdt工具维护此文件,下面是示例:D:cicscicssdtERZ037223W/0764: (You are not DCE logged in)ERZ037068I/0500: CICSSDT talking to: /.:/cics/sfs/LRPCERZ037069I/0501: Version 2.1 : 12-07-1995ERZ037070I/0502: Contacting server .ERZ037103I/0704: (Server OK)cicssdt: - ?ERZ037081I/0519: SFS Diagnostic Tool - Help Valid commands are: help (or ?) commandName - setopen - list l - create fileName - read fileName, (with delete/update) - write fileName - empty fileName - delete fileName - free fileName - addindex fileName - delindex fileName - info fileName - server serverName - qtos QSAMfileName - stof SFSfileName - ftos SFSfileName - ! (ksh) - quitcicssdt: - write PAYFILEsn string Size:00032110101700302201bind_index string Size:00019EverythingAnother ? Y/N Ysn string Size:00032110101700303201bind_index string Size:00019CICSAnother ? Y/N n2 Record(s) Added OK.cicssdt: - read PAYFILEIndex To Use .: PAYINDRead From Beginning ? Y/N : YContinuous Read ? Y/N .: yRead #00000001sn 110101700302201bind_index EverythingRead #00000002sn 110101700303201bind_index CICS2 Record(s) Readcicssdt: - qD:cics 现在,文件PAYFILE被填写了两条记录。我们现在用一个CICS程序读PAYFILE,并再加入一条记录。这个CICS程序内容如下:/*/*- HEADER FILES -*/#include #include easycics.h/*/*- DEFINES -*/#define KEY_LEN 32/*/*- Global Variables -*/struct C_Data char SnKEY_LEN; char Bi19;Data;/*/*Functions*/*/* */void main()char file_name= PAYSN, key_sKEY_LEN= 110101700302;short int len;/long r_code;if( InitEasyCics() )ExitEasyCics();return;/*Read:*/*Write:*/BeginWrite();len= sizeof(Data);EXEC CICS READ FILE( file_name ) INTO( &Data ) LENGTH( len )/*RESP( r_code )*/RIDFLD( key_s )KEYLENGTH( strlen(key_s) ) GENERIC EQUAL /*UPDATE*/;/if ( r_code != DFHRESP(NORMAL) )/PrintStatus( Error !n );PrintStatus( Data.Sn );PrintStatus( Data.Bi );SetValue( Sn, Data.Sn );SetValue( Bi, Data.Bi );len= sizeof(Data);memset( key_s, 0, KEY_LEN );strcpy( key_s, 110101700306201 );memcpy( Data.Sn, key_s, KEY_LEN );strcpy( Data.Bi, IBM RS6000 );EXEC CICS WRITE FILE( file_name ) FROM( &Data ) LENGTH( len )/*RESP( r_code )*/RIDFLD( key_s ) KEYLENGTH( KEY_LEN );ExitEasyCics();读者可以自己写一个客户程序,执行后用cicssdt验证PAYFILE文件是否增加了一行记录。3.3 使用ECICICS客户程序通常使用ECI(External Call Interface)调用CICS服务程序或事务,二者通过一块称为公共数据区的内存空间来传递数据。ECI提供两个基本函数,其声明如下:l cics_sshort_t CICSCALL CICS_EciListSystems( cics_char_t CICSPTR *NameSpace, cics_ushort_t CICSPTR *Systems, CICS_EciSystem_t CICSPTR *List );l cics_sshort_t CICSCALL CICS_ExternalCall( ECI_PARMS CICSPTR *EciParms );ECI仅仅支持操作系统最常用的C编译工具,所以,一般来说,可以通过使用EasyCICS的客户支持,避免直接调用CICS ECI。但如果希望用到ECI的全部特性及其与C语言配
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采用独家秘方打造不可复制的美味一口下去就能感受到
- 羊绒养护知识培训课件
- 置业顾问接待礼仪课件
- 置业顾问专业知识培训课件
- 语文教师语言表达能力提升计划
- 消防培训听课评课心得体会体会
- 港口码头疫情防控与安全操作措施
- 香港朗文5a课件
- 包装运输质量保证措施
- 香港回归课件
- 基于大单元教学的高三电化学复习课学案
- 《退役军人保障法》知识考试题库(含各题型)
- 现代智力七巧板赛前培训
- C型钢检验报告
- 国航特殊餐食代码表
- 人教版高中美术《书法》选修第一课“汉字与书法文化”教案
- 多媒体技术与应用ppt课件(完整版)
- 冀教版七年级上册英语全册教案(教学设计)
- 《中国人民警察警歌》歌词
- 《航空动力装置》课件绪论
- 科技文献检索与利用
评论
0/150
提交评论