分类:
2009-08-22 13:29:14
本章介绍了BEA Tuxedo的一个简单例子,用C语言编写的simpapp,它包含了一个客户程序和一个服务器,服务器只执行一个服务:从客户程序接收小写字母,将其转换成大写后,返回给客户程序。在使用这个例子之前,需要在系统中安装C语言编译器。
在准备simpapp例子之前,系统中必须安装了BEA Tuxedo软件,而且要设置$TUXDIR环境变量,NT平台下为%TUXDIR%,并把%TUXDIR%\bin加到PATH中,最后还要确保你的工作目录要有写权限。完成这些工作后,请按如下步骤来准备simpapp程序:
⑴. 复制simpapp所需要的所有文件,它们位于$TUXDIR/samples/atmi/simpapp目录下;
⑵. 检查并编译客户程序;
⑶. 检查并编译服务程序;
⑷. 编辑并加载配置文件;
⑸. 启动应用程序;
⑹. 执行运行时应用程序;
⑺. 监视运行时应用程序;
⑻. 关闭应用程序。
完成这个例子后,你应该理解客户程序和服务器所执行的任务,根据你的环境编写一个配置文件,通过tmadmin检查应用程序的活动。同时,你应该理解BEA Tuxedo应用程序的基本组成部分:客户程序、服务器程序、配置文件,通过BEA Tuxedo系统的哪些命令来管理你的应用程序。
⑴.创建目录:
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
TUXDIR和PATH用于访问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应用程序配置文件的纯文本形式
⑴.检查客户程序
$more simpcl.c
#include
#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指出源文件名
⑴.检查服务程序
$more simpserv.c
#include
#include
#include
#include
/* 当服务器启动时,在处理请求之前,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,
}
说明:
语句 |
说明 |
whole file |
整个服务程序不提供main函数,在build时,由BEA Tuxedo系统提供。 |
tpsvrinit() |
在服务器初始化即处理请求之前被调用。若没有提供该函数,BEA Tuxedo系统会提供一个缺省的,它向USERLOG中写一条消息,说明服务器已经被启动。userlog( |
TOUPPER() |
simpserv提供的唯一一个服务,它接收一个TPSVCINFO结构,它包含了要被转换成大写的字符串。 |
for loop |
BEA Tuxedo系统的循环,用于逐一转换。 |
tpreturn() |
|
⑵.编译服务器
$buildserver –o simpserv –f simpserv.c –s TOUPPER
–s TOUPPER指明了在服务器启动时需要提供的服务