210 likes | 598 Views
使用 Native API 开发 IBM TXSeries 和 CTG. 概要. TXSeries 编程框架 TXSeries/CICS 客户机程序 TXSeries 服务器程序. TXSeries 编程框架. 基于 TXSeries 的三层应用开发环境. TXSeries 的应用开发支持框架. 交易 (Transaction) ,任务 (Task) 和逻辑处理单元 (LUW) 的概念.
E N D
概要 • TXSeries编程框架 • TXSeries/CICS客户机程序 • TXSeries服务器程序
交易(Transaction),任务(Task)和逻辑处理单元(LUW)的概念交易(Transaction),任务(Task)和逻辑处理单元(LUW)的概念 • 交易(Transaction):一个交易可以对应于一支或多支CICS服务器端程序的执行。交易的执行多是由终端发出的请求:在终端键入一个四位的交易ID号。在一个交易的执行过程中,可能会触发一个或多个任务的执行。CICS允许一个交易程序被很多用户同时请求执行,而交易之间互不妨碍。这个交易(Transaction)的概念对应一个TD。 • 任务(Task):它是交易执行的一个单一实例。CICS与操作系统相结合,通过分配系统进程给每个任务,这样当一个任务处于等待状态时,操作系统可以将控制权交给另外一个任务。这个任务(Task)的概念对应一个PD。 • 逻辑处理单元(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
CICS Communication Area • CICS通讯区域,由CICS 自动传递。 • 长度不大于32 K (32500)。 • EXEC CICS ADDRESS COMMAREA。 • 被异步启动的交易程序通讯区域长度为0。
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终端 • 多用于内部管理应用, 不宜用于业务应用
ECI Client程序示例 #include <cics_eci.h> ECI_PARMS EciParms; char commArea[1024]; memset (&EciParms, 0, sizeof (ECI_PARMS)); memset(commArea,0,sizeof(commArea)); EciParms.eci_version = ECI_VERSION_1A; EciParms.eci_call_type = ECI_SYNC; memcpy(&EciParms.eci_program_name, "SERV0001", 8); memcpy(&EciParms.eci_userid, "CICSUSER", 8); memcpy(&EciParms.eci_password, "CICSUSER", 8); memcpy(&EciParms.eci_system_name, "CICSRG01", 8); EciParms.eci_commarea = commArea; EciParms.eci_commarea_length = sizeof(commArea); EciParms.eci_extend_mode = ECI_NO_EXTEND; EciParms.eci_luw_token = ECI_LUW_NEW; EciParms.eci_timeout = 0; memcpy(EciParms.tpn_name, "BPMI", 4); Rc = CICS_ExternalCall (&EciParms);
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)
Server 程序框架- C main(){ unsigned long respCode; char *commArea; EXEC CICS ADDRESS EIB(dfheiptr) RESP(respCode); if (respCode != DFHRESP(NORMAL)) { fprintf(stderr, "Error occurred addressing commarea, rc = %d\n", respCode); EXEC CICS RETURN; } EXEC CICS ADDRESS COMMAREA(commArea) RESP(respCode); if (respCode != DFHRESP(NORMAL)) { fprintf(stderr, "Error occurred addressing commarea, rc = %d\n", respCode); EXEC CICS RETURN; } ... EXEC SQL ... ... EXEC CICS SYNCPOINT; strcpy(commArea, "Return from Server.\n"); EXEC CICS RETURN; }
编译CICS程序 • 数 据 库 预 编 译 • db2 prep -- db2 • proc -- Oracle • cpre -- Sybase • CICS预编译cicstran -lC server.ccs • C编译/连接 • xlc_r4, cc_r • cl • 预编译 + C编译/连接cicstcl -lC server.ccs
部署CICS程序 • 安装Program • cicsadd • cicsupdate • cicsdelete • cicsget • 安装事务
程序与交易 • 程序 • 完成一定功能的代码段 • 交易 • CICS程序运行的特定环境 • 本身无实际的代码 • 第一个程序(First Program),链接其他程序
CICS API • 提供CICS 服务,由服务器端程序调用 • 分类 • 逻辑控制 • 数据及存储服务 • 时间服务 • 程序跟踪 • APPC 通讯 • ... • 通过CICS API 调用- EXEC CICS ...