linux下的tuxedo开发实例收藏
安装配置
上传安装文件tux81.tar,然后解压
tar -xvf tux81.tar
在当前目录下有一个tuxedo8.1目录,接着需要配置环境变量.
vi .bash_profile 添加如下内容
PATH=$PATHHOME/bin
#apache
export APACHE_HOME=/usr/local/apache
#oracle
export ORACLE_BASE=/home/ora/ora9
export ORACLE_HOME=/home/ora/ora9/oracle
export ORACLE_SID=linuxdb
export ORACLE_TERM=xterm
#xerces-c
export XERCESCROOT=$HOME/app/xerces-c-src_2_7_0
#APP
export APP_HOME=$HOME/app
export APP_BIN=$APP_HOME/src/bin
#tuxedo
export TUXDIR=/home/dev/app/tuxedo8.1
TUXCONFIG=$APP_BIN/tuxconfig
export TUXCONFIG
WSNADDR=//192.168.1.113:5438; export WSNADDR
#PATH
PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:.
PATH=$PATHORACLE_HOME/binTUXDIR/binAPACHE_HOME/bin
export PATH
#LD_LIBRARY_PATH
LD_LIBRARY_PATH=$XERCESCROOT/libTUXDIR/lib:/usr/lib:/usr/local/libORACLE_HOME/rdbms/demo
LD_LIBRARY_PATH=$LD_LIBRARY_PATHTUXDIR/lib
export LD_LIBRARY_PATH
#LANG
NLS_LANG=american_america.ZHS16GBK;export NLS_LANG
export LANG=C
export LC_ALL="zh_CN.GB18030"
保存退出,source .bash_profile使环境变量生效。
以上的目录可以根据自己的目录情况,进行修改,因为我用到了apache,xerecs,oracle,fastcgi等,所以上面包含了这些路径,如果没有用到这些,删除相应的路径配置即可。
下面是我遇到的一些问题和解决的办法:
问题一:
执行tmadmin命令,出现如下错误
NLS:4: Cannot open message catalog TMADMIN_CAT, set 1, num 184; check TUXDIR=/home/dev/app/tuxedo8.1, LANG=zh_CN.GB18030
可以肯定,这个错误是由字符集引起的,我用的是简体中文linux
添加环境变量vi .bash_profile 添加如下内容
export LANG=C
保存退出,source .bash_profile 使环境变量生效
问题二:
再执行tmadmin,这个错误消失,但是出现了如下错误:
tmadmin - Copyright (c) 1996-1999 BEA Systems, Inc.
Portions * Copyright 1986-1997 RSA Data Security, Inc.
All Rights Reserved.
Distributed under license by BEA Systems, Inc.
Tuxedo is a registered trademark.
TMADMIN_CAT:188: ERROR: Error while obtaining the Bulletin Board parameters
分析上面的信息,因为没有编译生成TUXCONFIG指向的文件,即公告牌文件
经过上面一些配置,已经可以使用tuxedo了,后面配置公告文件和开发程序都是开发的内容
配置公告牌文件
tuxedo服务的核心内容都配置再一个配置文本文件上,一般命名为ubbconfig(当然可以根据自己的需要随便命名),然后用tmlodcfg -y ubbconfig命令,编译成一个二进制文件,环境变量TUXCONFIG指向的文件名,在主机上运行的,所以在编写ubbconfig配置文件之前,先确保配置号了TUXCONFIG环境变量,不然会报错误.
在这儿给出一个简单的公告牌配置文件
# (c) 2003 BEA Systems, Inc. All Rights Reserved.
#ident "@(#) samples/atmi/simpapp/ubbsimple $Revision: 1.5 $"
#Skeleton UBBCONFIG file for the TUXEDO Simple Application.
#Replace the <bracketed> items with the appropriate values.
*RESOURCES
#Example:
IPCKEY 123456
DOMAINID server_240
MASTER chenli
MAXACCESSERS 1000
MAXSERVERS 1000
MAXSERVICES 2500
MAXGTT 5
MODEL SHM
LDBAL N
BLOCKTIME 10
*MACHINES
DEFAULT:
APPDIR="/home/dev/app/src/bin"
TUXCONFIG="/home/dev/app/src/bin/tuxconfig"
TUXDIR="/home/dev/app/tuxedo8.1"
TLOGSIZE=500
MAXWSCLIENTS=50
#Example:
# APPDIR="/home/me/simpapp"
# TUXCONFIG="/home/me/simpapp/tuxconfig"
# TUXDIR="/usr/tuxedo"
#<Machine-name>
chenli_linux LMID=chenli
#Example:
#beatux LMID=chenli
*GROUPS
GROUP1
LMID=chenli GRPNO=1 OPENINFO=NONE
GROUP2
LMID=chenli GRPNO=2 OPENINFO=NONE
GROUP3
LMID=chenli GRPNO=3 OPENINFO=NONE
GROUP4
LMID=chenli GRPNO=4 OPENINFO=NONE
GROUPWSL
LMID=chenli GRPNO=6 OPENINFO=NONE
*SERVERS
DEFAULT:
CLOPT="-A" RESTART=Y GRACE=86400
#======================= GROUP1 servers Define ==========================#
GENERAL_SERVICE SRVGRP=GROUP1 SRVID=200 MIN=1 MAX=2 REPLYQ=Y RQADDR="GENERAL_SERVICE" MAXGEN=2
#WSL SRVGRP=GROUP1 SRVID=700 MIN=1 MAX=1 REPLYQ=Y MAXGEN=2 RESTART=Y CLOPT = "-A -t -- -n //192.168.1.201:3195 -H //192.168.1.201:3195 -m 5 -M 20 -x 3 -T 120 -I 30"
WSL SRVGRP=GROUPWSL SRVID=2 MAXGEN=2 CLOPT=" -A -- -n //192.168.1.113:3195 -m 2 -M 6 -x 10"
*SERVICES
GENERAL_SERVICE
注意这一行中chenli_linux必须用hostname得到的主机名
chenli_linux LMID=chenli
---------------------------------------------------------------------------------------------------------------------
GENERAL_SERVICE SRVGRP=GROUP1 SRVID=200 MIN=1 MAX=2 REPLYQ=Y RQADDR="GENERAL_SERVICE" MAXGEN=2
如果RESTART=Y当SERVER程序GENERAL_SERVICE异常终止时,TUXEDO会根据MAXGEN,GRACE参数来重启这个SERVER
---------------------------------------------------------------------------------------------------------------------
WSL SRVGRP=GROUPWSL SRVID=2 MAXGEN=2 CLOPT=" -A -- -n //192.168.1.113:3195 -m 2 -M 6 -x 10"是为了提供非本机客户程序调用而设置的,表示服务将在本级的ip地址192.168.1.113,端口3195上面监听请求,并进行应答处理.
*SERVICES
GENERAL_SERVICE
配置了提供调用的服务,一个服务程序可能提供多个服务.
问题1:
tmloadcf -y ubb出现如下错误:
NLS:4: Cannot open message catalog CMDTUX_CAT, set 1, num 883; check TUXDIR=/home/dev/app/tuxedo8.1, LANG=zh_CN.GB18030
显然跟环境变量的设置有关
export LANG=C
export LC_ALL=C
重新执行tmloadcf -y ubb,没有错误,问题解决
程序开发
在做程序开发前,还需要介绍一个关键的东西:license.
Tuxedo有两套license(SDK:开发license,RDK:实际应用的license).当你编译程序的时候必须使用SDK类型的license,这个license允许连接的的用户数一般都很少,只有几个而已. 正式使用的时候,两个license都可以用,只是用户数不同而已(如果用户数很多的话,使用SDKlicense,tuxedo将不能承受).
如果没有有效的sdk license,在执行buildserver,buildclient的时候,会报如下的错误信息:
CMDTUX_CAT:4382:ERROR:You do not have a valid SDK license
获取一个有效的tuxedo sdk license拷贝到$TUXDIR/udataobj目录下,就能用buildserver,buildclient进行程序开发了.
问题1:
在tuxedo客户端程序中,调用tpinit失败,返回-1,tperrno=12。
在用buildclient编译客户端程序的时候,如果加入了-w选项,那么必须设置WSADDR环境变量,如果没有采用-w选项,那么默认请求本地的服务。
如果在编译客户端程序的时候,采用了-w选项,而又没有正确设置WSADDR环境变量,那么tpinit失败,返回-1,tperrno=12;
同时UBB中,需要访问服务所在的组也必须设置WSL选项,如:
WSL SRVGRP=GROUP1 SRVID=2 MAXGEN=2 CLOPT=" -A -- -n //192.168.1.201:3195 -m 2 -M 6 -x 10"
同时在*MACHINE节点设置MAXWSCLIENTS=5,MAXWSCLIENTS是最大的WSL client数。
在客户端程序运行的时候export WSNADDR=//192.168.1.201:3195,就可以访问服务了。
如果在编译客户端程序的时候,没有采用-w选项,默认访问本地的服务,不需要设置WSADDR环境变量。
问题2:
WSL启动失败
WSL启动失败的原因有很多,比如:UBB中没配置MAXWSCLIENTS,WSL的端口和别人冲突等等。需要看ULOG才能确定具体原因。
问题3:
tpcall有时莫名的返回-1
tpcall后,不管是否成功,都要释放memory(上边tpalloc等函数申请的memory)。然后才能tpterm。
问题4:
启动服务的时候现实如下的信息:
CMDTUX_CAT:819: INFO: Process id=1956 Assume started (pipe).
这时需要看一下程序,是否在程序中tpsvrinit函数时已经异常退出。
问题5:
启动服务tmboot -y的时候出现如下的错误信息:
mboot: WARN: No BBL available on site srd.
Will not attempt to boot server processes on that site.
去除MACHINES中的TLOGDEVICE="/home/srd/srdapp/bin/TLOG"定义就可以解决。
问题6:
在启动tuxedo服务的时候,报如下错误信息:
LIBTUX_CAT:328: ERROR: No space in Bulletin Board for Server Table
ubb中的MAXWSCLIENTS,MAXACCESSERS参数值太小,适当修改这个两个参数值就可以了.
问题7:
在执行tmloadcf的时候,报如下错误:
CMDTUX_CAT:1615: ERROR: Identifier or number must be followed by white space or punctuation
说明某个关键字后面需要有空格或者回车,根据错误信息在相应出错的位置添加空格就可以了。
问题8:
执行tmboot -y启动服务的时候,报如下错误:
TPELIMIT - a system limit has been reached
CMDTUX_CAT:1685: ERROR: Application initialization failure
No space in Bulletin Board for Service Table
有上面的信息可以看出,是tuxedo配置的一些资源有限制,可以修改ubbconfig配置文件中的参数MAXACCESSERS,MAXSERVERS,MAXSERVICES,MAXGTT来申请更多的资源,将上面的参数适当增大知道不出现错误信息为止,具体增加多少根据自己的系统配置和需求决定。
gdb调试tuxedo服务
在编译生成程序的时候,加入-g选项,就可以用gdb调试tuxedo服务
假定你的服务程序名是program,先用tmboot -y启动服务,然后查询该服务程序的进程id
ps -ef|grep program
得到进程pid之后,假定进程id=5313,然后执行下列命令,就进入gdb调试服务程序状态
gdb --pid=5313
注意在调试服务程序的时候,切忌用r,run,因为程序已经运行.
用c,表示继续运行,断点一般先打在服务函数,然后向下调试.
后台面的调试方法同普通的gdb调试应用程序方法一样了.
后面我会接着完善。