




已阅读5页,还剩76页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
开发(2) 使用CICS API和ECI,刘睿,概要,TXSeries编程框架 TXSeries/CICS客户机程序 TXSeries服务器程序,TXSeries编程框架,基于TXSeries的三层应用开发环境,TXSeries的应用开发支持框架,交易(Transaction),任务(Task)和逻辑处理单元(LUW)的概念,交易(Transaction): 一个交易可以对应于一支或多支CICS服务器端程序的执行。交易的执行多是由终端发出的请求:在终端键入一个四位的交易ID号。在一个交易的执行过程中,可能会触发一个或多个任务的执行。CICS允许一个交易程序被很多用户同时请求执行,而交易之间互不妨碍。这个交易(Transaction)的概念对应一个TD。 任务(Task): 它是交易执行的一个单一实例。CICS与操作系统相结合,通过分配系统进程给每个任务,这样当一个任务处于等待状态时,操作系统可以将控制权交给另外一个任务。 逻辑处理单元(LUW, logical unit of work, also termed a unit of work) 每个逻辑处理单元是一组对数据的修改。比如说在一个帐户系统中一个逻辑处理单元由更新可支付帐户,更新帐簿,创建一张支票组成。每一个逻辑处理单元所作的工作是完全独立于由其它逻辑处理单元的工作。在一个逻辑处理单元中修改的资源或是全部成功或全部失败。这个逻辑处理单元(LUW)的概念对应SYNCPOINT之间的代码。,Logical Unit of Work,LUW-交易中两个相邻的提交/回滚之间的处理 Server Program 可以控制LUW EXEC CICS SYNCPOINT; EXEC CICS SYNCPOINT ROLLBACK; ECI Client 可以控制LUW eci_extend_mode参数 ECI_NO_EXTEND结束一个LUW ECI_EXTENDED将LUW延续至下一次ECI调用 eci_luw_token参数 说明LUW的编号 ECI_LUW_NEW本次CALL 作为一个LUW,TRN1: ProgName = PROG1 TClass = 2,使用交易分类(TClass),11个交易类 1 -10,“NONE” (默认) 交易类1-10可以限制并发运行数 TClass定义在TD stanza 建议 用户交易定义TCLass CICS交易使用NONE MaxServers = sum(ClassMaxTasks) 示例 1 instance of TRN2. Limit = 5 Allowed to run 2 instances of TRN1. Limit =1 1 allowed to run, 1 queued,TClass,Class Max Tasks,TRN1: ProgName = PROG1 TClass = 2,TRN2: ProgName = PROG2 TClass = 7,设置交易分类,制作类似CPMI的交易定义,修改TClass为110。例如“LPMI”: cicsadd -r CICSNT01 -c td -m CPMI LPMI TClass=1 酌情修改RD:ClassMaxTasks (缺省:“1,1,1,1,1,1,1,1,1,1”),RD:ClassMaxTaskLim (缺省:“0,0,0,0,0,0,0,0,0,0”)。 修改ECI程序之EciParms:eci_version=ECI_VERSION_1A,EciParms:eci_tpn为新的TD名(例如“LPMI”)。 #注:EasyCICS使用SetTransId函数/方法。,CICS Communication Area,CICS通讯区域,由CICS 自动传递。 长度不大于32 K (32500)。 EXEC CICS ADDRESS COMMAREA。 被异步启动的交易程序通讯区域长度为0。,CICS通信区要用NULL填充,A CICS optimisation Applies to LINK and RETURN commareas,: LINK PROGRAM (abcd) COMMAREA (comm) LENGTH (500) :,: LINKAGE SECTION 01 DFHCOMMAREA PIC X(500). :,abcd,Data x00,0,20,500,21,500 bytes sent,LESS DATA TRANSMITTED,20 bytes transmitted,500 bytes received,TXSeries/CICS客户机程序,CICS Client编程概述,功能 从非CICS程序的客户程序调用CICS Server交易 编程方式 External Call Interface,简称ECI 基于对Server程序(Program)的请求 通过通讯缓冲数据区(COMMAREA)与Server交换数据 ECI应用程序被Server视为发出DPL请求的对等Server External Presentation Interface,简称EPI 基于对Server交易(Transaction)的请求 通过3270数据流与Server交换数据 EPI 应用程序被Server视为3270终端 多用于内部管理应用,External Call Interface (ECI),ECI Client程序示例 (C语言),#include ECI_PARMS EciParms; char commArea1024; memset (,ECI Client程序示例 (Java语言),byte abytCommarea = new byteiCommareaSize; javaGatewayObject = new JavaGateway(“local:”, 0); /local gateway /javaGatewayObject = new JavaGateway(“tcp:/localhost”, 2006); /remote gateway String strServer = “CICS01“; /strServer= “tcp:/01:1436”; /Use IPIC ECIRequest requestObject = new ECIRequest(ECIRequest.ECI_SYNC, strServer, “TEST“, “TEST“, strProgram, null, abytCommarea, iCommareaSize, ECIRequest.ECI_NO_EXTEND, 0); int iRc = javaGatewayObject.flow(requestObject); if(requestObject.getCicsRc() = ECIRequest.ECI_NO_ERROR) System.out.print(Integer.toHexString(abytCommareai); javaGatewayObject.close();,ECI函数调用,CICS_ExternalCall cics_sshort_t CICSCALL CICS_ExternalCall(ECI_PARMS CICSPTR *EciParms); 实现了ECI的大部分功能 只有一个参数,称为ECI参数模块(ECI parameter block) 该模块描述了ECI调用实现的功能及输入输出的数据 CICS_EciListSystems 获得Client定义的可连接的Server名称及描述,ECI CICS_ExternalCall调用分类,CICS_ExternalCall 通过设置ECI参数模块中的eci_call_type栏位来控制调用类型。 程序执行调用(Program link calls) 请求执行Server程序 同步调用 异步调用(异步调用后必须使用回复信息查询调用获得结果) 状态查询调用(Status information calls) 查询Server属性及状态信息 同步调用 异步调用 回复查询调用(Reply solicitation calls) 获得异步调用的结果 获得任何类型的异步调用结果 获得指定异步调用的返回结果(eci_message_qualifier),ECI CICS_ExternalCall参数设置,eci_system_name CICS Server名称 Region Name ( RPC Client ) Client定义的Server Instance 名称 ( Universal Client ) eci_userid eci_password eci_commarea 通讯数据区(线性缓冲区) 调用前存放将要传至Server的数据 调用返回后,其中存放Server传回的数据 eci_commarea_length 数据区的长度 该值应设为上传和返回数据长度两者中的较大值 若上传实际数据长度小于该值,数据后的空间应以NULL字符填充 eci_call_type 调用类型,程序执行调用(Program link calls),eci_program_name 请求执行的Server程序名 同步调用 eci_call_type = ECI_SYNC 异步调用 eci_call_type = ECI_ASYNC eci_message_qualifier = xxxx (可选) 标示每一个异步调用,回复查询调用时使用 , 以便获得特定的调用返回结果 eci_callback 回调函数,逻辑工作单元( Logical Unit of Work ) 的管理,LUW可以由唯一一个程序执行调用构成,或通过扩展(Extend)调用由多个顺序执行的程序调用构成 eci_luw_token栏位来标识LUW eci_luw_token取值由ECI自动生成 LUW中的第一个程序调用时 , eci_luw_token应设为ECI_LUW_NEW,该调用返回后,eci_luw_token中即保存了ECI生成的数值 该LUW中后续程序调用的eci_luw_token应保持该值不变 eci_extend_mode栏位LUW是否扩展、提交或回滚 ECI_NO_EXTEND ECI_EXTENDED ECI_COMMIT (不能和eci_program_name栏位同时设置) ECI_BACKOUT (不能和eci_program_name栏位同时设置),状态查询调用(Status information calls),ECI状态模块 状态信息存放在ECI状态模块(ECI status block) 中 状态模块的输入输出通过eci_commarea栏位完成 ECI中包括如下信息: 连接类型(连接到Server、Client 或Nothing) Server状态(available, unavailable, or unknown) Client状态(available, not applicable, or unknown) 状态查询调用可以完成的功能 请查询当前状态 检测状态变化 取消状态检测,如何请查询当前状态,eci_commarea 指向ECI状态模块的指针,返回结果存放其中 eci_commarea_length = ECI_STATUS_LENGTH eci_extend_mode = ECI_STATE_IMMEDIATE 同步调用 eci_call_type = ECI_STATE_SYNC 异步调用 eci_call_type = ECI_STATE_ASYNC eci_message_qualifier = xxxx (可选) 标示每一个异步调用 回复查询调用时使用 , 以便获得特定的调用返回结果,如何检测状态变化,为ECI指定一个特定的状态, 一旦实际状态与指定状态不符, 将得到ECI提示 只能是异步调用 eci_commarea 指向ECI状态模块的指针,返回结果存放其中 eci_commarea_length = ECI_STATUS_LENGTH eci_extend_mode = ECI_STATE_CHANGED eci_call_type = ECI_STATE_ASYNC eci_message_qualifier = xxxx (可选) 标示每一个异步调用 回复查询调用时使用 , 以便获得特定的调用返回结果 eci_luw_token = ECI_LUW_NEW 调用返回后, 该栏位存放一个有ECI生成的值, 标示该检测用于取消检测时,指定操作对象,如何取消状态检测,取消一个状态检测请求 eci_commarea NULL eci_commarea_length = 0 eci_extend_mode = ECI_STATE_CANCEL eci_call_type = ECI_STATE_SYNC eci_luw_token 请求检测状态调用该栏位的返回值,回复查询调用(Reply solicitation calls),获得异步调用的返回结果 回复查询调用分为如下类型: ECI_GET_REPLY 获得任何异步调用的返回结果 ,若无回应,立即返回 ECI_GET_REPLY_WAIT 获得任何异步调用的返回结果 ,若无回应,等待 ECI_GET_SPECIFIC_REPLY 获得指定异步调用的返回结果,若无回应,立即返回 ECI_GET_SPECIFIC_REPLY_WAIT 获得指定异步调用的返回结果,若无回应,等待,使用ECI_GET_REPLY或ECI_GET_REPLY_WAIT,eci_call_type ECI_GET_REPLY ECI_GET_REPLY_WAIT eci_commarea 若取得程序执行调用的回复,其中存放Server返回的数据 若取得状态查询调用的回复,其中存放ECI状态模块 eci_commarea_length 相应COMMAREA的长度,使用ECI_GET_SPECIFIC_REPLY 或ECI_GET_SPECIFIC_REPLY_WAIT,eci_call_type ECI_GET_SPECIFIC_REPLY ECI_GET_SPECIFIC_REPLY_WAIT eci_message_qualifier 设为相应异步调用该栏位的返回值 eci_commarea 若取得程序执行调用的回复,其中存放Server返回的数据 若取得状态查询调用的回复,其中存放ECI状态模块 eci_commarea_length 相应COMMAREA的长度,External Presentation Interface (EPI),EPI程序的常用函数,环境设置 CICS_EpiInitialize CICS_EpiDelTerminal 调用服务 CICS_EpiStartTran 收发数据 CICS_EpiGetEvent CICS_EpiReply,CTG/CUC的C程序的编译链接,宏定义:-DCICS_W32, -DCICS_AIX, -DCICS_SOL, -DCICS_HPUX, -DCICS_SCO 库: cclwin32.lib, -lcclaix, -lcclsol, -lcclhpux, -lcclsco 对UNIX,一般要加上-lpthread WIN32: cl /c /DCICS_W32 /DWIN32 /D_WIN32 /D_X86_=1 prg.c link prg.obj cclwin32.lib AIX: cc_r -c -DCICS_AIX -I/usr/lpp/ctg/include prg.c cc_r -o prg prg.o -lpthreads -lc_r -lcclaix Solaris: cc_r -c -DCICS_SOL -I/opt/ctg/include prg.c cc_r -o prg prg.o -lcclsol -lpthread HP-UX: cc_r -c -DCICS_HPUX -I/opt/ctg/include prg.c cc_r -o prg prg.o -lcclhpux -lpthread SCOUNIX: cc_r -c -DCICS_SCO -I/opt/K/SCO/cics/include prg.c cc_r -dy -o prg prg.o lcclsco 注:RPC Client使用宏定义:-DSELECT,库使用:-lcicsecico -lcicsepico,编写CICS Client程序的注意事项,对C语言的程序,注意CUC/CTG与RPC Client使用不同的头文件和库,以及编译选项。注意混用CUC/CTG与RPC Client的头文件和库后可以造成各种错误。 推荐尽量选择CUC/CTG,因为CUC/CTG 更稳定,而且在TXSeries v6以后, RPC Client被淘汰。,实现ECI用户出口程序的步骤,CICS 客户机端 ECI 用户出口使用 编写用户出口,实现 cicsecix.dll (cicsecix.c); 拷贝至 客户端应用程序的可执行文件目录中(bin); 启动客户端程序,编写用户出口程序的规则和指导,不允许在程序中使用 ECI 和 EPI调用; 应当避免在出口程序中,避免有等待或长时间运行的代码; 不能作为一个 RPC服务器来登记; 应参照编写DCE应用程序指南的多线程处理建议来执行; 出口调用参数应按照如下分类处理:参数分为输入、输出、输入输出类型; 输入参数在出口程序中,只能被查看,不能被修改; 输出参数在出口程序中,不能被查看,且必须在其中存储一个值; 输入输出参数在出口程序中,既能被查看,又能在其中存储一个值。,使用Channel & Container的应用示例,String cicsServ= “tcp:/host1:1436“, channelName= “CHANNEL1“, programlName= “CC0“; Channel reqChannel, respChannel; gateway = new JavaGateway(“local:“, 2006); reqChannel = new Channel(channelName); reqChannel.createContainer(“CONTAINER1“, “Hello CICS“.getBytes(); ECIRequest eciReq= new ECIRequest( ECIRequest.ECI_SYNC, /ECI call type cicsServ, /CICS server null, /CICS username null, /CICS password programlName, /Program to run null, /Transaction to run reqChannel, /Channel ECIRequest.ECI_NO_EXTEND, /ECI extend mode 0 /ECI LUW token ); gateway.flow(eciReq); cicsRc = eciReq.getRc(); if (eciReq.hasChannel() respChannel = eciReq.getChannel(); System.out.println( “BIT Data = “ + new String( cont.getBITData() );,C语言的remote client示例 (ECI v2),rc = openGatewayConnection(,C#的ECI程序示例,using (GatewayConnection gwyConnection = new GatewayConnection(gwyHostName, gwyPort) eciReq = new EciRequest(); eciReq.ServerName = cicsServer; eciReq.Program = ProgramName; eciReq.ExtendMode = EciExtendMode.EciNoExtend; eciReq.SetCommareaData(new byteCommareaLength); gwyConnection.Flow(eciReq); byte commarea = eciReq.GetCommareaData(); ,TXSeries服务器程序,Server 程序框架- C,int main() unsigned long respCode; char *commArea; EXEC CICS ADDRESS EIB(dfheiptr) RESP(respCode); if (respCode != DFHRESP(NORMAL) fprintf(stderr, “Error occurred addressing commarea, rc = %dn“, respCode); EXEC CICS RETURN; EXEC CICS ADDRESS COMMAREA(commArea) RESP(respCode); if (respCode != DFHRESP(NORMAL) fprintf(stderr, “Error occurred addressing commarea, rc = %dn“, respCode); EXEC CICS RETURN; . EXEC SQL . . EXEC CICS SYNCPOINT RESP(respCode); if (respCode != DFHRESP(NORMAL) ; EXEC CICS RETURN; EXEC CICS RETURN; ,Server 程序框架- COBOL,IDENTIFICATION DIVISION. PROGRAM-ID. xxx. DATA DIVISION. WORKING-STORAGE SECTION. . . LINKAGE SECTION. 01 DFHCOMMAREA. . . PROCEDURE DIVISION. . . EXEC CICS . END-EXEC. . . EXEC CICS RETURN END-EXEC. EXIT.,编译CICS程序,数 据 库 预 编 译 db2 prep - db2 proc - Oracle cpre - Sybase CICS预编译 cicstran -lC server.ccs C编译/连接 xlc_r4/xlc_r, cc_r cl 预编译 + C编译/连接 cicstcl -lC server.ccs,程序与交易,程序 完成一定功能的代码段 交易 CICS程序运行的特定环境 本身无实际的代码 第一个程序(First Program),链接其他程序,CICS程序的Logical Levels,CICS,Level 1,Level 2,Level 3,Level 0,CICS API,提供CICS 服务,由服务器端程序调用 分类 逻辑控制 数据及存储服务 时间服务 程序跟踪 APPC 通讯 . 通过CICS API 调用- EXEC CICS .,Error Handling,Default Actions COBOL: Most error conditions will abend the task. If the error is a busy condition, CICS will wait the task. Some conditions will be ignored. RESP respond code Code the RESP option and CICS will return the condition value. test respond code after invoke a command if respcode = DFHRESP(NORMAL) then use of RESP implies NOHANDLE HANDLE CONDITION COBOL & PL/I only. Identify a routine (label) to handle selected conditions. Also: NOHANDLE and IGNORE CONDITION.,通用的CICS API选项(1),RESP Command response (return code) RESP2 Extended response fields (INQ/SET) Applies to INQUIRE and SET commands only NOHANDLE Ignore handle condition Implicitly for C or C+ languages NOEDF Ignore execution diagnostic facility (CEDF),通用的CICS API选项(2),LENGTH Optional for COBOL and PL/I Must specify for data area in C/C+ except on the SEND MAP, RECEIVE MAP, READ, READNEXT, READPREV, REWRITE, WRITE, DEQ and ENQ commands A signed 16-bit binary value (Max 32767) FLENGTH Same as LENGTH full word or 32-bit binary value (But Max 2G) INTO and SET When receive data for CICS INTO : AP provides a suitable buffer to hold data for CICS SET : CICS Allocate a suitably sized buffer for data. CICS may reuse the buffers at a later time,Data Types,接口参数块-EIB,EIB - EXEC Interface Block 常用内容 EIBCALEN - 传输区长度 EIBDATE,EIBTIME - 程序启动时间 EIBREQID - 请求编号 EIBRESP - 回应代码 EIBRESP2 - 详细回应代码 EIBTASKN - 任务编号 EIBTRNID- 交易名称 一些可通过CICS API 获得,交易内数据共享,使用COMMAREA - LINK 或XTCL EXEC CICS LINK. COMMAREA() EXEC CICS XCTL. COMMAREA() 使用CICS 私有存储区 EXEC CICS GETMAIN SET() TWA - Transaction Work Area 同一交易内所有程序共享 TD中定义大小 TWASize (Transaction Work Area Size) 范围0 - 32767 Bytes EXEC CICS ADDRESS TWA() 程序自身数据段( 如COBOL CALL) CALL USING.,交易间数据共享,CWA - Common Work Area REGION内所有程序共享 RD中定义大小 CWASize (Common Work Area Size) 范围512 - 3584 Bytes EXEC CICS ADDRESS CWA() 共享CICS存储区 EXEC CICS GETMAIN SET() SHARED 使用临时存储队列(TSQ) 使用暂存数据队列(TDQ) 使用VSAM 文件,CICS 内部资源,内存资源( 包括Private和Shared ) VSAM 文件 临时存储队列(TSQ) 暂存数据队列(TDQ),内存资源,由Region定义大小 交易私有存储区 交易结束自动释放 交易独享存储量 交易共享存储区 需要显式释放 所有交易共享存储总量 通过CICS API 操作,VSAM 文件,结构化文件- 含记录结构 种类 ESDS 以入口为序 只能在尾部增加 RRDS 记录长度固定 可以复用删除的记录空间 KSDS 以索引为序,临时存储队列(TSQ),序列存放可变长记录的队列, main(在内存中,non-recoverable,在shutdown REGION后丢失) auxiliary(在SFS中,可设成recoverable,在cold启动REGION后丢失) 当超过限时inactive状态时,被删除 使用之前可不定义;当考虑TSQ为REMOTE,安全考虑或要设成可恢复时,必须先定义 可用CEBR来浏览或删除,暂存数据队列(TDQ),intrapartition(在SFS文件系统中) trigger recoverable none(不可恢复) physical(当REGION异常中断时,可恢复最后一个READ) logical(根据LUW,可恢复) READ后,自动删除 extrapartition(在AIX文件系统中) record-oriented AIX文件 IOMODE(read-only或write-only) MaxSize,存取操作,EXEC CICS ADDRESS 可获取LINK,XTCL的参数 COMMAREA TWA,CWA EXEC CICS RETRIEVE 可获取START的参数 DATA,TERMID,TRANID RTERMID,RTRANID EXEC CICS ASSIGN 可获得环境参数( Region 属性等),内存操作,EXEC CICS GETMAIN 申请内存,non-shared 或shared EXEC CICS FREEMAIN 释放内存,资源锁操作,EXEC CICS ENQ 资源加锁 NOSUSPEND 遇忙不等待 EXEC CICS DEQ 释放资源锁,TDQ操作,EXEC CICS READQ TD Extrapartition TDQ 必须设为input 属性 Intrapatition TDQ 读出的项被删除 EXEC CICS WRITEQ TD Extrapartion TDQ必须设为output属性 EXEC CICS DELETEQ TD 删除TDQ的所有内容 仅对Intrapatition TDQ有效,TSQ操作,EXEC CICS READQ TS ITEM参数指定读某一项 NUMITEMS获得队列中项的数量 EXEC CICS WRITEQ TS 写入一项并从ITEM参数返回编号 可指定ITEM 对某一项覆盖 MAIN | AUXILIRARY指定TSQ在内存或外设 EXEC CICS DELETEQ TS 删除TSQ的所有项,时间相关操作,EXEC CICS ASKTIME 获得绝对时间 自1900年1月1日以来的毫秒数 EXEC CICS FORMATTIME 按要求格式化绝对时间 EXEC CICS DELAY 使程序延时执行 EXEC CICS CANCEL 取消延时或取消异步执行的交易,访问数据库(non-XA),数据库连接 EXEC SQL CONNECT TO DATABASE;数据库操作 EXEC SQL . 数据库提交 EXEC SQL COMMIT; EXEC SQL ROLLBACK; 数据库关闭 EXEC SQL DISCONNECT; 通过sqlca.sqlcode来判断返回状态,访问数据库(XA),无需数据库连接、关闭 数据库操作 EXEC SQL . 交易数据提交 EXEC CICS SYNCPOINT; EXEC CICS SYNCPOINT ROLLBACK; 通过sqlca.sqlcode来判断返回状态,交易管理操作,EXEC CICS SYNCPOINT 提交CICS 交易,结束一个LUW 在各个资源管理器之间(包括RDBMS)达成两阶段提交 EXEC CICS SYNCPOINT ROLLBACK 回滚CICS 交易,结束一个LUW,业务流程控制,EXEC CICS LINK 调用另一个程序 结束返回调用程序 EXEC CICS XCTL 将控制转给另一个程序 EXEC CICS START 异步执行另一个交易 EXEC CICS RETURN 执行返回语句,注意事项:线程安全,Always use thread-safe libraries Example: ctime keeps static data between calls. Thread-safe versions of most libraries provided USE THEM Example: libc_r rather than libc ctime_r rather than ctime Only make EXEC CICS calls and do XA work from MAIN thread,注意事项:不推荐使用的函数,Any function that is not thread safe exec setlocale Shared memory functions (do not attach memory at the address specified with the Region Definitions (RD) RegionPoolBase attribute. CICS uses this address for region pool shared memory). CICS internal functions exit, abort or _exit fork kill (do not send signals to any CICS process) raise,raise assert abort sigprocmask signals signal masks cin, cout, cerr DCE asynchronous cancellation DCE threads Encina TRAN Encina Transactional C Encina threadTid catch(.) (in C+ programs any exceptions not generated by the application must be rethrown (using throw with no argument).,注意事项:注意关闭/删除资源或恢复状态,Database Resource Database cursors Database temp table Handles File descriptors TCP/IP socket descriptors Memory Shared memory Dynamically allocated memory Environment Environment variables Current working directory Process priority,注意事项:静态/全局变量等,当CICS程序需要驻留在内存时(PD的Resident=Yes),慎用静态(static)变量 在C+程序的全局类变量的构造或析构函数内不得调用CICS API。,注意事项:对齐方式,Structure packing struct commAreaStruct char ch; int i; sizeof(struct commAreaStruct) = ? 编译选项 #pragma options align = packed #pragma options align = reset,注意事项:高低位的转换,Intel芯片与RISK芯片,高低位的转换 int converti(int src) int ret, i; for (i = 0; i 4; i+) *(char *) ,RESP,只有在本源文件内调用过EXEC CICS ADDRESS EIB(dfheiptr)后,才可以使用RESP,否则会发生越界错误。,服务器守护程序与ABEND HANDLER,在设计CICS/TXSeries守护程序时,要考虑以下要点: 1. 守护程序必须得到保护,不能异常退出。 2. 守护程序不能长时间等待网络通信(比如分布式同步的操作)。 针对保护守护程序不异常退出的问题,可使用Abend Handler的方法,即在Abend Handler中重新启动守护程序。其方法是在受保护的程序中注册Abend Handler(例如“EC003”): EXEC CICS HANDLE ABEND PROGRAM(“EC003“); Abend Handler的写法与一般程序相似,可以以EXEC CICS RETURN结束,或者以EXEC CICS ABEND结束(接着调用系统默认的Abend Handler)。注意Abend Handler不能捕获Force Purge产生的A147。 针对保护守护程序长时间等待网络通信,其实不应该在守护程序中直接启动远端交易,无论采用同步还是异步方式。最正确的办法是在守护程序中异步启动一个本地交易,该本地交易再启动远端交易(采用同步还是异步方式都可以),CICS Exit Types,定义CICS Exits,实现CICS User Exits的步骤,编写用户出口程序的规则和指导,用户出口程序必须用 C 语言写。 用户出口程序必须为可重入的。 不破坏 CICS 的系统完整性是用户的责任。 用户出口程序必须不使用 EXEC CICS 命令(应用程序设计接口)。 必须在所有用户出口程序中使用提供的 cics_UE_Header_t 结构。 所有写 CICS 应用程序的文档化限制 也适用于编写用户出口程序。另外,请勿使用系统调用、信号处理器。 请勿将用户出口程序作为 CICS 应用程序使用,否则,将导致不可预测的结果。 没有提供用于处理用户出口程序中的错误的专用设施。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拍卖后期支付协议
- 前妻居住权合同样本
- 供货付款月结合同标准文本
- 制冷设备维修保养合同样本
- 动画设计合同范例
- 买房签临时合同样本
- 个人仓库合同样本
- 出售树林合同样本
- 农资雇佣合同标准文本
- app代理运营合同标准文本
- 化工厂施工吊装方案
- 浙江省温州市“十五校联合体”2025届高三二诊模拟考试英语试卷含解析2
- DB14∕T 1795-2019 连翘种子标准规范
- 管理学实证研究应用模板
- 辣条制作工艺
- 《自贡市医疗服务项目价格汇编(2023版)》
- 外观不良改善报告
- 我是小小志愿者介绍主题班会课件
- 第19课《资本主义国家的新变化》课件-高一下学期统编版(2019)必修中外历史纲要下
- 第十七章 勾股定理 -利用勾股定理求最短路径问题(教案)-2023-2024学年人教版数学八年级下册
- 2024年社区工作者面试题库与答案
评论
0/150
提交评论