




免费预览已结束,剩余33页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
应用程序开发指南第一章 开发BEA Tuxedo应用程序1.1 开发前的思考在开发BEA Tuxedo应用程序之前,你需要先搞清楚一系列和设计开发相关的概念,如识别什么是客户机,有哪些方法可以从外界收集数据并提交服务器进行业务处理;识别什么是服务器,哪些程序包容了可以处理客户机输入的商业逻辑;识别什么是类型缓冲区,客户程序在向其这程序发送数据前如何分配内存区域;什么是BEA Tuxedo的消息范例等。最后你还要弄明白客户程序是通过调用ATMI库来访问BEA Tuxedo系统的。1.2 创建BEA Tuxedo的客户程序创建BEA Tuxedo的客户程序与在C和C+编程语言中创建其它应用程序一样,BEA Tuxedo提供了一个其于C语言的编程接口,即应用程序事务监控接口ATMI,这套接口很容易使用,以便用于开发客户程序和服务程序。除了C语言接口外,BEA Tuxedo还提供了COBOL接口。客户程序的任务客户程序一般执行如下任务:1 调用tpchkauth()决定加入一个应用程序所需的安全级别。可能出现的响应包括:没有安全级别,应用程序口令,应用程序授权,访问控制列表,连接级加密,公钥加密,审计。这些可以根据你的需求进行选择;2 调用tpinit()来连接到一个BEA Tuxedo应用程序,所需的安全信息作为tpinit()的参数传给了应用程序;3 执行服务请求;4 调用tpterm()来断开和BEA Tuxedo应用程序的连接。1.3 创建的服务程序尽管开发者使用ATMI编程接口来创建BEA Tuxedo客户程序和服务程序,但服务程序不全部由开发者来编写,开发者只需写一些称为服务的商业函数,然后和BEA Tuxedo的一些二进制程序联编成一个可执行的服务程序。BEA Tuxedo服务程序启动后,它总是保持运行状态,只到接收到一个shutdown消息为止。一个典型的BEA Tuxedo服务程序在shutdown或reboot之前都在执行着数千个服务。服务程序的任务1 在BEA Tuxedo服务程序启动时,执行tpsvrinit()函数,可以在里面打开一些如数据库之类的资源供以后使用;2 在BEA Tuxedo服务程序关闭时,执行tpsvrdown()函数,可以在里面关闭tpsvrinit()中打开的资料;3 BEA Tuxedo服务程序以服务的形式来响应客户程序的请求,客户程序不是通过名字来调用服务程序的,而是调用服务,客户程序不知道处理它请求的服务程序的位置;4 服务程序调用tpreturn()函数来结束服务请求,并返回一个缓冲区,必要时,将它传给客户程序;1.4 在应用程序中使用类型缓冲区在Bea Tuxedo系统中的所有通信过程都是通过类型缓冲区来完成的,Bea Tuxedo系统提供了大量的类型缓冲区来供开发者使用。所有类型缓冲区都必须通过Bea Tuxedo的tpalloc(), tprealloc(), tpfree()这些ATMI来分配回收,它们都有特定的头部。统一定义的类型缓冲区可以使它们在跨越不同网络、不同协议、不同CPU构架以及不同操作系统之间得到统一的处理,这就使得开发者在分布式计算环境中有效地避开了异构网络和异构计算机系统带来的差异,把精力集中在商业逻辑的开发上。1.5 在BEA Tuxedo应用程序中使用消息范例1BEA Tuxedo系统提供多种通信模式1 同步Request/Response模式;2 异步Request/Response模式;3 嵌套调用;4 调用转发;5 会话通信;6 主动消息通告;7 基于事件的通信;8 基于队列的通信;9 使用事务。2. 同步的Request/Response模式要进行同步调用,Bea Tuxedo客户程序使用ATMI函数tpcall()把一个请求送到服务程序,它不是通过名字来调用服务程序的,而是通过特定的服务来完成。客户程序要等到服务程序作出响应后才处理后面的工作,也就是说,它在收到服务程序的响应之前一直处于阻塞状态。3异步Request/Response模式要进行异步调用,客户程序必须调用两个ATMI函数:tpacall(3c)函数,用于请求一个服务;tpgetrply(3c)函数,用于取得服务程序的响应。客户程序在请求和响应之间要完成特定任务时,可以采用这种模式。4使用嵌套调用一个服务可以充当BEA Tuxedo客户程序,去调用其它BEA Tuxedo服务,换句话说,你请求的服务需要调用其它服务才能处理请求。BEA Tuxedo客户程序调用了服务X,等待它的响应,服务X调用服务Y后也处于等待状态,当服务X得到响应后,再给客户程序一个响应,这种机制的特点是效率高。5使用调用转发在嵌套服务中,最里层嵌套服务可以直接给客户程序一个响应,没有必要按照调用栈逐级返回,这就使其它嵌套服务可以处理其它请求,当第一个服务是一个分发代理时,这种模式是非常有用的。在嵌套调用中,被客户调用的服务X使用tpforward(3c)函数把请求传给服务Y,服务X没有tpreturn(3c)函数。客户程序不用管请求是由谁来完成的,因此,转发调用对客户程序是透明的。6会话通信会话通信适合于有多个缓冲区需要以有状态的方式在BEA Tuxedo客户程序和服务之间传递的场合。恰当地使用BEA Tuxedo的会话,因为参与会话的服务器在会话结束之前是不可用的。要完成会话通信,你的代码需要遵循如下步骤:1 客户程序使用tpconnect()启动会话;2 客户程序和服务使用tpsend()和tprecv()函数进行数据交换,一个特殊的标记指示着当前由哪一方来控制着会话;3 当服务程序调用tpreturn()或tpdiscon()函数时,会话正常终止。7主动消息通告要处理服务器的消息通知,客户程序必须使用tpsetunsol()函数来创建一个消息处理器,要发送主动消息,BEA Tuxedo客户程序或服务程序可以调用tpnotify()来把消息传递给单个客户程序,也可以通过tpbroadcast()函数来把消息同时广播给多个客户程序。当客户程序收到主动消息后,BEA Tuxedo系统调用客户程序的主动消息处理器来处理。在一个基于信号系统中,客户程序没有必要处理所有的主动消息,然而,在一个非信号系统中,客户程序必须使用tpchkunsol()函数来检查主动消息。当客户程序调用一个服务请求时,tpchkunsol()被隐含地调用。在调用tpnotify()时,如果你设置了tpack标记位,你将会收到一个请求通知。8基于事件的通信在基于事件的通信中,事件可以被发送到应用程序队列、LOG文件和系统命令。当BEA Tuxedo服务或客户程序调用tppost()函数时,任何一个BEA Tuxedo客户程序都可以使用tpsubscribe()函数订阅用户自定义事件;当BEA Tuxedo系统检测事件时,客户程序也可以订阅系统定义事件。当一个服务器死了,.SysServerDied事件就会被发布,它由BEA Tuxedo系统自动完成,不需要应用服务器干预。9基于队列的通信为了实现了和/Q系统的接口,BEA Tuxedo客户程序使用两个ATMI函数,使用tpenqueue()把消息放入队列空间,使用tpdequeue()来把消息从队列空间中取走。下面演示了点对点异步消息机制。一个客户程序使用tpenqueue()函数将消息传给服务,响应队列和失败队列的名字可以作为参数包含在tpenqueue()调用中,由于在队列中的数据是持续的,因此,所有和排队消息相关的响应消息和失败消息都可以从相应的响应队列和失败队列中取得。客户程序可以使用缺省的排队顺利,即按放放顺利排队,先进先出;也可以改变排队规则,如把一个消息放在队列开始,或放到另一个队列前面。Tpenqueue()调用把消息送到TMQUEUE服务器,并被放入固定存储体中进行排队,然后给客户程序发送一个通知消息。队列管理器给消息分配一个标识符,使用它可以随时将消息踢出队列,也可以用于tpenqueue()中,指示将新消息紧挨着标识符标识的消息。在消息出队时,要出队消息的事务必须成功地提交。客户程序使用tpdequeue()来使消息出队。下面演示了消息被转发到另一个服务器。客户程序发出一个消息,要调用服务器上的X服务,X服务接收消息后,处理消息中的指令,然后把响应放入队列空间,客户程序再从队列空间中取出。排队系统对于服务来说是透明的,也就是说,不论服务请求是从队列发出的,还是通过tp(a)call发出的,服务都能接受。10使用事务要使用事务,应用程序开发者需要使用如下ATMI函数:1 tpbegin(),用于开始一个事务;2 tpcommit(),开始一个二阶段提交处理;3 tpabort(),产即终止事务。任何放在begin,commit/abord之外的代码不包含事务中。在下面的例子中,客户程序打开了一个事务,请求了两个服务,并且提交了事务。因为服务请求是在事务开始和提交之间完成的,所以两个服务的行为都被了事务记录。第二章 一个简单的Tuxedo应用程序simpapp本章介绍了BEA Tuxedo的一个简单例子,用C语言编写的simpapp,它包含了一个客户程序和一个服务器,服务器只执行一个服务:从客户程序接收小写字母,将其转换成大写后,返回给客户程序。在使用这个例子之前,需要在系统中安装C语言编译器。准备simpapp的文件和资源在准备simpapp例子之前,系统中必须安装了BEA Tuxedo软件,而且要设置$TUXDIR环境变量,NT平台下为%TUXDIR%,并把%TUXDIR%bin加到PATH中,最后还要确保你的工作目录要有写权限。完成这些工作后,请按如下步骤来准备simpapp程序:1 复制simpapp所需要的所有文件,它们位于$TUXDIR/samples/atmi/simpapp目录下;2 检查并编译客户程序;3 检查并编译服务程序;4 编辑并加载配置文件;5 启动应用程序;6 执行运行时应用程序;7 监视运行时应用程序;8 关闭应用程序。完成这个例子后,你应该理解客户程序和服务器所执行的任务,根据你的环境编写一个配置文件,通过tmadmin检查应用程序的活动。同时,你应该理解BEA Tuxedo应用程序的基本组成部分:客户程序、服务器程序、配置文件,通过BEA Tuxedo系统的哪些命令来管理你的应用程序。1复制simpapp例子的相关文件1 创建目录:mkdir simpdircd simpdir2 设置并导出环境变量TUXDIR=BEA Tuxedo系统的根目录,如UNIX系统下可以设置为:TUXDIR=/usr/tuxedo,NT系统下可以设置为:TUXDIR=G:Program FilesBEA SystemTuxedoTUXCONFIG=当前工作目录加上/tuxconfig,如UNIX系统下可以设置为:TUXCONFIG=/usr/me/simpdir/tuxconfig,NT系统下可以设置为:TUXCONFIG=G:simpdirtuxconfigPATH=$PATH:$TUXDIR/binLD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/libexport TUXDIR TUXCONFIG PATH LD_LIBRARY_PATHTUXDIR和PATH用于访问BEA Tuxedo系统的文件和执行命令,在Sun Solaris系统中,必须把/usr/5bin放在PATH中的第一个,在RS6000中的AIX上,将LD_LIBRARY_PATH替换成LIBPATH,在HP9000中的HP-UX上,将LD_LIBRARY_PATH替换为SHLIB_PATH。设置TUXCONFIG的目的是用于加载配置文件。3 复制simpapp文件,cp $TUXDIR/samples/atmi/simpapp/* .4 查看文件$lsREADME env simpapp.nt ubbmp wsimpclREADME.as400 setenv.cmd simpcl.c ubbsimpleREADME.nt simpapp.mk simpserv.c ubbws文件说明:simpcl.c客户程序的源代码simpserv.c服务程序的源代码ubbsimple应用程序配置文件的纯文本形式2检查并编译客户程序1 检查客户程序$more simpcl.c#include #include atmi.h/* TUXEDO的头文件 */#if defined(_STDC_) | defined(_cplusplus)main(int argc, char *argv)#elsemain(argc, argv)int argc;char *argv;#endifchar *sendbuf, *rcvbuf;long sendlen, rcvlen;int ret;if(argc != 2) (void) fprintf(stderr, Usage: simpcl stringn);exit(1);/* 作为一个客户过程连接到System/T */if (tpinit(TPINIT *) NULL) = -1) (void) fprintf(stderr, Tpinit failedn);exit(1);sendlen = strlen(argv1);/* 分配一个供请求响应使用的STRING 缓冲区 */if(sendbuf = (char *) tpalloc(STRING, NULL, sendlen+1) = NULL) (void) fprintf(stderr,Error allocating send buffern);tpterm();exit(1);if(rcvbuf = (char *) tpalloc(STRING, NULL, sendlen+1) = NULL) (void) fprintf(stderr,Error allocating receive buffern);tpfree(sendbuf);tpterm();exit(1);(void) strcpy(sendbuf, argv1);/* Request the service TOUPPER, waiting for a reply */ret = tpcall(TOUPPER, (char *)sendbuf, 0, (char *)&rcvbuf, &rcvlen, (long)0);if(ret = -1) (void) fprintf(stderr, Cant send request to service TOUPPERn);(void) fprintf(stderr, Tperrno = %dn, tperrno);tpfree(sendbuf);tpfree(rcvbuf);tpterm();exit(1);(void) fprintf(stdout, Returned string is: %sn, rcvbuf);/* Free Buffers & Detach from System/T */tpfree(sendbuf);tpfree(rcvbuf);tpterm();return(0);说明:语句说明atmi.h调用ATMI函数必须的头文件tpinit()客户程序调用它来加入应用程序tpalloc()用于分配类型缓冲区的ATMI函数,STRING是五种BEA Tuxedo缓冲区数据类型之一,sendlen+1表示缓冲区类型,因为以空字符结尾,所以长度加1tpcall()把消息缓冲区送到TOUPPER服务,它提供了响应缓冲区的地址,它一直等待着返回消息tpterm()用于退出应用程序的ATMI函数,tpfree()释放分配的缓冲区,是和tpalloc()相对应的函数2 编译客户程序$buildclient -o simpcl -f simpcl.c-o指明输出目标文件名,-f指出源文件名3检查并编译服务程序1 检查服务程序$more simpserv.c#include #include #include /* TUXEDO Header File */#include /* TUXEDO Header File */* 当服务器启动时,在处理请求之前,tpsvrinit被执行,这个不是必须的,对应的函数是shutdown*/#if defined(_STDC_) | defined(_cplusplus)tpsvrinit(int argc, char *argv)#elsetpsvrinit(argc, argv)int argc;char *argv;#endif/* 当argc, argv没有被使用时,一些系统会发了警告 */argc = argc;argv = argv;/* userlog用于将TUXEDO消息写到日志文件中 */userlog(Welcome to the simple server);return(0);/* TOUPPER真正处理客户请求,它接收的参数是一个缓冲区指针 */#ifdef _cplusplusextern C#endifvoid#if defined(_STDC_) | defined(_cplusplus)TOUPPER(TPSVCINFO *rqst)#elseTOUPPER(rqst)TPSVCINFO *rqst;#endifint i;for(i = 0; i len-1; i+)rqst-datai = toupper(rqst-datai);/* 返回转换后的类型缓冲区 */tpreturn(TPSUCCESS, 0, rqst-data, 0L, 0);说明:语句说明whole file整个服务程序不提供main函数,在build时,由BEA Tuxedo系统提供。tpsvrinit()在服务器初始化即处理请求之前被调用。若没有提供该函数,BEA Tuxedo系统会提供一个缺省的,它向USERLOG中写一条消息,说明服务器已经被启动。userlog(3c)是系统提供的一个写日志的方法。TOUPPER()simpserv提供的唯一一个服务,它接收一个TPSVCINFO结构,它包含了要被转换成大写的字符串。for loopBEA Tuxedo系统的循环,用于逐一转换。tpreturn()2 编译服务器$buildserver o simpserv f simpserv.c s TOUPPERs TOUPPER指明了在服务器启动时需要提供的服务4编辑并加配置文件1 怎样编辑配置文件#ident(#) apps/simpapp/ubbsimple$Revision: 1.1.10.1 $#Skeleton UBBCONFIG file for the TUXEDO Simple Application.# 将里而的内容替换成实际值.*RESOURCESIPCKEY#Example:#IPCKEY123456DOMAINIDsimpappMASTERsimpleMAXACCESSERS10MAXSERVERS5MAXSERVICES10MODELSHM*MACHINESDEFAULT:APPDIR=TUXCONFIG=TUXDIR=#Example:#APPDIR=/home/me/simpapp#TUXCONFIG=/home/me/simpapp/tuxconfig#TUXDIR=/usr/tuxedo# 对于NT平台,可以替换成如下值#APPDIR=G:JQEJBsimpapp#TUXCONFIG=G:JQEJBsimpapptuxconfig#TUXDIR=G:Program FilesBEA SystemTuxedoLMID=simple#Example:#JQLMID=simple*GROUPSGROUP1LMID=simpleGRPNO=1OPENINFO=NONE*SERVERSDEFAULT:CLOPT=-AsimpservSRVGRP=GROUP1 SRVID=1*SERVICESTOUPPER2 加载配置文件$ tmloadcf ubbsimpleInitialize TUXCONFIG file: /usr/me/simpdir/tuxconfig y, q ? y$5启动应用程序1 执行tmboot启动应用程序$tmbootBoot all admin and server processes? (y/n): yBooting all admin and server processes in/usr/me/simpdir/tuxconfigBooting all admin processes .exec BBL -A:process id=24223 . Started.Booting server processes .exec simpserv -A :process id=24257 . Started.2 processes started.BBL是应用程序中监视共享内存结构的管理进程,simpserv是连续运行的simpapp服务程序,它等待着处理请求。6如何执行运行时应用程序$ simpcl “hello, world”Returned string is: HELLO, WORLD7如何监视运行时应用程序作为管理者,你可以使用tmadmin命令解释器来检测一个应用程序,并作一些动态的改变,要运行该命令,你必须设置TUXCONFIG环境变量。tmadmin可以解释超过50个命令,要看完整的列表,请看tmadmin(1),这里我们使用了两个tadmin命令。输入如一命令:$tmadmin显示:tmadmin - Copyright (c) 1999 BEA Systems, Inc. All rightsreserved.2 输入printserver(psr)命令,显示: psra.out Name Queue Name Grp Name ID RqDone Load Done Current Service- - - - - - -BBL 531993 simple 0 0 0 ( IDLE )simpserv 00001.00001 GROUP1 1 0 0 ( IDLE )3 输入printservice(psc)命令,显示:Service Name Routine Name a.out Name Grp Name ID Machine # Done Status- - - - - - - - -TOUPPER TOUPPER simpserv GROUP1 1 simple - AVAIL8如何关闭应用程序1 运行tmshutdown命令来关闭应用程序$ tmshutdownShutdown all admin and server processes? (y/n): yShutting down all admin and server processes in/usr/me/simpdir/tuxconfigShutting down server processes .Server Id = 1 Group Id = GROUP1 Machine = simple: shutdownsucceeded.Shutting down admin processes .Server Id = 0 Group Id = simple Machine = simple: shutdownsucceeded.2 processes stopped.$2 检查ULOG文件$ cat ULOG*$113837.tuxmach!tmloadcf.10261: CMDTUX_CAT:879: A new file systemhas been created. (size = 32 4096-byte blocks)113842.tuxmach!tmloadcf.10261: CMDTUX_CAT:871: TUXCONFIG file/usr/me/simpdir/tuxconfig has been created113908.tuxmach!BBL.10768: LIBTUX_CAT:262: std main starting113913.tuxmach!simpserv.10925: LIBTUX_CAT:262: std main starting113913.tuxmach!simpserv.10925: Welcome to the simple server114009.tuxmach!simpserv.10925: LIBTUX_CAT:522: Defaulttpsvrdone() function used.114012.tuxmach!BBL.10768: CMDTUX_CAT:26: Exiting system第三章 一个完整的Tuxedo应用程序bankappbankapp是BEA Tuxedo系统提供一个简单的银行应用程序,它完成如下功能:打开和关闭账号,查询账号余额,存款和取款,账号之间转账。3.1 熟悉bankapp的文件BEA Tuxedo系统提供了一个演示数据库,bankapp例子中有很多个地方使用了命令和SQL代码来访问它。bankapp由如下文件组成:源文件生成的文件内容说明ACCT.ec ACCT.c, ACCT.o,ACCT包括两个服务:OPEN_ACCT和CLOSE_ACCT 用于打开和关闭账号ACCTMGR.c ACCTMGR订阅事件和记录通告日志的服务器,包含: WATCHDOG 和 Q_OPENACCT_LOG 服务AUDITC.cAUDITC包括一个会话服务器处理来自客户端auditcon的请求BAL.ecBAL.c, BAL.o, BAL包括一组服务:ABAL, TBAL, ABAL_BID, 和TBAL_BID 允许audit客户获得银行或支行账号以及余额BALC.ecBALC.c, BALC.o,BALC 包括两个服务:ABALC_BID和TBALC_BID。这些服务和TBAL_BID,ABAL_BID是一样的。bankmgr.cbankmgr订阅特定事件客客户程序cracl.sh-用于创建访问控制列表ACL以演示ACL安全的shell脚本crqueue.sh-notification.用于创建应用程序队列以供事件通告使用的shell脚本crusers.sh-创建用户和组以演示验证安全级别的shell脚本event.flds-在事件特征中用到的字段表文件FILES -bankapp用到的所有文件列表README-在除NT以外的所有平台上安装指南README.nt-NT平台上的安装指南README2-在bankapp中演示新特性的自述文件README2.nt-在NT平台上演示新特性自述文件RUNME.cmd-在NT平台上创建、配置、启动、关闭应用程序的交互式脚本RUNME.sh-UNIX平台下的脚本文件,功能同上showq.sh!-显示消息队列的状态和内容的shell脚本TLR.ecTLR.c, TLR.o, TLR包含三个服务:WITHDRAWAL, DEPOSIT和INQUIRYusrevtf.sh-创建供TMUSREVT服务器使用的ENVFILE文件XFER.cXFER.o, XFER包括TRANSFER服务aud.vaud.V, aud.h一个在audit 客户和BAL服务器之间使用的FML view appinit.cappinit.o包含供所有服务器(除TLR以外)使用的用户自定义版的tpsvrinit()和tpsvrdown()audit.caudit.o, audit通过ABAL, TBAL, ABAL_BID和TBAL_BID 服务获得银行及支行账号和余余额的客户程序auditcon.cauditconaudit的交互式版本,使用ABAL, TBAL, ABALC_BID和TBALC_BID.服务bankapp.mk-UNIX下应用程序Make文件bankapp.nt-NT平台下应用程序的Make文件bank.fldsbank.flds.h由服务器使用,包含银行数据库和辅助FML字段文件bank.h-bankapp应用程序的头文件bankvar-包括bankapp使用的环境变量,其它环境变量在ENVFILE中定义,后者被前者调用crbank.shcrbank为bankapp在SHM模式下运行时创建数据的shell脚本crbankdb.shcrbankdb为一个服务器组创建数据库的shell脚本crtlog.shcrtlog, TLOG在master站和non-master站的UDL上创建UDL和TLOG的shell脚本driver.shdriver通过FML缓冲区驱动应用程序的shell脚本envfile.shenvfile, ENVFILE创建供tmloadcf使用的ENVFILE文件的shell脚本gendata.cgendata生成10个支行,30个出纳员及200个账号的程序gentran.cgentran从DEPOSIT, WITHDRAWAL, TRANSFER和INQUIRY.生成事务请求的程序populate.shpopulate通过FML缓冲区向数据库中插入支行、出纳员、和账号信息的shell脚本ubbmpTUXCONFIG在MP-mode下使用的UBBCONFIG文件ubbshmTUXCONFIG在SHM-mode下使用的UBBCONFIG文件util.cutil.o包含一组由服务使用的函数,如getstr1()等bankclt.cbankcltbankapp的客户程序3.2 检查bankapp的客户程序1bankclt.c文件它是一个基于文本的客户,提供了:余额查询、取款、存款、转账、打开账号、关闭、号、退出程序等几大功能。除退出应用程序以外,每一个选项都调用了一个执行如下功能的例程:1 通过get_account(), get_amount(), get_socsec(), get_phone(), get_val()函数从键盘获得用户输入。2 将值存入一个全局的FML缓冲区(*fbfr),有些函数需要更多的字段,需要根据服务器所需的信息来确定。3 通话通过do_tpcall()函数调用BEA Tuxedo系统服务,下面列出了一些函数和服务。函数名输入FML字段输出 FML字段服务名称BALANCE()ACCOUNT_IDSBALANCE INQUIRYWITHDRAWAL()ACCOUNT_ID SAMOUNTSBALANCEWITHDRAWALDEPOSIT() ACCOUNT_ID SAMOUNTSBALANCE DEPOSITTRANSFER() ACCOUNT_ID (0) ACCOUNT_ID (1) SAMOUNTSBALANCE (0) SBALANCE (1)TRANSFEROPEN_ACCT() LAST_NAME FIRST_NAME MID_INIT SSN ADDRESS PHONE ACCT_TYPE BRANCH_ID SAMOUNTACCOUNT_ID SBALANCEOPEN_ACCTCLOSE_ACCT() ACCOUNT_IDSBALANCECLOSE_ACCT4 调用成功完成后,每个函数可以从返回的FML缓冲区中取得需要的数据do_tpcall()函数的代码如下:static int do_tpcall(char *service)long len;char *server_status;/* 开始一个全局事务 */if (tpbegin(30, 0) = -1) (void)fprintf(stderr, ERROR: tpbegin failed (%s)n,tpstrerror(tperrno);return(-1);/* 使用用户数据请求服务 */if (tpcall(service, (char *)fbfr, 0, (char *)&fbfr, &len,0) = -1) if(tperrno= TPESVCFAIL & fbfr != NULL &(server_status=Ffind(fbfr,STATLIN,0,0) != 0) (void)fprintf(stderr, %s returns failure(%s)n,service,server_status);else (void)fprintf(stderr,ERROR: %s failed (%s)n, service,tpstrerror(tperrno);/* 终止事务*/(void) tpabort(0);return(-1);/* 提交事务 */if(tpcommit(0) 0) (void)fprintf(stderr, ERROR: tpcommit failed (%s)n,tpstrerror(tperrno);return(-1);return(0);2bankapp中怎样使用ud(1)bankapp使用到了Tuxedo系统的ud(1)程序,它允许数据从标准输入读取,并送到服务。populate和driver例程都用到了ud。在populate中,一个叫gendata的程序把服务请求以及要输入数据库的客户帐号信息一起传给了ud。在driver中也存在类似的数据流,但程序是gentran,它的作用是把事务传递给应用程序以模拟一个活动系统。3一个请求/响应客户:audio.caudit中一个请求/响应客户程序,用于支行或全行范围内的余额查询,它用到ABAL、TBAL、ABAL_BID、TBAL_BID服务,你可以通过如下两种方法来激活它:audit -a|-t,-a打印全行所有账号总额,-t打印全行范围内所有出纳员的现金供应。audit -a|-t branch_ID,打印某支行Branch_ID的上述信息。audit源代码包括两个主要部分:main()和sum_bal()子程序。两部分都用到了ATMI函数,它用到了一个在aud.h头文件中定义的VIEW类型的缓冲区,如下它的伪码:main()Parse command-line options with getopt();Join application with tpinit();Begin global transaction with tpbegin();If (branch_ID specified) Allocate buffer for service requests with tpalloc();Place branch_ID into the aud structure;Do tpcall() to ABAL_BID or TBAL_BID;Print balance for branch_ID;Free buffer with tpfree();elsecall subroutine sum_bal();Commit global transaction with tpcommit();Leave application with tpterm();sum_bal()Allocate buffer for service requests with tpalloc();For (each of several representative branch_IDs,one for each site)Do tpacall() to ABAL or TBAL;For (each representative branch_ID) Do tpgetrply() wtith TPGETANY flag setto retrieve replies;Add balance to total;Print total balance;Free buffer with tpfree();audit.c首先检查命令行参数,看是否指定的支行代号。若指定,则将它放入aud结构,并调用ABAL_BID或TBAL_BID服务来处理请求;否则就调用sum_bal()子过程来处理。它们的程序流程图如下:4一个会话客户:auditcon.cauditcon是audit的会话版,它使用了ATMI与会话相关的函数,如使用tpconnect()建立服务与客户之间的连接,用tpsend()发送一条消息,用tprecv()接收消息。如下是它的伪码:main()Join the applicationBegin a transactionOpen a connection to conversational service AUDITCDo until (user says to quit) Query user for inputSend service requestReceive responsePrint response on users terminalPrompt for further inputCommit transactionLeave the application5一个监视事件的客户bankmgr.cbankmgr是一个始终运行的应用程序,它订阅应用程序定义的事件,如一次存取超过10000美元的事件。3.3 检查bankapp的服务器和服务服务器是一些可执行的进程,它们提供一个或多个服务。在Tuxedo系统中,服务器始终接受来自客户端的服务请求,并将它们分配给某些服务,让它们来处理请求。所有bankapp的服务都是用C语言写的,包含有嵌入式SQL语句的C程序扩展名不是C而是EC。TRANSFER由XFER服务器来提供,它是唯一一个不包含嵌入式SQL的服务。所有bankapp服务使用ATMI的函数来管理类型缓冲区、和其它服务进行同步或异不通信、定义全局事务、一般地访问资源服务器、把响应发送回客户端。1bankapp的请求/响应服务器bankapp的5个服务器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海 项目管理 合同范本
- 按月支付的合同范本
- 非标铝材采购合同范本
- 竣工决算编制合同范本
- 游乐园合同范本
- 多个商标转让合同范本
- 企业采购水果合同范本
- 企业推拿服务合同范本
- 村镇餐饮配送合同范本
- 投资协议合同范本
- 图书管理员考试的注意事项和建议试题及答案
- 警校区队管理制度规定
- 郑州银行总行信息科技岗位招聘考试真题2024
- 新发展英语(第二版)综合教程2 课件 Unit 6 Cultural Difference
- 脑卒中失语症的康复护理
- 消防联动调试方案
- 2025年安徽中医药高等专科学校单招职业技能测试题库审定版
- 自动化仪表施工方案
- 注射用重组人TNK组织型纤溶酶原激活剂-药品临床应用解读
- DBJ04T 289-2020 建筑工程施工安全资料管理标准
- 小儿泄泻(小儿腹泻病)中医临床路径
评论
0/150
提交评论