??xml version="1.0" encoding="utf-8" standalone="yes"?>
2. 认需要的Apache版本
3. 认在Apache中支持Plug-ins
执行:$APACHE_HOME/bin/apache -lQ如果没有列出来mod_so.cQ则需要重?br>Build?br>
4. 安装Apache HTTP Server Plug-In module
mod_wl_20.so复制?APACHE_HOME/modules目录下;
修改$APACHE_HOME/conf/httpd.conf配置文gQ增加如下行Q?br> LoadModule weblogic_module modules/mod_wl_20.so
5. 在httpd.conf中配|其它参?br>
WebLogicCluster localhost:90,localhost:91
MatchExpression *.jsp
</IfModule>
<Location /weblogic>
SetHandler weblogic-handler
PathTrim /
</Location>
<IfModule mod_weblogic.c>
WebLogicCluster localhost:7003,localhost:7005,localhost:7007
MatchExpression *
</IfModule>
<Location /DizzyTixWeb>
SetHandler weblogic-handler
PathTrim /
</Location>
<Location /DizzySupplies>
SetHandler weblogic-handler
PathTrim /
</Location>
查httpd.conf配置是否正确QAPACHE_HOME\bin\Apache -t
6. 重启Weblogic Server
7. 启动Apache HTTP Server
8. 试插g http://localhost/weblogic/
下蝲Tuxedo For Windows版本和License文gQ本机采用的是Tuxedo9 windows版本。具?br>Windows安装q程略。正常安装后Tuxedo?x)徏一个tlisten的服务,且已自动启动?br>
本机Tuxedo安装路径 C:\bea\tuxedo9.0
二、Tuxedo安装完成后的环境变量配置
[Win2000,XP]
右键我的?sh)?>属?>高->环境变量Q更改变量倹{?br>
在LIBҎ(gu)?nbsp; C:\bea\tuxedo9.0\lib
在INCLUDEҎ(gu)?C:\bea\tuxedo9.0\include
在PATHҎ(gu)?nbsp; C:\bea\tuxedo9.0\bin
d下面两个新项
TUXDIR C:\bea\tuxedo9.0
WSNADDR //192.168.98.166:4050 Tuxedo服务器IP与端?br>
除此之外q需要指定Tuxedo应用服务的\径,如果你用C开发了一个Tuxedo服务Q这个服?br> 文g所在的路径。本\径ؓ(f)F:\Liwei\Tuxedo\dbread?br>
Ҏ(gu)机器实际情况d
APPDIR F:\Liwei\Tuxedo\dbread
TUXCONFIG F:\Liwei\Tuxedo\dbread\tuxconfig
注:(x)环境变量更改后确定即生效?br>
[Win98]
?000,XP不同的是需要更改AUTOEXEC.BAT文gQ加入以下命令?br> 如SET TUXDIR=C:\bea\tuxedo9~1
注:(x)AUTOEXEC.BAT有一个缺点,是更改后需要重启机器才能生效,如果我们设一个环?br> 变量文gQ如TUXENVQ,那只要在文g里修改后存盘p生效。在AUTOEXEC.BAT中长文g
名必ȝ~写?br>
例:(x)
SET TUXENV=C:\bea\tuxedo9~1 //TUXDEO环境变量文g
在C:\bea\tuxedo9.0目录下创建TUXENV文gQ在文g里加?br> APPDIR=F:\Liwei\Tuxedo\dbread
TUXCONFIG=F:\Liwei\Tuxedo\dbread\tuxconfig
...
三、准备Tuxedo客户端,服务端程序代?br>
可以直接用Tuxedo本n带的例子QC:\bea\tuxedo9.0\samples\atmi\simpapp
客户?simpcl.c
服务?simpserv.c
四、准备编译客L(fng)服务端程?br>
q里最好是自已把各U编译命令写成批处理文g。在~译之前需要安装C语言~译器,我们
通常使用VC++6.0Q安装时如果没有让VC讄环境变量Q在~译前需要手工运?
E:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
注:(x)手工讄的变量在关闭命o(h)行环境就失效了。最好是复制到本地文件夹?br>
bclt.bat文g内容
F:
cd F:\liwei\tuxedo\dbread
buildclient -o simpcl -f simpcl.c -v
bsrv.bat文g内容
F:
cd F:\liwei\tuxedo\dbread
buildserver -o simpserv -f simpserv.c -s TOUPPER -v
start.bat文g内容 q文件主要作用是启动当前目录的命令环?br> cd
cmd
~译完成后会(x)在本地目录生成simpcl.exe和simpserv.exe。要惛_动服务,则需要配|?br> ubbconfig了?br>
五、配|ubbconfig
下面是一个完整的ubbconfig文gQ此文g要放在本地目录下。即与环境变量APPDIR保持
一致。文件名随意Q这里用config文g名?br>
#Liwei
*RESOURCES
IPCKEY 123456
DOMAINID liweiapp
MASTER lw
MAXACCESSERS 3
MAXSERVERS 3
MAXSERVICES 3
MODEL SHM
LDBAL N
*MACHINES
LWYM
LMID = lw
TUXDIR = "C:\bea\tuxedo9.0"
TUXCONFIG = "F:\Liwei\Tuxedo\dbread\tuxconfig"
APPDIR = "F:\Liwei\Tuxedo\dbread"
*GROUPS
GROUP1 LMID=lw GRPNO = 1 OPENINFO=NONE
*SERVERS
DEFAULT:
CLOPT="-A"
simpserv SRVGRP=GROUP1 SRVID=1
*SERVICES
TOUPPER
每段详细的说明很复杂Q具体可以查看相兌料。这里只Ҏ(gu)较迷惑的地方说明下?br>
*RESOURCES下MASTER名称LQ但要与*MACHINESQ?GROUPS里的LMID保持一致?br>
*RESOURCES下如MAXACCESSERSQMAXSERVERSQMAXSERVICES{设|错误如1Q编译config后,
在命令行q行tmbootQBBL是启动不h的,重新讄正确的值后Q再~译config,tmboot
BBL也启动不h。原因是d理器残存tuxipcq个q程Q在~译config前,q掉它就
没问题了?br>
*MACHINES下面的服务器机器名必L大写。否则编译config?x)提CZ么non master的错误?br>
*MACHINEScMTUXDIR的内容必M环境变量讄一致?br>
*SERVERS中的simpserv名子必须是你服务端程序编译后的EXE文g名?br>
*SERVICES的TOUPPER是你服务端程序编译时-s制定的服务名?br>
五、编译configQ运行tmboot启动服务
讄完成。运?br>
load.bat 文g内容
F:
cd F:\liwei\tuxedo\dbread
tmloadcf -y config
~译config文g完成后,?x)在APPDIR下生成tuxconfig文g?br> q行tmboot -y
BBL服务启动成功Qsimpserv启动成功!
q行tmadmin可以查看l护服务的状态等。运行simpcl.exe可以看C互过E了?/span>
草木?2005-5-18
一、安装前的文件准?/p>
下蝲Tuxedo For Windows版本和License文gQ本机采用的是Tuxedo9 windows版本。具?br />Windows安装q程略。正常安装后Tuxedo?x)徏一个tlisten的服务,且已自动启动?/p>
本机Tuxedo安装路径 C:\bea\tuxedo9.0
二、Tuxedo安装完成后的环境变量配置
[Win2000,XP]
右键我的?sh)?>属?>高->环境变量Q更改变量倹{?br />
在LIBҎ(gu)加 ?C:\bea\tuxedo9.0\lib
在INCLUDEҎ(gu)?C:\bea\tuxedo9.0\include
在PATHҎ(gu)加 ?C:\bea\tuxedo9.0\bin
d下面两个新项
TUXDIR C:\bea\tuxedo9.0
WSNADDR //192.168.98.166:4050 Tuxedo服务器IP与端?br />
除此之外q需要指定Tuxedo应用服务的\径,如果你用C开发了一个Tuxedo服务Q这个服?br /> 文g所在的路径。本\径ؓ(f)F:\Liwei\Tuxedo\dbread?br />
Ҏ(gu)机器实际情况d
APPDIR F:\Liwei\Tuxedo\dbread
TUXCONFIG F:\Liwei\Tuxedo\dbread\tuxconfig
注:(x)环境变量更改后确定即生效?br />
[Win98]
?000,XP不同的是需要更改AUTOEXEC.BAT文gQ加入以下命令?br /> 如SET TUXDIR=C:\bea\tuxedo9~1
注:(x)AUTOEXEC.BAT有一个缺点,是更改后需要重启机器才能生效,如果我们设一个环?br /> 变量文gQ如TUXENVQ,那只要在文g里修改后存盘p生效。在AUTOEXEC.BAT中长文g
名必ȝ~写?br />
例:(x)
SET TUXENV=C:\bea\tuxedo9~1 //TUXDEO环境变量文g
在C:\bea\tuxedo9.0目录下创建TUXENV文gQ在文g里加?br /> APPDIR=F:\Liwei\Tuxedo\dbread
TUXCONFIG=F:\Liwei\Tuxedo\dbread\tuxconfig
...
三、准备Tuxedo客户端,服务端程序代?/p>
可以直接用Tuxedo本n带的例子QC:\bea\tuxedo9.0\samples\atmi\simpapp
客户?simpcl.c
服务?simpserv.c
四、准备编译客L(fng)服务端程?/p>
q里最好是自已把各U编译命令写成批处理文g。在~译之前需要安装C语言~译器,我们
通常使用VC++6.0Q安装时如果没有让VC讄环境变量Q在~译前需要手工运?
E:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT
注:(x)手工讄的变量在关闭命o(h)行环境就失效了。最好是复制到本地文件夹?br />
bclt.bat文g内容
F:
cd F:\liwei\tuxedo\dbread
buildclient -o simpcl -f simpcl.c -v
bsrv.bat文g内容
F:
cd F:\liwei\tuxedo\dbread
buildserver -o simpserv -f simpserv.c -s TOUPPER -v
start.bat文g内容 q文件主要作用是启动当前目录的命令环?br /> cd
cmd
~译完成后会(x)在本地目录生成simpcl.exe和simpserv.exe。要惛_动服务,则需要配|?br /> ubbconfig了?br />
五、配|ubbconfig
下面是一个完整的ubbconfig文gQ此文g要放在本地目录下。即与环境变量APPDIR保持
一致。文件名随意Q这里用config文g名?/p>
#Liwei
*RESOURCES
IPCKEY 123456
DOMAINID liweiapp
MASTER lw
MAXACCESSERS 3
MAXSERVERS 3
MAXSERVICES 3
MODEL SHM
LDBAL N
*MACHINES
LWYM
LMID = lw
TUXDIR = "C:\bea\tuxedo9.0"
TUXCONFIG = "F:\Liwei\Tuxedo\dbread\tuxconfig"
APPDIR = "F:\Liwei\Tuxedo\dbread"
*GROUPS
GROUP1 LMID=lw GRPNO = 1 OPENINFO=NONE
*SERVERS
DEFAULT:
CLOPT="-A"
simpserv SRVGRP=GROUP1 SRVID=1
*SERVICES
TOUPPER
1.启动tlisten
tlisten在tuxedo启动时扮演控制者的角色,在非masterZ由tlisten启动bbl和应用服务器,tlisten的启动方法ؓ(f)
tlisten -l //host:ipport
注意q里?span lang="EN-US">ipport必须和ubb文g中NETWORK域NLSADDR一?/span>
tlisten必须在所有的机器上启?启动后才能运行tmboot.操作pȝ启动时就q行tlisten.
2. ubb文g配置
对于多机模式一般就是指单一domain理的多台机?所有机器上仅需要一个ubb文g,以下是ubb文g的模?/span>
*RESOURCES
IPCKEY 80952
MAXACCESSERS 40
MAXSERVERS 35
MAXSERVICES75
MASTER SITE1,SITE2
OPTIONSLAN,MIGRATE
MODEL MP
*MACHINES
<SITE1's uname> LMID=SITE1
TUXDIR="<TUXDIR1>"
APPDIR="<APPDIR1>"
TUXCONFIG="<APPDIR1>/tuxconfig"
TYPE="<machine type1>"
ULOGPFX="<APPDIR1>/ULOG"
<SITE2's uname>LMID=SITE2
TUXDIR="<TUXDIR2>"
APPDIR="<APPDIR2>"
TLOGDEVICE="<APPDIR2>/TLOG"
TLOGNAME=TLOG
TUXCONFIG="<APPDIR2>/tuxconfig"
TYPE="<machine type2>"
ULOGPFX="<APPDIR2>/ULOG"
#
*GROUPS
*NETWORK
SITE1 NADDR="<network address of SITE1>"
BRIDGE="<device of provider1>"
NLSADDR="<network listener address of SITE1>"
SITE2 NADDR="<network address of SITE2>"
BRIDGE="<device of provider2>"
NLSADDR="<network listener address of SITE2>"
*SERVERS
DEFAULT: RESTART=Y MAXGEN=5 REPLYQ=Y CLOPT="-A"
#
*SERVICES
3. 理
只能?/span> master Zq行 tmadmin q行理。要获得l计信息?/span> tmadmin 中应q行 default –m 命o(h)?/span>
例如Q?/font>
tmadmin
>default –m SITE1
>printservice
Sample:
#ident "@(#) samples/atmi/simpapp/ubbmp $Revision: 1.2.8.1 $"
*RESOURCES
IPCKEY 87654
MASTER site1,site2
MAXACCESSERS 40
MAXSERVERS20
MAXSERVICES 40
UID 0
GID 0
MODEL MP
OPTIONS LAN,MIGRATE
*MACHINES
CHRIS LMID=site1
APPDIR="d:\tuxedo\samples\atmi\simpapp"
TUXCONFIG="d:\tuxedo\samples\atmi\simpapp\tuxconfig"
# TYPE="<Replace with the proper machine type for site1>"
TUXDIR="d:\tuxedo"
chrislinux LMID=site2
APPDIR="/home/tuxedo/samples/atmi/simpapp"
TUXCONFIG="/home/tuxedo/samples/atmi/simpapp/tuxconfig"
# TYPE="<Replace with the proper machine type for site2>"
TUXDIR="/home/tuxedo"
UID=503
GID=503
*GROUPS
GROUP1
LMID=site1 GRPNO=1 OPENINFO=NONE
GROUP2
LMID=site2 GRPNO=2 OPENINFO=NONE
*NETWORK
site1NADDR="http://10.10.10.10:6033"
NLSADDR="http://10.10.10.10:6034"
# BRIDGE="<Replace with the network device or omit if there is none>"
site2NADDR="http://10.10.10.11:6033"
NLSADDR="http://10.10.10.11:6034"
# BRIDGE="<Replace with the network device or omit if there is none>"
*SERVERS
DEFAULT:
CLOPT="-A"
simpserv SRVGRP=GROUP1 SRVID=3
*SERVICES
一、Tuxedo基本命o(h)
#1.讄环境变量TUXDIR,APPDIR,TUXCONFIGQLANG(跟OS相关),LD_LIBRARY_PATH(跟OS相关)
#2.~译ubb文本生成二进刉|文Ӟ(x)tmloadcf –y ubbconfig
#3.所有机器上q行tlisten,具体见文中NETWORK一?br />#4.启动tmboot –y
#5.关闭tmshutdown –y
参数Q?
-A在所有机器上启动/关闭理的Serverq程
-M只在MASTER机器上启?关闭理的Serverq程
-isrvid 启动/关闭某个server id指定的Serverq程
-ggrpname启动/关闭某个server group名字指定的Server Group
-S启动/关闭所有应用服务器QLMIDQ?br />-sserver-name 启动/关闭某个server名字指定的Serverq程
-llmid option 在指定的机器上启?关闭所有TMSq程和应用服务器QLMIDQ?br />-Tgrpname 启动/关闭指定的server group中所有的TMSq程
-Blmid 在指定的机器上启?关闭BBLq程
-ecommand 指定一个程序可以当在MASTER机器上启动Q何一个进E失败时执行
-c计算出当前UBB配置的Tuxedo启动最要占用的系lIPC资源
#用tmunloadcf > generated.ubb 可以得出目前配置得UBB文g所有得参数|没有讄的有~省|
#用tmloadcf –c或tmboot –c可以计算出当前UBB配置的Tuxedo启动最要占用的系lIPC资源?
二、UBB文g配置说明
UBB配置文g分成*RESOURCES,*GROUP,*SERVER,*SERVICE,*NETWORK{若q节。DEFAULT表示该节中所有对象共有的~省属性?
*RESOURCES
#RESOUCES节提供整个系l的基本参数?
IPCKEY55555 Q?2767-262143Q?
#q行IPC通讯的key?br />DOMAINIDunicom
#DOMAIN的ID?br />MASTERunicom1,unicom2
#指定DOMAIN中的理L为unicom1,q行q程中unicom1若出现问题,理L切换至unicom2
MAXACCESSERS 1000
#q里该DC整个系l中单个机器上可以访问TUXEDO的最多的Client和Server的L(可以讉K BBL的最大进E数)Q应大于license用户?server敎ͼ副本应记入)。该字段?x)被MACHINE部分的MAXACCESSERS覆盖?br />#pȝ核心参数中SEMAPHORE的数?SEMMNS)要大于这里的MAXACCESSERS数目Q而ipc消息个数QMSGMAXQ应大于MAXACCESSERS?所有带REPLYQ的SERVER的个数?br />MAXSERVERS80
#最大的server敎ͼ副本应记入)
MAXSERVICES200
#最大的service敎ͼ多个server重复记入Q?br />MAXGTT20
#pȝ最多的q发的全局交易数目
MODELMP
#表示cluster方式Q否则ؓ(f)SHM
OPTIONSLAN,MIGRATE
#多机cluster方式时必L定ؓ(f)LAN方式QMIGRATE表示可以以组为单位进行机器间SERVER的迁UR?br />LDBALY
#允许负蝲均衡
SCANUNIT10
#SCANUNIT
是BBL在所有服务请求中定期扫描以寻找超时的交易和被d徯用和德间隔时_(d)U)。这个参数指定BBL扫描间隔旉的基本单位,
它会(x)影响在tpbegin中指定的交易时旉和用BLOCKTIME指定的请求阻塞超时时间的_E度。SANITYSCAN, BBLQUERY,
DBBLWAIT,
BLOCKTIME{参数都是SCANUNIT的倍数Q而不是实际秒数。而作为时间单位SCANUNIT必须?的倍数Qƈ且满?<
SCANUNIT<60?
SANITYSCAN12
#SANITYSCAN的值指定在每个MACHINE上BBL自动所有进E的旉间隔Q以SCANUNIT为单元。缺省值满ISCANUNIT*SANITYSCANQ约?20U?
DBBLWAIT 2
#DBBLWAIT
的值指定DBBL扫描BBL时等待所有BBL应答的最大时_(d)以SCANUNIT为单元,卌qDBBLWAIT*SCANUNITQ秒Q就时。每一?
DBBL请求{发给它的BBLӞBBL?x)在hq回l果之前先回复一个肯定的应答。这样可以定时检死掉或不正常的BBL。缺省值满?
QSCANUNIT*DBBLWAITQ的值等于SCANUNIT?0U两者之间的最大者?
BBLQUERY30
#BBLQUERY指定DBBLҎ(gu)有BBLq行状态检查的旉间隔Q它也是以SCANUNIT单位。如果DBBL的状态询问没有回{,该BBLp‘隔Z了。缺省值满?SCANUNIT * BBLQUERY) Uؓ(f) 300U?
BLOCKTIME6
#BLOCKTIME指定在阻塞队列中的被dh的超时时?包括客户端从tpinit到tpterm的等待时?Q以SCANUNIT单位。缺省值满?SCANUNIT * BLOCKTIME) Uؓ(f)60U?
*MACHINES
DEFAULT:
#该部分对各主行描q?br />unicom2LMID=unicom2
APPDIR="/usr/tuxedo/apps/simpapp"
TUXCONFIG="/usr/tuxedo/apps/simpapp/tuxconfig"
TUXDIR="/usr/tuxedo"
UID=17
GID=26
MAXACCESSERS=100
unicom1LMID=unicom1
APPDIR="/usr/tuxedo/apps/simpapp"
TUXCONFIG="/usr/tuxedo/apps/simpapp/tuxconfig"
TUXDIR="/usr/tuxedo"
UID=17
GID=26
MAXWSCLIENTS=50
#unicom2, unicom1为网l主机名用hostname获得?br />#LMIDQLogical Machines ID 为tuxedo对主机的内部逻辑命名?br />#APPDIR要求攄SERVER的可执行文g?br />#TUXCONFIG为全路径的二q制配置文gQ要求和环境变量TUXCONFIG相同。对于master机tuxconfig文g是由tmloadcf生成的,而非master机则是由tmboot启动后由tlisten从masterZ拯获得?br />#TUXDIR为tuxedo安装目录Q要求和环境变量TUXDIR相同?br />#MAXWSCLIENTS表示可连接client的最大个数?
*GROUPS
#GROUP1为组名,LMID表示该组q行的主机,GRPNO为组POPENINFOl通过XA打开RM(通常指数据库)的初始串?
GROUP1 LMID=unicom2GRPNO=1 OPENINFO=NONE
GROUP2 LMID=unicom3GRPNO=2 OPENINFO=NONE
*SERVERS
#q里描述应用服务器。SRVGRP的该SERVER所属组名,SRVID为服务器IDPMIN表示该服务器CLOPT提供q行的相兛_敎ͼ要求是?A -- ??可以在应用服务器的srvinit函数中获得这些参数?br />DEFAULT:
CLOPT="-A"
BillServer SRVGRP=GROUP1 SRVID=1 MIN=2 MAX=4
RQADDR=QNAME REPLYQ=Y
CLOPT="-A -o ./out.log –r -e ./err.log --
-p [L][low_water][,[terminate_time]][:[high_water][,create_time]]
?
果MAX>1Qƈ且用了MSSQQRQADDRQ?
RQPERMQ的Server可以配置-p来控制进E的增加和减。控制算法如下:(x)如果h队列中的h个数大于high_water
后超qcreate_time U?增加该服务的一个新q程Q?如果h队列中的h个数于low_water
后超qterminate_time U? 停止该服务的一个进E。low_water ~省是^均每个服务进E有一个请求消息或者workload
50Qhigh_water ~省是^均每个服务进E有两个h消息或者workload 100。create_time ~省最是50U?
and terminate_time ~省最是60U?br />注意Q?br />使用TUXEDO的服务进E池Ӟ用户自己在程序中如果用alarmQ){系l调用来停止q程是不起作用的Q但也不?x)报错?br /> [L] 标记意味着增减服务q程Z负蝲而不是请求队列的长度。仅用于SHM模式下ƈ且LDBAL=YQ否则会(x)报错 (LIBTUX_CAT:1542) Q服务进E也不会(x)增减?
WSLSRVGRP=GROUP2 SRVID=1
CLOPT="-A -- -n //130.36.0.103:8889 -m 3 -M 10 -x 10 -T 10"
#WSL
用于和client端进行连接?n 表示出接入点为IP:PORT方式Q?m –M
表示最和最大启动多个WSH和前端通讯Q?x则表CZ个WSH和几个client端连接?T
10表示如果client端和serverq接?0分钟内没有交易请求则关闭q接?
*SERVICES
#不要求将所有的service在这里描qͼ当某个service有特别参数时才在SERVICE节中说明?br />TOUPPER
LOAD=60 // 负蝲Q当LDBAL=Y时有?br />PRIO=80// 服务在请求队列中的优先
TRANSTIME=120 // 交易旉
SVCTIMEOUT=600// 服务时旉
*NETWORK
#NETWORK节对多机之间如何q行|络q接q行描述?br />#cluster方式下要求先启动tlisten。事实上Q对于非master机启动应用服务器是由tlisten完成的?br />#tlisten的启动方式ؓ(f)
#unicom1: tlisten –l //130.36.1.101:8891
#unicom2: tlisten –l //130.36.0.102:8891
#NADDR指定|络q接的接入点?br />#NLSADDR则指定tlisten的接入点?br />#BRIDGE则指TCPq接所用的讑֤文g?
unicom2
NADDR="http://130.36.0.102:8899"
NLSADDR="http://130.36.0.102:8891"
BRIDGE="/dev/streams/xtiso/tcp"
unicom1
NADDR="http://130.36.0.101:8899"
NLSADDR="http://130.36.0.101:8891"
BRIDGE="/dev/streams/xtiso/tcp"
分类ȝ
TypeParameters requiring tuning
IdentificationTUXCONFIG, UID, GID, IPCKEY, DOMAINID
ThresholdsMAXACCESSERS, MAXSERVERS, MAXSERVICES, MAXGTT, MAXCONV, MAXBUFSTYPE, MAXWSCLIENTS
Time-outsSCANUNIT, SANITYSCAN, DBBLWAIT, BBLQUERY, BLOCKTIME
AvailabilityMASTER, MIGRATE, RESTART, GRACE, MAXGEN, RCMD
MachineTYPE, CMPLIMIT, NETLOAD, SPINCOUNT, TLOGDEVICE, PERM
NetworkNADDR, NLSADDR
ServersCLOPT, ENVFILE
ServicesLOAD, PRIO, BUFTYPE, SVCTIMEOUT
WorkstationsWSNADDR, WSRPLYMAX
三、数据库XA讄
3.1 ORACLE XA
1.在附件中提供了rm文g,另外q行oracle的demo文g获得要连接的所有lib库的名称.然后这些名U全部写在RM文g?
如:(x) #Oracle 8i for NT
Oracle_XA;xaosw;%ORACLE_HOME%\RDBMS\XA\ORAXA8.LIB
%ORACLE_HOME%\PRECOMP\LIB\MSVC\ORASQL8.LIB
%ORACLE_HOME%\PRECOMP\LIB\MSVC\ORASQX8.LIB
%ORACLE_HOME%\OCI\LIB\MSVC\OCI.LIB %ORACLE_HOME%\OCI\LIB\MSVC\OCIW32.LIB
#Oracle 8i for Unix
Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lclntsh
2.ubb 文g?*GROUP节加?br /> TMSNAME=TMS_ORA
TMSCOUNT=3 OPENINFO="Oracle_XA:Oracle_XA+Acc=P/scott/tiger+SesTM=120+LogDir=.+SqlNet=abcde"
?
体在Oracle联机文Application Development->oracle8 Application
Development's Guild->Oracle XA->Defining the xa_open String中提供了解释
3.在oracle用sys用户dsqlplusQ?br />a)q行${ORACLE_HOME}/rdbms/Admin/xaview.sql,
b)grant select on v$xatrans$ to public;
c)grant select on dba_pending_transactions to scott;
d)commit;
4.q行 buildtms -o $(TUXDIR)/bin/TMS_ORA -r Oracle_XA
5.
在tpsvrinit()中EXEC SQL CONNECT ...Ҏ(gu) tpopen(), tpsrvdone()中EXEC SQL
DISCONNECT...Ҏ(gu)tpclose(); 实际可拷?TUXDIR/apps/bankapp/appinit.c
6.需在ubb文g中MACHINE节指定TLOGDEVICE,TLOGSIZE
?TLOGDEVICE="/home/usr1/TLOGDEV"
TLOGSIZE=500
7.建立TLOG文g直接拯$TUXDIR/apps/bankapp/crtlog.sh.讑֮相关的环境变量后q行该shell文g.
8.启动事务用tpbegin(3,0),提交回滚用tpcommit/tpabort.
3.2 SYBASE XA
1.在RM文g,q行sybase获得要连接的所有lib库的名称.然后这些名U全部写在RM文g?#Sybase_11 for NT
SYBASE_XA_SERVER;sybase_xa_switch;C:\SYBASE_SERVER\lib\libxasrvlib.lib
2.ubbconfig 文g中的 *GROUP?
TMS_NAME=TMS_SYB TMSCOUNT=3 OPENINFO=" SYBASE_XA_SERVER: -Uuserid1 -Ppassword1 -Nconnection2 -Lxa_log -Tall "
具体察看Sybase文当中xa_open String中提供了解释
3.q行 buildtms -o $(TUXDIR)/bin/TMS_SYB -r SYBASE_XA_SERVER
4.
在tpsvrinit()中EXEC SQL CONNECT ...Ҏ(gu) tpopen, tpsrvdone()中EXEC SQL
DISCONNECT...Ҏ(gu)tpclose(); 实际可查?TUXDIR/apps/bankapp/appinit.c
5.需在ubb文g中MACHINE节指定TLOGDEVICE,TLOGSIZE
?TLOGDEVICE="/home/usr1/TLOGDEV"
TLOGSIZE=500
6.建立TLOG文g直接拯$TUXDIR/apps/bankapp/crtlog.sh.讑֮相关的环境变量后q行该shell文g.
7.启动事务用tpbegin(3,0),提交回滚用tpcommit/tpabort.
3.3 INFORMIX XA
1.
q行esql
-lib获得要连接的所有lib库的名称.然后这些名U全部加到RM文g中INFORMIX-OnLine:infx_xa_switch:$
{INFORMIXDIR}/lib/esql/libinfxxa.a /usr/informix/lib/esql/libixos.a
/usr/informix/lib/esql/libixgen.a /usr/informix/lib/esql/libixsql.a
/usr/informix/lib/libixasf.a /usr/informix/lib/esql/libixos.a
/usr/informix/lib/esql/libixgen.a /usr/informix/lib/esql/libixgls.a
-lnsl_s -lm -lV3 -lcl -lsec /usr/informix/lib/esql/libixglx.a
2.ubbconfig 文g?br />*GROUP?TMS_NAME=TMS_INFO TMSCOUNT=3 OPENINFO="INFORMIX-OnLine:test_tux"
具体察看Sybase文当中xa_open String中提供了解释
3.q行 buildtms -o $(TUXDIR)/bin/TMS_INFO -r INFORMIX-OnLine
4.
在tpsvrinit()中EXEC SQL CONNECT ...Ҏ(gu) tpopen, tpsrvdone()中EXEC SQL
DISCONNECT...Ҏ(gu)tpclose(); 实际可查?TUXDIR/apps/bankapp/appinit.c
5.需在ubb文g中MACHINE节指定TLOGDEVICE,TLOGSIZE
?TLOGDEVICE="/home/usr1/TLOGDEV"
TLOGSIZE=500
6.建立TLOG文g直接拯$TUXDIR/apps/bankapp/crtlog.sh.讑֮相关的环境变量后q行该shell文g.
7.启动事务用tpbegin(3,0),提交回滚用tpcommit/tpabort.
四、Tuxedo多机方式配置要点
tuxedo多机方式配置有两个方?br />4.1启动tlisten
tlisten在tuxedo启动时扮演控制者的角色,在非masterZ由tlisten启动bbl和应用服务器,tlisten的启动方法ؓ(f)
tlisten -l //hostip:ipport
1Q注意这里的ipport必须和ubb文g中NETWORK域的NLSADDR一?最好都用IP地址Q以避免双方对同一机器名解释出不同的IP地址?br />2Q?tlisten必须在所有的机器上启?启动后才能运行tmboot.操作pȝ启动时就q行tlisten.
3Q?
注意各个节点的tlisten都有PASSWORDQ存?APPDIR%\.adm\tlisten.pw文g下,如果那里没有Q就读TUXEDO?
TUXDIR%\udataobj\tlisten.pw文g中的内容。各节点的tlisten
password要保证绝对一P包括回RQ)。否则会(x)报错Q‘Security Violation’?br />4.2 ubb文g配置
对于多机模式一般就是指单一domain理的多台机?所有机器上仅需要一个ubb文g,以下是ubb文g的模?br />*RESOURCES
IPCKEY80952
MAXACCESSERS40
MAXSERVERS35
MAXSERVICES75
MASTERSITE1,SITE2
OPTIONSLAN,MIGRATE // MIGRATE表示MASTER可以动态迁U?br />MODELMP// 多机模式
*MACHINES
"PATRICK"LMID="site1"
APPDIR="DQ?Bea/tuxedo/samples/atmi/simpapp"
TUXCONFIG="d:/Bea/tuxedo/samples/atmi/simpapp/tuxconfig"
TUXDIR=" d:/Bea /tuxedo"
UID=0
GID=0
TYPE="NT"
MAXWSCLIENTS=5
MAXACCESSERS=40
"test60"LMID="site2"
APPDIR="/bea/tuxedo/samples/atmi/simpapp"
TUXCONFIG="/bea/tuxedo/samples/atmi/simpapp/tuxconfig"
TUXDIR="/bea/tuxedo"
UID=1002
GID=101
TYPE="Sun"
MAXWSCLIENTS=15
MAXACCESSERS=100
*GROUPS
GROUP1 LMID=site1GRPNO=1OPENINFO=NONE
GROUP2 LMID=site2GRPNO=2OPENINFO=NONE
*SERVERS
DEFAULT:DEFAULT: RESTART=Y MAXGEN=5 REPLYQ=Y CLOPT="-A"
WSLSRVGRP=GROUP1 SRVID=20 CLOPT="-A -- -n //10.128.5.201:9009"
WSLSRVGRP=GROUP2 SRVID=10 CLOPT="-A -- -n //10.128.5.200:9009"
simpservSRVGRP=GROUP1 SRVID=3
simpservSRVGRP=GROUP2 SRVID=4
*SERVICES
*NETWORK
site1NADDR="http://10.128.5.201:6044"
NLSADDR="http://10.128.5.201:6045"
site2NADDR="http://10.128.5.200:6044"
NLSADDR="http://10.128.5.200:6045"
# BRIDGE="/dev/tcp"
4.3理
只能在masterZq行tmadminq行理。要获得l计信息在tmadmin中应q行default –m命o(h)?br />$tmadmin
>default –m SITE1
>psr
>bbi
当MASTERL意外当机ӞTUXEDO仍可以正常运行,可以在backup的节点上手工做MASTER的动态迁U,在当前的backup节点?DBBL充当MASTER?br />$tmadmin
>m
Windows NT/2000下要注意的问题:(x)
1.׃NT机器上MAXACCESSORS受IPC的限刉常较小,因此在MACHINES部分单独讄MAXACCESSORS.
2.在MACHINES部分要单独设|UID=0和GID=0
3.和其他类型的CPU机器互连?在MACHINES部分一定要指定不同的TYPE.否则提Ctlisten版本不匹配?br />TUXEDO在SERVER和CLIENT之间q行数据交换~省q行数据译,但一个domain的server之间~省不进行数据翻?
5.有时LANG环境变量无法改变为C, 可以?%TUXDIR%\locale创徏文g?mkdir %LANG%.
6.RM文g使用中发现有效的RM后一定要有回?否则报RM不存?
五、用JOLTq接Tuxedo和W(xu)eblogic
5.1在Tuxedo上安装、配|JOLT Server
1 ?安装JOLT Server
2 -- set your environment
set TUXDIR=d:\bea\tuxedo
set JOLTDIR=%TUXDIR%\udataobj\jolt
set APPDIR=%TUXDIR%\samples\atmi\simpapp
set PATH=%TUXDIR%\bin;%JOLTDIR%\bin;%APPDIR%;%PATH%
set NLSPATH=%TUXDIR%\locale\C
set TUXCONFIG=%APPDIR%\tuxconfig
3 ?added in UBBconfig file
JSLSRVGRP=GROUP1
SRVID=6 CLOPT="-A -- -n //10.128.5.112:9001"JREPSVRSRVGRP=GROUP1
SRVID=7 CLOPT="-A -- -W -P
d:\Bea\tuxedo\udataobj\jolt\repository\jrepository"JREPSVRSRVGRP=GROUP1
SRVID=8 CLOPT="-A -- -P
d:\Bea\tuxedo\udataobj\jolt\repository\jrepository"
5.2 配置Weblogic Server 6.x
1,Download
the Jolt client package for WLS from developer.bea.com, unzip it and
copy the jar file to %WL_HOME%\lib. Then add the jar files into your
Weblogic domain environment file:
classpath=%classpath%;%WL_HOME%\lib\jolt.jar;%WL_HOME%\lib\joltweblogic.jar
2,Config Jolt pool manager startup class in Weblogic
a,start Weblogic and access the console
b,create Startup class and Shutdown class
in console:Deployments->Startup & Shutdown,right click
select create a new StartUp class...:
name:demojoltpoolStartup
classname:bea.jolt.pool.servlet.weblogic.PoolManagerStartUp
3,Create a jolt pool
in console:Services->Jolt,right click
Select the panel:Configuration
in TAB General
name:demojoltpool
Minimum Pool Size:1
Maximum Pool Size:3
Click the button "Create"
in TAB address
Primary Address://hostname:port
Failover Address://hostname:port
Click the button "Apply"
Select Targets:
in Listbox Available:
select your server add into the listbox Chosen
Click the button "Apply"
4. Restart your Weblogic
5.3 Example setup
1.Run %WL_HOME%\config\example\setExampleEnv.cmd,
2.compile the SimpAppServlet by:
javac -d %EX_WEBAPP_CLASSES% SimpAppServlet.java
3.Edit WL_HOME%\config\examples\applications\examplesWebApp\WEB-INF\web.xml
add the servlet description:
<servlet>
<servlet-name>JoltServlet</servlet-name>
<servlet-class>examples.jolt.servlet.simpapp.SimpAppServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>JoltServlet</servlet-name>
<url-pattern>/joltservlet</url-pattern>
</servlet-mapping>
4.Edit a html and put it to %WL_HOME%\config\examples\applications\examplesWebApp
内容包含调用JoltServlet
Type
some text here and click the Post button:<form name="simpapp"
action="joltservlet" method="post"><input type="hidden"
name="SVCNAME" value="TOUPPER"><input type="text"
name="STRING"></td><input type="submit"
value="Post!"></form>
5.Goto %WL_HOME%\config\example, start the examples domain,
6.Access http://localhost:7001/examplesWebApp/jolt.html
六、TUXEDO动态配|?br />TUXEDO
的动态配|可以通过tmadmin和tmconfig两个命o(h)行工具实C同别的配置修改。tmadmin的作用主要是监控TUXEDO的运行,可以?
Ҏ(gu)务的参数Q而tmconfig功能更强大,可以在线修改当前TUXEDO的系lUBB配置Q即通过MIB修改用UBBCONFIG生成的二q制
TUXCONFIG在内存的拯?br />6.1 用tmadmin修改配置
q入tmadmin后用命o(h)help可以列出所有命令?
6.2 用tmconfig更改TUXCONFIGQUBBCONFIGQ?br />tmconfig工具实际上遍历TUXCONFIG的内容ƈ通过MIB API修改光|。要正确q行tmconfigQ徏议设|以下环境变量:(x)
TUXDIR=/usr/tuxedo
TUXCONFIG=/usr/app/tuxconfig
EDITOR=vi
主要的界面如下:(x)
$ tmconfig
Section: 1) RESOURCES, 2) MACHINES, 3) GROUPS 4) SERVERS
5)SERVICES 6) NETWORK 7) ROUTING q) QUIT 9) WSL
10) NETGROUPS 11) NETMAPS 12) INTERFACES [1]:
Operation: 1) FIRST 2) NEXT 3) RETRIEVE 4) ADD 5) UPDATE
6) CLEAR BUFFER 7) QUIT [1]: 4
Enter editor to add/modify fields [n]?
Perform operation [y]?
1. 用tmconfig增加C?
1.q入tmconfig后,选择2QMACHINES?br />2.然后可以先选择3QRETRIEVE看看当前的配|,~省是第一个MACHINE的配|?br />3.通过选择2QNEXT可以一直向后搜索MACHINE配置Q直到空记录为止?br />4.选择4QADD
Enter editor to add/modify fields [n]? y
5.q入vi~辑状态,可以按照一定格式增加配|。格式ؓ(f)Q?br />MIB域名[tab]?br />6.增加MACHINE必须加入以下的域Q?br />oTA_TUXCONFIG
oTA_TUXDIR
oTA_APPDIR
oTA_TLOGDEVICE
oTA_TLOGSIZE
oTA_PMID
oTA_LMID
oTA_TYPE
例:(x)
TA_TUXCONFIG /usr/apps/bank/tuxconfig
TA_TUXDIR /usr/tuxroot
TA_APPDIR /usr/apps/bank
TA_TLOGDEVICE /usr/apps/bank/TLOG
TA_ULOGPFX /usr/apps/bank/ULOG
TA_ENVFILE /usr/apps/bank/ENVFILE
TA_TLOGSIZE 150
TA_PMID SERVER109
TA_LMID SITE1
TA_TYPE Sun
7.存盘退出viQ执行操作即可?
8.ȀzL增的MACHINEQ?重新选择2QMACHINES ?gt; 5)UPDATE
9.q入vi后查找TA_STATE,其gNEW改ؓ(f)ACTIVE
10.存盘退出viq执行操作?
2. 用tmconfig增加新Serverq程
1.q入tmconfig后,选择2QSERVER?br />2.可以先选择3QRETRIEVE看看当前的配|,~省是第一个SERVER的配|?br />3.通过选择2QNEXT可以一直向后搜索SERVER配置Q直到空记录为止?br />4.选择4QADD
Enter editor to add/modify fields [n]? y
5.q入vi~辑状态,可以按照一定格式增加配|。格式ؓ(f)QMIB域名[tab]?br />6.增加MACHINE必须加入以下的域Q?br />oTA_SERVERNAME
oTA_SRVGRP
oTA_SRVID
例:(x)
TA_SERVERNAME /usr/apps/bank/teller_server
TA_SRVGRP GROUP1
TA_SRVID 15
7Q存盘退出viQ执行操作即可?
七、系l核心参数参?br />Message Queues Parameters
·MSGMNI:
Total Number of Queues (Use this formula: Add MAXACCESSERS + (No.
Servers with Reply Queues) - (No. Servers in MSSQ Set) + (No. MSSQ
Sets) + 7) to determine the appropriate value
·MSGMAP: Number of entries in control map used to manage message segments (Not defined in NT). Set to 2 * MSGMNI
·MSGMAX: Maximum message size in bytes. Set to the largest message size or 75% of the queue size (whichever is bigger)
·MSGMNB: This is the queue size itself (64K, 128K, etc.)
·MSGSSZ:
Size of a segment in bytes (Not defined in NT). The value of MSGSSZ
should be such that a multiple of MSGSSZ is equal to the size
(including the BEA TUXEDO System header) of the most commonly sent
message. Usually set to 16, 32, or 64.
·MSGTQL: Total Number of In-Flight messages in the system at once
·MSGSEG:
Number of message segments in the system (Not defined in NT). You need
to find out the queue space of your machine and then the following
formula applies: MSGSEG * MSGSSZ = Machine Queue Space Size (note it
will swap)
Semaphores Parameters
·SEMMNS: Maximum number of
semaphores in the system. The minimum requirement for SEMMNS is
MAXACCESSERS - MAXWSCLIENTS + 13 (local clients and all servers)
·SEMMNI:
Maximum number of active semaphore sets. For small apps,(100 to 500
servers),10 sets are usually sufficient. For large apps, (>500
servers) 32-64 sets are usually sufficient (do a tmloadcf -c to see
which is the best)
·SEMMSL: Maximum number of semaphores per semaphore sets (Not defined in NT). Use the formula: SEMMNS = SEMMNI * SEMMSL
·SEMMAP: Size of the control map used to control semaphore sets (Not defined in NT). Set to SEMMNI
·SEMMNU: Number of undo structures in the system. Set to SEMMNS
·SEMUME: Maximum number of undo entries per undo structure (Not defined in NT). Set to SEMMNS
Shared Memory Parameters
·SHMMAX:
Maximum shared memory segment size in bytes. Bulletin Board Size (must
be greater than 1,400,000). Largest BB today is approx. 5 MB (this
parameter is normally set much higher for the database, so use their
rules)
·SHMSEG: Maximum number of segments one process can attach to (for a busy application you need to set this from 32-64)
·SHMMNI:
Maximum number of shared memory identifiers in the system. Normally the
default of 100 is acceptable (unless more than 100 entities plan on
allocating shared memory)
·SHMMIN: Minimum shared memory segment size in bytes. MUST be set to 1.
Other Tunables
·ULIMIT:
Maximum file size. ULIMIT needs to be large enough so that you can
install BEA TUXEDO and build servers. 4 megabytes recommended.
·MAXUP:
Maximum number of processes per non-super user. The BEA TUXEDO
system processes--servers and administrative processes—run with
the UID specified in the application's UBBCONFIG file. MAXUP needs
to be large enough to allow all of these processes to run.
·NOFILES: Maximum number of open files per process. A BEA TUXEDO server requires a minimum of four file descriptors.
·NPROC: Maximum number of processes (systemwide).
·NREGION:
Number of region table entries to allocate. Most processes have three
regions: text, data, and stack. Additional regions are needed for each
shared memory segment and shared library (text and data) attached.
However, the region table entry for the text of a ``shared text''
program is shared by all processes executing that program. Each shared
memory segment attached to one or more processes uses another region
table entry.
·NUMTIM: Maximum number of STREAMS modules that can
be pushed by the Transport Layer Interface (TLI). A typical default
value is 16; you should have it set to at least 256.
·NUMTRW: The
number of TLI read/write structures to allocate in kernel data space.
A typical default value is 16; you should have it set to at least 256.
Tuxedopȝq_的调试参数及(qing)步骤
1Q配|MAXSERVERS、MAXSERVICES两个参数Q看是否满ubbfile文g的配|的服务数和服务参数的个数。Tmadmin——bbsQ看里面的参C数?br />2Q数据库的可以连接数的大是否满ubbfile文g里面同一个数据库q接得servers的数目。参照xa_NULL*.trc文g的错误提C?br />3Q用命o(h)tmloadcf –c ubbfile看tuxedo的进E所需要的׃n内存配置。然后修改系l的׃n内存的配|。除了AIXq_外,pȝ的共享内存参数——set shmsys:shminfo_shmmin要设|ؓ(f)1?br />4QTmunloadcf 看现在运行的TUXEDO环境?br />5QTmadmin——crdl -b -z 创徏日志文g?br />6QTUXEDO环境的设|顺序。Tuxconfig——tmadmin——TLOGQ?br />
-- 作者:(x) whiteclude
-- 发布旉Q?2002/07/27 05:53pm
TUXEDO与ORACLE数据库的互连
(来源Qhttp://www.ccw.com.cn)
前言1 引言
q几q来Q以交易中间件ؓ(f)框架基础的三层客h/服务器模式已被广泛证实ؓ(f)建立开攑ּ关键业务应用pȝ的最佳环境?/p>
TUXEDO是美国BEA公司的一U交易中间g产品Q它在银行、电(sh)信、邮ѝ金融证券等大规模关键事务处理领域中有着q泛的应用。它能够? C/S环境下整合各U异构^収ͼ通过联机事务处理机制Q保证交易的完整性和数据的一致性。BEA TUXEDO是在企业、Internet q样的分布式q算环境中开发和理三层l构的客?服务器型关键d应用pȝ的强有力工具?/p>
BEA TUXEDO 采用三层l构的客h/服务器模式组件Y件模?该结构利用交易中间g应用的业务逻辑、表C逻辑和数据分Z个不同的处理层:(x)客户为第一表示逻辑层,? 现用户交互和数据表示Q第二层的逻辑业务层ؓ(f)应用的主体,负责业务的逻辑处理Q第三层数据层负责对数据库的索、读取和更新{操作。交易中间g作ؓ(f)构造三 层结构应用系l的基础q_Q提供了两个主要功能Q负责客h和服务器间的联接和通讯Q提供一个三层结构应用开发和q行的^台。由此可见,交易中间件提供了 一个基的框架去帮助你徏立、运行和理一个三层客h/服务器模式的应用Q你不需要从零做P大大~短了应用开发的旉Q提高了应用开发的成功率?/p>
本文以应用TUXEDO的同步调用tpcall方式和FML~程方式ZQ介l了在Windows客户端和Unix服务器之间完成文件传输的? 法。客L(fng)调用VC++制作的传输文件的tuxedo动态链接库Q实现Windows客户端与Unix服务器端传输文gQ包括上传和下蝲文g两种方式Q的 实现Ҏ(gu)?/p>
2 客户端应用TUXEDO实现文g传输Ҏ(gu)
在客L(fng)Q首先设|客L(fng)与服务器端在文g传输中文件块的大、文件的块标识等基本信息Q将字节数比较大的文件分为很多小块,利用TUXEDO 的同步调用tpcall方式循环调用后台的文件处理服务,字节数较大的文件按着块的大小分多ơ传输到UNIX后台。下面以下蝲文gZ讲解使用 tuxedo同步调用tpcall方式完成文g传输的例子?/p>
首先利用TUXEDO的tpalloc甌需要用的发送和接收~存Q用Fchg32函数在缓存中攑օ服务器端需要的域|(x)文g块的大小、文件的标识{基本信息?/p>
SndBuf = (FBFR32 *)tpalloc("FML32", NULL, 1024); /* 甌发送的~存 */
iRet = Fchg32(SndBuf,BLOCKSIZE,0,(char *)&lBlockSize,0); /* 讄文g块的大小 */
讄完毕后,开始用同步tpcall调用UNIX后台文g处理FTPSVR服务?
/* 客户端同步调用UNIXq_文g处理服务*/
iRet = tpcall("FTPSVR",(char *)SndBuf,0L,(char **)&RcvBuf,(long *)&len,0L);
iRet = Fget32(RcvBuf, FILELEN, 0, (char *)&lFileLen, 0);/* 接收文g长度*/
接收文gq将W一块数据写入文?br />iRet = Fget32(RcvBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 *)&lFileDataLen);
fp = fopen(pszCltFileName, "wb+"); /* 创徏文g*/
lBlkLen = fwrite(pszFileBuf,1,lFileDataLen,fp); /* 接收第一块数据写入文?/
同时计算需要调用下载文件服务的ơ数Q多ơ调用文件服务,后l文件下载到客户端?br />lBlkNum = (lFileLen -1)/lBlockSize +1 ;
for(i=2; i<lBlkNum+1;i++)?br />…?br />iRet = tpcall("FTPSVR",(char *)SndBuf,0L,(char **)&RcvBuf,(long *)&len,0L);
Fget32(RcvBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 *)&lBlockSize);
lBlkLen = fwrite(pszFileBuf, 1, lBlockSize, fp);
…?br />?/p>
3 UNIX服务器端实现Ҏ(gu)
在Unix服务器端Q接收客L(fng)发送过来的~存内容Q如Q文件块的大、文件块内容、文件块标识{。根据文件块的标识移动文件指针来写文Ӟ? ơ文件指针移动的大小由文件块的大决定,q将d的文件块的内Ҏ(gu)入输出缓存中Qƈq回l客L(fng)。Unix服务器端E序例子说明如下Q?/p>
FTPSVR(TPSVCINFO *rqst)
{
………?br />RcvBuf = (FBFR32 *)rqst->data; /*指向接收客户端的~存*/
iRet = Fget32(RcvBuf, BLOCKID, 0, (char *)&lBlockID, 0); /* 接收client发送的块标?/
fp = fopen(pszSvrFileName, "rb"); /* 打开文gQ准备读?/
(fseek(fp, (lBlockID-1)*lBlockSize, 0)!=0) /* Ҏ(gu)块标识移动文件指?/
lReadLen=fread(pszFileBuf, 1, lBlockSize, fp); /* d文g?/
Fchg32(SndBuf, FILEDATA, 0, pszFileBuf, (FLDLEN32 )lReadLen); /* 文件块的内Ҏ(gu)式放入tuxedo甌的缓存中*/
tpreturn(TPSUCCESS, 0, (char *)SndBuf, 0L, 0); /* 输出缓存返回给客户?/
?
4 WINDOWSq_文g传输的设?/p>
4.1 WINDOWS客户端动态链接库的实?/p>
使用PowerBuilder、Delphi、VB{Y件不能直接调?
C语言源代码,它们只能调用动态链接库文g。下面我们讲q如何用VC++6.0Windows客户端的文g传输的C、TUXEDO代码制作成动态链?
库供Power Builder、Delphi、VB{程序调用?br /> 使用VC++可以制作三种DLLQ分别是
(1)Non-MFC Dlls
(2).Regular Dlls
(3)Extension Dlls
Non-MFC DLL:指的是不用MFC的类库结构,直接用C语言写的DLLQ其输出的函C般用的是标准C接口Qƈ能被非MFC或MFC~写的应用程序所调用。因为我们不使用MFCcdQ所以采用Non-MFC Dlls?
每一个DLL必须有一个入口点Q就象用C~写的应用程序,必须有一个main函数一? DllMain是一个缺省的函数入口?/p>
创徏一个动态链接库Q选择File->New菜单Q弹出New对话框。在Projects标签下Q选择"Win32 Dynamic-Link Library"。Visual C++׃(x)创徏动态链接库所需的工E文件?br />创徏ftpfile.def文gQ这个文件记录了可被外部应用E序使用的DLL库函数名字。这些名字信息和对应的函C|的信息被~译q动态链接库文g中,然后应用E序Ҏ(gu)函数名字和函C|对照表来找到对应的函数。ftpfile.def内容如下Q?/p>
LIBRARY "ftpfile"
EXPORTS
ftpfile; /*与C代码中的函数名称相同*/
ftpfile.def?
源程序ftpfile.cpp、头文gpublic.h和ftpfld.h、tuxedo库文件wtuxws32.lib和libwsc.lib加入到工
E中。选择Project->add to projectQ?gt;files.然后开始编译动态链接库生成ftpfile.dll?br />代码样例如下Q?br />BOOL WINAPI DllMain( HMODULE hModule, DWORD dwReason, LPVOID lpvReserved )
/* 动态链接库函数入口*/
{
return TRUE;
}
LRESULT WINAPI ftpfile(char* CltFileName,char* SvrFileName,long lBlockSize,long lOptFlag) /* 动态链接库函数M*/
{
FBFR32 *RcvBuf,*SndBuf; /*变量声明*/
int iRet;
long i,lBlkLen,len,lFileLen,lBlkNum;
………?br />/* 动态链接库E序M*/
SndBuf = (FBFR32 *)tpalloc("FML32", NULL, MAXBUFLEN); /*甌发送缓?/
if (SndBuf == NULL)
{
userlog("tpalloc sndbuf error errno=[%d] err=[%s]",tpstrerror(tperrno));
tpterm();
return TPALLOCERR;
}
RcvBuf = (FBFR32 *)tpalloc("FML32", NULL, MAXBUFLEN);/*甌接收~存*/
iRet = Fchg32(SndBuf,BLOCKSIZE,0,(char *)&lBlockSize,0); /*把块大小攑օ发送缓?/
if (iRet <0){ /*错误处理*/
tpfree((char *)SndBuf);
tpfree((char *)RcvBuf);
tpterm();
return FCHGERR;
}
iRet = Fchg32(SndBuf,OPTFLAG,0,(char *)&lOptFlag,0);
…………………………?br />}/* E序Ml束*/
4.2 WINDOWS客户端动态链接库的调?/p>
以Power Builder7.0ZQ讲q如何在Power Builder中调用文件传输的客户端动态链接库?/p>
首先Q在Power Builder声明该函敎ͼ声明如下Q?br />Function Integer ftpfile(string CltFileName,string SvrFileName,long lBlockSize,long lOptFlag) LIBRARY "ftpfile.dll"
然后Q在E序中就可以应用了。示例如下:(x)
string CltFileName
string SvrFileName
long lBlockSize
long lOptFlag /*讄文g上传或下载标?/
integer iRet
CltFileName="..\data\report.txt"
SvrFileName="../up/form.txt"
LBlockSize=1024
LOptFlag=1
IRet = ftpfile(CltFileName,SvrFileName,lBlockSize,lOptFlag)
If (iret< 0){
messagebox('pȝ提示','调用ftpfile函数错误')
return
}
5 l束?/p>
本文通过分析TUXEDO交易中间件的同步调用TPCALL和FML~程方式Q描qC在Windows和UNIXq_之间如何完成文g传输的方法,概述了Windowsq_如何制作和调用动态链接库?/p>