您好,欢迎访问三七文档
CICS技术培训--CICS开发2019/9/15介绍通过这门课,我们可以学习:–CICS客户端程序开发基础–CICS服务器端程序开发基础–编写利用CICS访问数据库的程序–CICS提供的应用数据类型CICS应用模型客户程序SFSRDBMQECIEPI区域1区域2区域3其他CICS服务器CICS服务器CICSCLIENT开发CICSECI调用功能–从非CICS程序的客户程序调用CICSServer交易方式–ECI—ExternalCallInterface–EPI—ExternalPresentationInterface函数–CICS_ExternalCall()CICSECI程序实例(1)#includecics_eci.hECI_PARMSEciParms;charcommArea[1024];注:commArea不能大于32KCICSECI程序实例(2)memset(&EciParms,0,sizeof(ECI_PARMS));memset(commArea,0,sizeof(commArea));EciParms.eci_version=ECI_VERSION_1;EciParms.eci_call_type=ECI_SYNC;memcpy(&EciParms.eci_system_name,CICSRG01,8);memcpy(&EciParms.eci_userid,CICSUSER,8);memcpy(&EciParms.eci_password,CICSUSER,8);memcpy(&EciParms.eci_program_name,SERV0001,8);CICSECI程序实例(3)EciParm.eci_commarea=commArea;EciParm.eci_commarea_length=sizeof(commArea);EciParm.eci_extend_mode=ECI_NO_EXTEND;EciParm.eci_luw_token=ECI_LUW_NEW;EciParm.eci_timeout=30;注1:commArea任意格式,最好是字符串。注2:长度为发送和接收的较大者。CICSECI程序实例(4)rc=CICS_ExternalCall(&EciParms);注:–rc:在cics_eci.h中定义–EciParms.eci_abend_code:#info–lcics–sabend编译CICSECI程序在SCOOpenServer:–cc-DCICS_SCO-belf-lcclsco-lc-occ.c运行CICSECI程序启动CICSECI–#cicscli/S=CICSRGx运行程序–$c停止CICSECI–#cicscli/X=CICSRGxCICSSERVER开发CICSSERVER程序实例main(){unsignedlongrc;char*commArea;EXECCICSADDRESSEIB(dfheiptr)RESP(rc);EXECCICSADDRESSCOMMAREA(commArea)RESP(rc);...EXECSQL......EXECCICSSYNCPOINT;strcpy(commArea,ResultData);EXECCICSRETURN;}CICS语句语法EXECCICS[command[options]]…–options:RESP(rc)例如:unsignedlongrc;EXECCICSSYNCPOINTRESP(rc);if(rc==DFHRESP(NORMAL))then…数据通讯区CommArea使用方式–非CICS程序中(客户端程序):用户申请空间接收和返回均使用此空间申请大小为发送和接收两者的较大者–CICS程序中:无须申请空间接收和返回均使用此空间同步调用其他CICS程序时传递数据异步调用时传递数据长度不大于32KSERVER程序获得COMMAREA获得请求数据–char*commarea;/*无须申请空间*/–EXECCICSADDRESSEIB(dfheiptr)–EXECCICSADDRESSCOMMAREA(commarea)获得请求数据的长度–dfheiptr-eibcalen例如:if(dfheiptr-eibcalen0)then…逻辑事务单元(LogicalUnitofWork)CICS交易中,两个CICS提交/回滚之间的处理为一个LUW。客户端A客户端ABC客户端AB客户端AB交易的提交和回滚显式调用提交/回滚命令–EXECCICSSYNCPOINT—提交–EXECCICSSYNCPOINTROLLBACK—回滚客户端A客户程序提交和回滚ECIClient控制提交/回滚–eci_extend_mode参数ECI_NO_EXTEND—执行完毕即提交ECI_EXTENDED—延伸到下一次ECI调用ECI_COMMIT—提交ECI_BACKOUT—回滚–eci_luw_token参数指定LUW的编号ECI_LUW_NEW开始一个新的LUW客户端AB客户端A客户程序提交和回滚示例示例程序:–EciParm.eci_commarea=commArea;–EciParm.eci_commarea_length=sizeof(commArea);–EciParm.eci_extend_mode=ECI_NO_EXTEND;–EciParm.eci_luw_token=ECI_LUW_NEW;–EciParm.eci_timeout=30;–…–rc=CICS_ExternalCall(&EciParms);访问数据库(XA方式)无须连接数据库数据库操作–EXECSQL…数据库提交/回滚–EXECCICSSYNCPOINT–EXECCICSSYNCPOINTROLLBACK通过sqlca.sqlcode判断EXECSQL的执行结果访问数据库(非XA方式)连接数据库–EXECSQLCONNECTTODATABASE…数据库操作–EXECSQL…数据库提交/回滚–EXECSQLCOMMIT–EXECSQLROLLBACK数据库关闭–EXECSQLDISCONNECT通过sqlca.sqlcode判断执行结果程序间调用语句EXECCICSLINK–调用另一个程序–结束后返回调用程序EXECCICSXCTL–将控制转给另一个程序,不返回EXECCICSSTART–异步执行另一个交易,可设置启动时间。EXECCICSRETURN–返回调用程序–当前CommArea内容也返回。客户端ABCEXECCICSLINKEXECCICSLINKPROGRAM(name)[COMMAREA(dataarea)LENGTH(datavalue)][SYSID(name)[SYNCONRETURN]]例:EXECCICSLINKPROGRAM(PROG1)COMMAREA(CommArea)LENGTH(100)关于事务提交与回滚:–B中SYNCPOINT只提交B中内容;–A中SYNCPOINT提交A和B中内容(若B未提交);–若B提交了,而A回滚,则B中内容不会回滚。AB数据访问与共享交易内数据共享交易间数据共享客户端A客户端X客户端AB交易内数据共享TWA—TransactionWorkArea–同一交易内所有程序共享–TD中定义大小:0-31767–EXECCICSADDRESSTWA()使用CICS私有存储区–EXECCICSGETMAIN使用CommArea–EXECCICSLINK…COMMAREA()–EXECCICSXCTL…COMMAREA()客户端AB交易间数据共享CWA—CommonWorkArea–所有程序共享–RD中定义:512-3584–EXECCICSADDRESSCWA()共享CICS存储区–EXECCICSGETMAINSET()SHAREDVSAM文件/SFS文件(FD)临时存储队列(TSQ)瞬时数据队列(TDQ)TSQ(临时存储队列)用于多个事务间共享数据–通常只有一条记录–不定义即可使用,但对于REMOTE方式最好事先定义。–超过指定时间后,自动被删除。–可用CEBR浏览和删除。存储类型–MAIN:在内存中,不可恢复,区域停止后丢失。–AUXILIARY:在SFS中,可设置为可恢复,冷启动后才丢失。TDQ(瞬时数据队列)真正的先进先出队列–多个记录,按顺序读取,读后被删除。–需在区域启动前定义:TDD队列类型–分区内TDQ:存储在SFS中Trigger:可触发执行事务(当队列元素数目达到指定大小)Recoverable属性:–none:不可恢复–physical:当区域异常中断后,可恢复最后一次读出的元素–logical:根据LUW,可恢复–分区外TDQ:存储在AIX文件系统中定长记录/不定长记录/特定字符/NULL/行(支持以文本行为记录单位)只读或只写,但不能以可读可写方式打开。可由所有分区的程序访问。开发注意事项注意事项(一)CICS不可使用的系统函数–fork(),execl(),system()可用EXECCICSLINK,XCTL,START代替–gethostbyname(),gethostbyaddr(),getprotent(),getservbyname()可用gethostbyname_r(),gethostbyaddr_r(),getprotent_r(),getservbyname_r()代替–exit()用EXECCICSRETURN代替注意事项(二)CICS不推荐使用的函数–malloc()可用EXECCICSGETMAIN代替–kill()用EXECCICSSETTASKPURGETYPE()代替–exit()用EXECCICSRETURN代替注意事项(三)CICS应用服务器会保留下列进程状态,因此在交易结束时应关闭:–打开的文件句柄–TCPIPSOCKET句柄–环境变量–当前工作目录–进程级别–共享内存–动态申请的内存注意事项(四)当CICS程序需要驻留内存时(PD的RESIDENT=YES),慎用静态(static)变量。示例–staticintval=0;–…–val=val+1;注意事项(五)尽量不使用结构来定义CommArea,因为其长度在各种机器上不一定相同。而用pack会影响效率。INT类型变量在各种机器上高低位不一定相同,在传递结构需转换。structCommAreaStru{inta;charstr[5];}注意事项(六)数据库cursor操作完毕必须释放。–EXECSQLDECLARECURSOR;–EXECSQLOPENCURSOR;–EXECSQLCLOSECURSOR;–EXECSQLDEALLOCATECURSOR;注意事项(七)使用动态SQL语句时由数据库自动申请的pSQLDA空间,应用程序必须释放。–EXECSQLPREPARE;–EXECSQLDESCRIBE…INTOpSQLDA;注意事项(八)程序结束需显式删除临时表:–EXECSQLSELECT*FROMtable1INTOTEMPtmptable;–EXECSQLDROPTABLEtmptable;编译与调试相关目录/var/cics_regions/CICSRGx/–bin应用程序–data数据文件/队列编译CICSSERVER程序没有SQL语句时:–cicstran-lCs.ccs-s.c#CICS预编译–cc–L$CICS/lib-lcics_api–emain-I$CICS/include–oss.c-s–或:–exportCCFLAGS=–L$CICS/lib-lcics_api–emain-I$CICS/include–cics
本文标题:CICS培训-开发
链接地址:https://www.777doc.com/doc-957337 .html