tuxedo应用程序开发指南2

第二章
一个简单的Tuxedo应用程序simpapp

本章介绍了BEA Tuxedo的一个简单例子,用C语言编写的simpapp,它包含了一个客户程序和一个服务器,服务器只执行一个服务:从客户程序接收小写字母,将其转换成大写后,返回给客户程序。在使用这个例子之前,需要在系统中安装C语言编译器。

准备simpapp的文件和资源

在准备simpapp例子之前,系统中必须安装了BEA Tuxedo软件,而且要设置$TUXDIR环境变量,NT平台下为%TUXDIR%,并把%TUXDIR%\bin加到PATH中,最后还要确保你的工作目录要有写权限。完成这些工作后,请按如下步骤来准备simpapp程序:

⑴.    复制simpapp所需要的所有文件,它们位于$TUXDIR/samples/atmi/simpapp目录下;

⑵.    检查并编译客户程序;

⑶.    检查并编译服务程序;

⑷.    编辑并加载配置文件;

⑸.    启动应用程序;

⑹.    执行运行时应用程序;

⑺.    监视运行时应用程序;

⑻.    关闭应用程序。

完成这个例子后,你应该理解客户程序和服务器所执行的任务,根据你的环境编写一个配置文件,通过tmadmin检查应用程序的活动。同时,你应该理解BEA Tuxedo应用程序的基本组成部分:客户程序、服务器程序、配置文件,通过BEA Tuxedo系统的哪些命令来管理你的应用程序。

1.复制simpapp例子的相关文件

⑴.    创建目录:

mkdir simpdir

cd simpdir

⑵.    设置并导出环境变量

TUXDIR=BEA Tuxedo系统的根目录,如UNIX系统下可以设置为:

TUXDIR=”/usr/tuxedo”NT系统下可以设置为:

            TUXDIR=”G:\Program Files\BEA System\Tuxedo”

TUXCONFIG=当前工作目录加上/tuxconfig,如UNIX系统下可以设置为:

    TUXCONFIG=”/usr/me/simpdir/tuxconfig”NT系统下可以设置为:

    TUXCONFIG=”G:\simpdir\tuxconfig”

PATH=$PATH:$TUXDIR/bin

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib

export TUXDIR TUXCONFIG PATH LD_LIBRARY_PATH

TUXDIRPATH用于访问BEA Tuxedo系统的文件和执行命令,在Sun Solaris系统中,必须把/usr/5bin放在PATH中的第一个,在RS6000中的AIX上,将LD_LIBRARY_PATH替换成LIBPATH,在HP9000中的HP-UX上,将LD_LIBRARY_PATH替换为SHLIB_PATH

设置TUXCONFIG的目的是用于加载配置文件。

⑶.    复制simpapp文件,

cp $TUXDIR/samples/atmi/simpapp/* .

⑷.    查看文件

$ls

README env simpapp.nt ubbmp wsimpcl

README.as400 setenv.cmd simpcl.c ubbsimple

README.nt simpapp.mk simpserv.c ubbws

文件说明:

simpcl.c客户程序的源代码

simpserv.c服务程序的源代码

ubbsimple应用程序配置文件的纯文本形式

2.检查并编译客户程序

⑴.    检查客户程序

$more simpcl.c

#include <stdio.h>

#include “atmi.h”        /* TUXEDO的头文件 */

 

#if defined(__STDC__) || defined(__cplusplus)

main(int argc, char *argv[])

#else

main(argc, argv)

int argc;

char *argv[];

#endif

