Tuxedo培训-第四天.doc_第1页
Tuxedo培训-第四天.doc_第2页
Tuxedo培训-第四天.doc_第3页
Tuxedo培训-第四天.doc_第4页
Tuxedo培训-第四天.doc_第5页
免费预览已结束,剩余26页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高伟达软件公司 王鹏Bea Tuxedo培训教程第四天课程 编写整理 :王鹏2005-7-22第五章 开发与应用 在开发BEA Tuxedo应用程序之前,你需要先搞清楚一系列和设计开发相关的概念,如识别什么是客户机,有哪些方法可以从外界收集数据并提交服务器进行业务处理;识别什么是服务器,哪些程序包容了可以处理客户机输入的商业逻辑;识别什么是类型缓冲区,客户程序在向其这程序发送数据前如何分配内存区域;什么是BEA Tuxedo的消息范例等。最后你还要弄明白客户程序是通过调用ATMI库来访问BEA Tuxedo系统的。创建BEA Tuxedo的客户程序与在C和C+编程语言中创建其它应用程序一样,BEA Tuxedo提供了一个其于C语言的编程接口,即应用程序事务监控接口ATMI,这套接口很容易使用,以便用于开发客户程序和服务程序。除了C语言接口外,BEA Tuxedo还提供了COBOL接口。Tuxedo应用程序的开发流程Tuxedo客户端的处理流程Tuxedo服务进程的处理流程5.1 创建服务程序5.1.1概述 尽管开发者使用ATMI编程接口来创建BEA Tuxedo客户程序和服务程序,但服务程序不全部由开发者来编写,开发者只需写一些称为服务的商业函数,封装业务逻辑,然后和BEA Tuxedo的一些二进制程序联编成一个可执行的服务程序。BEA Tuxedo服务程序启动后,它总是保持运行状态,只到接收到一个shutdown消息为止。一个典型的BEA Tuxedo服务程序在shutdown或reboot之前都在执行着数千个服务。5.1.2 服务的运行流程为了更好的了解服务端的所有任务以编写服务端应用,有必要重新认识服务端在C/S模式中扮演的角色。首先,服务是系统资源的联系点。例如,一个数据库服务联系实际数据库并对其进行查询和修改。为有效进行,应建立一个数据库连接。 其次,服务必须发布系统内可以访问的交易,保证客户端可以知道把请求发往何处。 以上两步结束后,服务进入一个循环接收请求、处理请求并返回结果。接收请求包括进入消息队列,得到交易请求。处理请求包括检查请求数据缓冲,运行商业规则和逻辑,可能还包括访问数据库和返回结果数据缓冲。当系统管理员需要关闭系统,可以通过系统管理工具将关闭系统的消息发给服务。服务完成所有交易,取消交易发布,关闭资源连接然后结束。5.1.3 服务程序的任务(1) 在BEA Tuxedo服务程序启动时,执行tpsvrinit()函数,可以在里面打开一些如数据库之类的资源供以后使用;(2) 在BEA Tuxedo服务程序关闭时,执行tpsvrdown()函数,可以在里面关闭tpsvrinit()中打开的资源;(3) BEA Tuxedo服务程序以服务的形式来响应客户程序的请求,客户程序不是通过名字来调用服务程序的,而是调用服务,客户程序不知道处理它请求的服务程序的位置;(4) 服务程序调用tpreturn()函数来结束服务请求,并返回一个缓冲区,必要时,将它传给客户程序; 注:如果是在tpsvrinit()中连接数据库,为了保证数据库的正常连接,在执行服务的时候,最好能够判断数据库是否断开连接,如果断开连接,则重新连接数据库。这样可以从根本上保证系统能够持续稳定的长期运行,基本上不需要人工干预。也就不再会出现“数据库重启了,中间件必须重启”的情况。5.1.4 返回控制在一般的C程序中,函数通过调用return()将控制返回,函数调用堆栈清空,控制返回调用点。TUXEDO系统的交易函数必须结束于将回应返回给客户端或前转到另一交易。函数tpreturn()用来结束交易将回应数据缓冲发给客户端。函数tpforward()将交易前转给另一个交易,由其负责回应原来的客户端。下图是tpreturn()的示意图。tpreturn()设计来代替常规的return(),结束绝大多数函数。它将回应数据缓冲返回请求的客户端,控制权返回给服务程序的标准main()(由TUXEDO提供)。tpreturn()使用下列参数:第一个值表示交易是否成功,有3种可能: TPSUCCESS交易完全成功,如果是一个会话,TPEV_SVCSUCC被生成 TPFAIL交易失败,tperrno将被设成TPESVCFAIL。如果是事务模式,事务被标志成abort-only,如果是会话,TPEV_SVCFAIL被生成。 TPEXIT与TPFAIL类似,但服务会中断,如果服务设成可以重启动,则可以由TUXEDO系统将其重启动。第二个值是应用定义返回码,此处使交易可以发送一个整形代码到客户端,给出交易处理结果的详细信息。该值与/T系统无关,通过全程变量tpurcode送到客户端程序。第三个值是回应数据缓冲的的指针第四个值是回应数据缓冲的长度(仅缓冲类型为CARRY时需要)第五个值是标志位,通常不用5.1.5 初始化和结束服务tpsvrinit()和tpsvrdone()分别用来启动和关闭服务。如果应用不提供这两个函数,可以使用替代函数。tpsvrinit()用tpopen()缺省打开RM连接。tpsvrdone()用tpclose()关闭RM连接。tpsrvinit()象标准C语言的main()一样使用参数argc,argv。服务的命令行参数可以传入该函数,被getopt()解析。该部分的用法参见应用配置部分。本函数出错时返回-1,成功返回0。tpsvrdone()无参数,无返回值。5.1.6 创建(编译)服务当C语言的交易程序编码完后,需要连接正确的库并编译。使用buildserver可以使该过程容易一点。该命令引用了C语言编译器并按正确的次序连接TUXEDO系统的库,连接TUXEDO生成的main()等。buildserver还用-s参数产生合适的交易名/函数名映射表。要使用buildserver,必须先正确设定环境变量TUXDIR,PATH,LD_LIBRARY_PATH。命令语法如下:buildserver -v o executable -s service2,service3:func -f source/object -l object/library file例:buildserver s DEPOSIT o TLR f TLR.o f appinit.o参数解释如下:-o生成的可执行文件名-f需要在连接TUXEDO库之前传给编译器的文件名。如有多于一个的文件名,名字应用空格分隔并用引号引起。也可以使用多个-f参数。-l需要在连接TUXEDO库之前传给编译器的文件名。语法同上。-v编译过程显示。-b指定SHM或MP模式。如无此项,两种模式都包括;使用此项可以使生成的可执行文件小一点-r连接此处指出的RM库。该RM的名字必须含在$TUXDIR/udataobj/RM文件中。5.1.7 调试和错误处理对于服务程序的调试,确实是一件非常令人头痛的事.在Unix环境下,目前还找不到很好的方法,一般经常使用的方法是”print,Userlog”跟踪法。5.1.8 程序范例(1) 源代码文件名: 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);(2) 程序说明语句说明whole file整个服务程序不提供main函数,在build时,由BEA Tuxedo系统提供。tpsvrinit()在服务器初始化即处理请求之前被调用。若没有提供该函数,BEA Tuxedo系统会提供一个缺省的,它向USERLOG中写一条消息,说明服务器已经被启动。userlog(3c)是系统提供的一个写日志的方法。TOUPPER()Simpserv提供的唯一一个服务,它接收一个TPSVCINFO结构,它包含了要被转换成大写的字符串。for loopBEA Tuxedo系统的循环,用于逐一转换。tpreturn()(3) 程序编译: $buildserver o simpserv f simpserv.c s TOUPPER(s TOUPPER指明了在服务器启动时需要提供的服务)5.2 创建客户程序5.2.1 概述创建BEA Tuxedo的客户程序与在C和C+编程语言中创建其它应用程序一样,BEA Tuxedo提供了一个其于C语言的编程接口,即应用程序事务监控接口ATMI,这套接口很容易使用,以便用于开发客户程序和服务程序。除了C语言接口外,BEA Tuxedo还提供了COBOL接口。5.2.2 客户端在C/S模式中的作用为了更好的了解客户端的所有任务以编写客户端应用,有必要重新认识客户端在C/S模式中扮演的角色。 首先,客户端是用户界面。意思是当用户在系统上用程序进行一次操作的整个过程就是一个客户端过程。前端过程是对客户端的另一个描述。客户端的首要任务就是获得执行操作应该得到的数据。一旦客户端得到了应有的信息,应该将数据按服务能够识别并适合传输的格式打包。 然后,客户端向服务端发送请求并等待回应。收到回应数据后,将其按一定格式返回给终端用户。5.2.3 客户端开发过程客户端程序的设计和实现可以被分成2部分考虑:用户处理过程和TUXEDO功能部分。下文的客户端程序只描述了TUXEDO功能部分。利用TUXEDO的ATMI API调用可以做到:基本的TUXEDO调试技巧(tperrno,tpstrerror,userlog)TUXEDO进程管理(tpinit,tpterm)基本数据缓冲管理(tpalloc,tprealloc,tpfree)基本通讯(tpcall,tpacall,tpgetrply)客户程序一般执行如下任务:(1) 用tpchkauth()决定加入一个应用程序所需的安全级别。可能出现的响应包括:没有安全级别,应用程序口令,应用程序授权,访问控制列表,连接级加密,公钥加密,审计。这些可以根据你的需求进行选择;在实际的应用中很多的软件开发商通常对这一步都不做处理。(2) 调用tpinit()来连接到一个BEA Tuxedo应用程序,所需的安全信息作为tpinit()的参数传给了应用程序;(3) 执行服务请求;(4) 调用tpterm()来断开和BEA Tuxedo应用程序的连接5.2.4 调试和错误处理当调用ATMI出错时,返回值为-1,全程变量tperrno被设值,该变量提供系统定义的出错原因。函数tpstrerror()以此变量为参数,返回错误的字符说明信息。完整的错误号和文本错误信息存在于文件$TUXDIR/include/atmi.h。函数userlog()重定向输出文件为ULOG.mmddyy。使用方法同printf()。该函数每次输出都写硬盘,这样在系统失败时也能保留调试信息。代码范例ret = tpterm();if ( ret = -1 )printf(“Error in exiting applicationn”);userlog(“ATMI error logged %d %s”,tperrno,tpstrerror(tperrno);5.2.5 进程管理 tuxedo 接到一个tpinit的请求后,就启动一个服务进程,接收到tpterm()后,就会中止该服务进程.在实际应用中,tpinit()和tpterm()必须成对出现,而且要相互对应.如果只在程序中调用了tpinit()而没有调用tpterm(),则tuxedo系统会认为该进程一直处于活动状态,这样的话可能会因为服务进程达到系统允许的上限而导致系统的崩溃.int tpinit(TPINIT *tpinfo)客户端通过调用tpinit()与应用连接,进行交互,有以下事件发生:调用安全接口检查客户端是否需要认证连接BB,使进一步的ATMI函数得到信息使BBL了解BB中已经存在请求建立客户端消息队列使服务可以发回返回信息,系统可以送出广播通知等.错误时返回-1,可能由以下原因引起: TPEINVAL参数错误 TPENOENTBB无空间 TPEPERM无连接权限 TPEPROTO协议错误 被服务调用int tpterm()客户端调用tpterm()切断与应用的连接,结束了客户端的TUXEDO进程,该过程发生以下事件:BB入口删除,使BBL知道客户端已经离开客户端离开BB,客户端的信号量被移除客户端消息队列被移除错误时返回-1,可能由以下原因引起:TPEPROTO协议错误 被服务调用TPESYSTEM/T系统下错误TPEOS操作系统错 根据tpinit()和tpterm()在客户程序中不同位置的调用,可以把tuxedo的进程连接分为长连接和短连接两种.长连接是指在程序开始的时候调用tpinit()建立服务连接,在程序中止的时候调用tpterm()中止服务连接.这样做的好处是,当用户频繁的进行业务操作时,不用频繁的进行进程连接,大大的缩短了操作时间,提高了程序的执行效率.但是,这也一个缺点,那就是,只要用户不从客户程序中退出来,不管做不做业务,都会在系统中占用一个进程连接,从而会影响其他用户的连接.短连接指的是用户每做一次业务,都需要调用tpinit(),业务完成后调用tpterm().这样做的好处是,1000个终端用户和10000个终端用户同时操作,对系统来说,基本上是一个概念.但是这样做会浪费大量的时间在进程连接上,从而影响了业务的处理效率.为了协调长连接和短连接之间的矛盾,我曾经给出了一个很好的解决方案,那就是在长连接的基础上进行优化处理,当客户程序5分钟(这个值可以自定义)没有向服务程序发送任何服务请求,则调用tpterm()断开服务连接.仅仅这样还是不行的,我们还必须在客户程序向服务程序发送业务请求之前,首先判断进程连接是否断开,如果断开,则重新连接.5.2.6 数据缓冲管理在Bea Tuxedo系统中的所有通信过程都是通过类型缓冲区来完成的,Bea Tuxedo系统提供了大量的类型缓冲区来供开发者使用。所有类型缓冲区都必须通过Bea Tuxedo的tpalloc(), tprealloc(), tpfree()这些ATMI来分配回收,它们都有特定的头部。以下是TUXEDO基本的数据缓冲类型: STRING以空值结尾的单域字符数据。 CARRAY有长度定义的单域二进制数据,不进行编、解码。 VIEW类C结构或COBOL记录的多域组织。 FML无固定结构的自定义缓冲。tpalloc(),tprealloc()在出错时返回空值,可能由以下原因引起: TPEOS操作系统 TPEINVAL非法或不正确的类型 TPESYSTEMTUXEDO之下的错误 统一定义的类型缓冲区可以使它们在跨越不同网络、不同协议、不同CPU构架以及不同操作系统之间得到统一的处理,这就使得开发者在分布式计算环境中有效地避开了异构网络和异构计算机系统带来的差异,把精力集中在商业逻辑的开发上。5.2.7 程序范例(1) 源代码文件名: 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);(2) 程序说明:语句说明atmi.h调用ATMI函数必须的头文件tpinit()客户程序调用它来加入应用程序tpalloc()用于分配类型缓冲区的ATMI函数,STRING是五种BEA Tuxedo缓冲区数据类型之一,sendlen+1表示缓冲区类型,因为以空字符结尾,所以长度加1tpcall()把消息缓冲区送到TOUPPER服务,它提供了响应缓冲区的地址,它一直等待着返回消息tpterm()用于退出应用程序的ATMI函数,tpfree()释放分配的缓冲区,是和tpalloc()相对应的函数(3) 程序编译: $buildclient -o simpcl -f simpcl.c-o指明输出目标文件名,-f指出源文件名.5.3与缓冲区使用有关的ATMI5.3.1 tpallocchar * tpalloc(char *type, char *subtype, long size)描述:分配缓冲区参数:type:缓冲区的类型 subtype:缓冲区的子类型,只有VIEW有子类型,其他的缓冲区该参数要设为NULL long:缓冲区的大小返回值: 成功返回一个指向所分配空间首地址的CHAR *形指针,失败返回NULL。5.3.2 tpreallocchar * tprealloc(char *ptr, long size) 描述:重新分配缓冲区参数:ptr:指向原缓冲区首地址的指针 size:新缓冲区的大小返回值: 成功返回一个指向新分配空间首地址的CHAR *形指针,失败返回NULL。5.3.3 tpfreevoid tpfree(char *bufptr)描述:释放由TPALLOC()或TPREALLOC()分配的缓冲区参数:bufptr:指向要释放的缓冲区首地址的指针返回值:无注意: 用TPALLOC(),TPREALLOC()分配的内存只能有TPFREE()释放掉,不能用FREE()5.4连接的建立与断开有关的ATMI5.4.1 tpinitint tpinit(TPINIT *tpinfo)描述: 与TUXEDO SERVER建立连接参数:TPINFO返回值: 失败返回-1, 错误号保存在全局变量tperrno中。TPINIT结构体在atmi.h中的定义如下structtpinfo_t char usrnameMAXTIDENT+2;/* client user name */char cltnameMAXTIDENT+2;/* application client name */char passwdMAXTIDENT+2;/* application password */char grpnameMAXTIDENT+2;/* client group name */long flags;/* initialization flags */long datalen;/* length of app specific data */long data;/* placeholder for app data */;typedefstructtpinfo_t TPINIT;说明:username,cltname,passwd,grpname,data,datalen用于安全认证中flags:用于定义以何种方式通知该客户端一个UNSOLICTED MESSAGE的到来.它的值可以为:TPU-SIGTPU-DIPTPU-IGNTPSA-FASTPATHTPSA-PROTECTED5.4.2 tptermint tpterm()描述: 断开与TUXEDO SERVER建立连接参数:无返回值: 失败返回-1, 错误号保存在全局变量tperrno中。5.5 请求TUXEDO SERVER 有关的ATMI5.5.1 tpcallint tpcall(char *svc, char *idata, long ilen, char *odata, long *olen, long flags)描述:客户端同步调用服务端的名为svc的SERVICE,参数: *svc:SERVICE的名称char *idata: 输入缓冲区的地址,客户端传给服务端的参数放在该缓冲区内long ilen: 输入缓冲区的长度char *odata 输出缓冲区的地址,服务端传给客户端的结果放在该缓冲区内long *olen:输出缓冲区的长度 long flags: 调用标志,由以下几个:TPNOTRAN如果调用svc的客户端当前在TRANSACTION方式下,那么svc不参与当前的TRANSACTION。TPNOCHANGE如果服务端返回的缓冲区类型与客户端定义的缓冲区(odata)类型不一致,默认情况下,odata会转换成与服务端返回的缓冲区类型一致的类型,如果设置了该FLAG,那么当出现这种情况时,不进行缓冲区类型转换,并且会报错。TPNOBLOCK默认情况下,如果客户端有阻塞条件存在(如CLIENT的TCP/IP中的缓冲区满,磁盘I/O忙等),那么客户端会阻塞在那里,直到阻塞消除或超时出错。如果设置了TPNOBLOCK,当客户端有阻塞条件存在时,TPCALL()会立刻返回并报错. 注意TPNOBLOCK只对发送请求时起作用,如果在接收服务端返回的结果时有阻塞条件存在,客户端会在那里等待,直到阻塞消除或超时出错TPNOTIME如果客户端有阻塞条件存在,客户端会一直阻塞在那里,即使到了超时时间也不返回,但如果该客户端是在TRANSACTION模式下,当到了事务的超时时间,还是会报超时错误并返回。TPSIGRSTRT如果在进行系统调用时,被信号中断,该系统调用会重新进行。调用成功返回0,失败返回-1, 错误号保存在全局变量tperrno中。5.5.2 tpacallint tpacall(char *svc, char *data, long len, long flags)描述: 客户端异步调用服务端的名为svc的SERVICE,不等服务端返回结果,程序可继续往下走,在某个地方调用tpgetrply()取的服务端的返回参数:char *svc, char *data, long len参数的含义与tpcall()中的一样flags 可设置为:TPNOTRAN, TPNOREPLY, TPNOBLOCK TPNOTIME, TPSIGRSTRT.TPNOTRAN, TPNOBLOCK TPNOTIME, TPSIGRSTRT的含义与与tpcall()中的一样TPNOREPLY:调用tpacall()的客户端不想接收SEVER端的应答。如果设置了TPNOREPLY:服务端不会给该客户端发送应答。返回值: 失败返回-1,成功返回一个HANDLER,可作为tpgetrply的参数,用于取应答5.5.3 tpgetrplyint tpgetrply(int *cd, char *data, long *len, long flags)描述:取出服务端

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论