{

    char *sendbuf, *rcvbuf;

    long sendlen, rcvlen;

    int ret;

 

    if(argc != 2) {

        (void) fprintf(stderr, “Usage: simpcl string\n”);

        exit(1);

    }

    /* 作为一个客户过程连接到System/T */

    if (tpinit((TPINIT *) NULL) == -1) {

        (void) fprintf(stderr, “Tpinit failed\n”);

        exit(1);

    }

    

    sendlen = strlen(argv[1]);

 

    /* 分配一个供请求响应使用的STRING 缓冲区 */

    if((sendbuf = (char *) tpalloc(“STRING”, NULL, sendlen+1)) == NULL) {

        (void) fprintf(stderr,”Error allocating send buffer\n”);

        tpterm();

        exit(1);

    }

 

    if((rcvbuf = (char *) tpalloc(“STRING”, NULL, sendlen+1)) == NULL) {

        (void) fprintf(stderr,”Error allocating receive buffer\n”);

        tpfree(sendbuf);

        tpterm();

        exit(1);

    }

 

    (void) strcpy(sendbuf, argv[1]);

 

    /* 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, “Can’t send request to service TOUPPER\n”);

        (void) fprintf(stderr, “Tperrno = %d\n”, tperrno);

        tpfree(sendbuf);

        tpfree(rcvbuf);

        tpterm();

        exit(1);

    }

 

    (void) fprintf(stdout, “Returned string is: %s\n”, 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表示缓冲区类型,因为以空字符结尾,所以长度加1

tpcall() 

把消息缓冲区送到TOUPPER服务,它提供了响应缓冲区的地址,它一直等待着返回消息

tpterm() 

用于退出应用程序的ATMI函数,

tpfree() 

释放分配的缓冲区,是和tpalloc()相对应的函数

⑵.    编译客户程序

$buildclient -o simpcl -f simpcl.c

        -o指明输出目标文件名,-f指出源文件名

3.检查并编译服务程序

⑴.    检查服务程序

$more simpserv.c

#include <stdio.h>

#include <ctype.h>

#include <atmi.h>    /* TUXEDO Header File */

#include <userlog.h>    /* TUXEDO Header File */

 

/* 当服务器启动时,在处理请求之前,tpsvrinit被执行,这个不是必须的,对应的函数是shutdown*/

 

#if defined(__STDC__) || defined(__cplusplus)

tpsvrinit(int argc, char *argv[])

#else

tpsvrinit(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 __cplusplus

extern “C”

#endif

void

#if defined(__STDC__) || defined(__cplusplus)

TOUPPER(TPSVCINFO *rqst)

#else

TOUPPER(rqst)

TPSVCINFO *rqst;

#endif

{

    int i;

    for(i = 0; i < rqst->len-1; i++)

        rqst->data[i] = toupper(rqst->data[i]);

    /* 返回转换后的类型缓冲区 */

    tpreturn(TPSUCCESS, 0, rqst->data, 0L, 0);

}

    说明:

语句

说明

whole file 

整个服务程序不提供main函数,在build时,由BEA Tuxedo系统提供。

tpsvrinit() 

在服务器初始化即处理请求之前被调用。若没有提供该函数,BEA Tuxedo系统会提供一个缺省的,它向USERLOG中写一条消息,说明服务器已经被启动。userlog(3c)是系统提供的一个写日志的方法。

TOUPPER() 

simpserv提供的唯一一个服务,它接收一个TPSVCINFO结构,它包含了要被转换成大写的字符串。

for loop 

BEA Tuxedo系统的循环,用于逐一转换。

tpreturn() 

 

⑵.    编译服务器

$buildserver –o simpserv –f simpserv.c –s TOUPPER

–s TOUPPER指明了在服务器启动时需要提供的服务

4.编辑并加配置文件

⑴.    怎样编辑配置文件

#ident    “@(#) apps/simpapp/ubbsimple    $Revision: 1.1.10.1 $”

 

#Skeleton UBBCONFIG file for the TUXEDO Simple Application.

# <>里而的内容替换成实际值.

 

*RESOURCES

IPCKEY        <Replace with a valid IPC Key>

 

#Example:

#IPCKEY        123456

 

DOMAINID    simpapp

MASTER        simple

MAXACCESSERS    10

MAXSERVERS        5

MAXSERVICES    10

MODEL            SHM

 

*MACHINES

DEFAULT:

        APPDIR=”<Replace with the current directory pathname>”

        TUXCONFIG=”<Replace with your TUXCONFIG Pathname>”

        TUXDIR=”<Directory where TUXEDO is installed>”

#Example:

#        APPDIR=”/home/me/simpapp”

#        TUXCONFIG=”/home/me/simpapp/tuxconfig”

#        TUXDIR=”/usr/tuxedo”

# 对于NT平台,可以替换成如下值

#        APPDIR=”G:\JQEJB\simpapp”

#        TUXCONFIG=”G:\JQEJB\simpapp\tuxconfig”

#        TUXDIR=”G:\Program Files\BEA System\Tuxedo”

<Machine-name>    LMID=simple


 

以下文章点击率最高

Loading…


发表评论

电子邮件地址不会被公开。 必填项已用*标注