BEA TUXEDO的学习

 BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
TUXEDO 精华贴总结
总结人:彭建新 (DEV2DEV ID:SYLPJX)
序言
原以为很容易就可以把这些帖子总结一下,没有想到,主题虽然不多,精华
区的回帖却是不少,要仔细的看完这些帖子,区分开来原来竟然也不是一件容易
的事,还好断断续续的坚持了下来,精华贴中的大部分信息变成了下面的形式。
由于里面的信息是我认为比较有用的,又没有和别人商量,难免有失偏颇,
大家在看这个总结的时候,只选择其中有用的去看就可以。
为了保证回复的帖子的原貌,我基本没有改动大家回帖时的言语,这样做,
我是想,保留大家为论坛所作的贡献,而使大家更清晰的认识到我只是一个总结
者,而不是在盗用大家的东西。
做了这个总结,主要的目的使大家不再问许多重复的问题,这样就可以节省
回复者的体力,更加使论坛中没有解决的问题凸现出来。
在总结的时候,分类是一个麻烦的问题,有的帖子,可能可以放到好几个类
别里,而我只是把他归入了其中的一个类别中,甚至把类别归错,请大家批评。
总结时, 在程序示例类别中, 有3 个程序, 我在TUXEDO65 和
WEINDOWS2000 SERVER 下调试通过,并把源程序附上。这3 个程序是wsywin
版主在论坛上提供的,其中FML 和VIEW 由于论坛的原因程序甚至没能全部贴
出,其中的UBB 文件也没有贴出,这次在wsywin 版主的大力帮助下,把源程
序及配置文件一并提供。衷心对wsywin 版主表示感谢。
希望这个总结对大家有所帮助,同时祝大家工作顺利!
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
目 录
1 环境变量设置.........................................................................................................7
1.1 怎么样在程序中设置环境变量,用哪个函数?............................................. 7
1.2 如何在程序中动态变换WSNADDR?.......................................................... 7
1.3 在AIX 下,Client 需要对应多个Server,WSNADDR 如何配置?tuxputenv 如
何使用?在程序调用时怎样切换? ............................................................................ 8
1.4 bea 的文档里就有一个客户端连接不通服务端的例子(html 帮助文档)。..... 9
1.5 系统环境变量的设置................................................................................... 9
1.6 TMS 起来后,但运行客户端取不到数据,是什么原因?.............................. 9
1.7 在Redhat8.0 下怎么安装Tuxedo8.1? ....................................................... 10
1.8 环境变量设置需要在几个地方?................................................................ 10
1.9 UNIX 库文件环境变量如何设置? ............................................................. 10
1.10 Delphi 开发客户端的环境变量设置?......................................................... 10
2 UBB 配置.............................................................................................................10
2.1 机器名怎么找? ........................................................................................ 10
2.2 TUXEDO 版本6.5 和8.0 可以混用吗?.......................................................11
2.3 TUXEDO 与ORACLE 不采用XA 方式连接,怎么在UBB 文件中写? .......11
2.4 Tmloadcf can not run on a Non-Master Node?.............................................. 12
2.5 MSSQ 配置问题?..................................................................................... 12
2.6 Tuxedo MP 方式的切换说明....................................................................... 13
2.7 如何在不同的机器上实现simpapp?以及探讨一下c/s and B/s 的各自有缺点。
14
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
2.8 防火墙+端口映射的配置问题和不安装客户端打包.................................... 14
2.9 WSL 和WSH 的关系................................................................................. 15
2.10 Service 的合并问题.................................................................................... 15
2.11 TUXEDO LICENS 的估算.......................................................................... 15
2.12 关于tmloadcf 的问题................................................................................. 16
2.13 tuxedo 负载均衡........................................................................................ 16
2.14 TUXEDO_XA 的使用方法......................................................................... 16
2.15 tuxedo 能否与Ms Sql Server 相连呢?........................................................ 17
2.16 jolt 的配置问题.......................................................................................... 17
3 程序开发...............................................................................................................18
3.1 Tuxedo CLIENT 连接不到server 端的网络问题?....................................... 18
3.2 分多次返回数据的问题.............................................................................. 18
3.3 tmshutdown -y 出错? ................................................................................. 19
3.4 如何用TUXEDO 同步调用存储过程? ...................................................... 19
3.5 TMS 老是启动不了的问题?...................................................................... 20
3.6 tuxedo 中XA 错误解析.............................................................................. 20
3.7 编译客户端程序,运行时调用tpinit 出错? ............................................... 21
3.8 tuxedo 与sybase 如何联结怎么连接?自己写连接?还是采用tuxedo 的XA 直
连? 21
3.9 关于安装WEB GUI 的问题? .................................................................... 23
3.10 ATMI 的C++编程问题............................................................................... 23
3.11 有关SECURITY的问题?........................................................................... 23
3.12 用什么方法可以看到我创好的用户和组呢? .............................................. 23
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
3.13 如何把FML 的描述文件编译成DLL 文件,包含在如VB 或POWERBUILDER
中的客户端进行调用?............................................................................................ 24
3.14 在编译TUXEDO 客户端,出现无法定位输入点xxxx.dll 是不是编写的DLL 程
序有问题? ............................................................................................................. 24
3.15 TUXEDO LICENSE 的说明资料................................................................. 24
3.16 PowerBuilder 中声明、调用tuxedo 方法例子.............................................. 25
3.17 pb 与tuxedo 函数说明............................................................................... 26
3.18 pb 与tuxedo 的FML 函数Fchg 参数解释................................................... 26
3.19 BCB开发Tuxedo 客户端配置详解!!........................................................ 27
3.20 tuxedo6.5 和weblogic7.0 通过wtc 互联....................................................... 29
3.21 tuxedo 服务器端中是否可以写一个全局的对象或变量,所有SERVICE 都可调
用的? 32
3.22 tuxedo 服务器端中是否可以写一个全局的对象或变量,所有SERVICE 都可调
用的? 32
3.23 tuxedo 服务器端中是否可以写一个全局的对象或变量,所有SERVICE 都可调
用的? 33
3.24 关于使用XA 时数据库的连接数的问题..................................................... 34
3.25 如何在delphi 中进行tuxedo 函数的声明、调用? ...................................... 35
3.26 Delphi 开发客户端的问题请教................................................................... 37
3.27 如何使用tuxedo 开发大型软件系统?........................................................ 39
3.28 Tuxedo 在UNIX 下开发,需要看的书........................................................ 39
3.29 启动XA,出现错误:xaorecover: xaofetch rtn -3 的解决方法...................... 39
4 RM 配置...............................................................................................................40
4.1 怎样和sybase 数据库连接?...................................................................... 40
4.2 RM 文件配置for Informix 7.2.3.................................................................. 40
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
4.3 sybase 是基于WIN2000 的,怎么配制RM? ............................................. 40
4.4 tuxedo 的数据库服务器为unix 上的oracle9i!客户机用win2000 的9i 或8i 可
以吗? 40
4.5 tuxedo 与sybase 如何联结.......................................................................... 41
4.6 如何配置TUXEDO 与Oracle 的连接......................................................... 41
4.7 MP 启动注意问题...................................................................................... 41
4.8 防火墙+端口映射的配置问题和不安装客户端打包.................................... 41
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
1 环境变量设置
1.1 怎么样在程序中设置环境变量,用哪个函数?
保存一个tuxedo 的env 文件,如:tuxenv.ini.内容格式如下:
[TUXCOMM]
TUXDIR=c:/tuxedo
PATH=%PATH%;c:/tuxedo/bin
WSADDR=//192.168.0.1:6000
。。。
在程序中使用: tuxreadenv("tuxenv.ini","TUXCOMM");语句来调用。
1.2 如何在程序中动态变换WSNADDR?
建议使用tuxreadenv function,方法如下:
保存一个tuxedo 的env 文件,如:tuxenv.ini.内容格式如下:
[TUXCOMM]
TUXDIR=c:/tuxedo
PATH=%PATH%;c:/tuxedo/bin
WSADDR=//192.168.0.1:6000
在程序中使用:
tuxreadenv(“tuxenv.ini“,“TUXCOMM“);
程序例子:
tuxreadenv();
tpinit()
tpalloc();
Fchg();
tpcall();
return 0
每一个代码都这样写!
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
1.3 在AIX 下,Client 需要对应多个Server,WSNADDR
如何配置?tuxputenv 如何使用?在程序调用时怎样切
换?
一个client 访问多个server,不建议使用系统的WSNADDR 环境变量。建议使用
tuxreadenv 函数。或者使用tuxputenv.其实最好使用tuxreadenv.因为tuxreadenv 是
读取配置的环境变量
例子如下:
iRet = tuxreadenv("tuxenv.ini","SVR1");
/* 访问SVR1 host */
if (iRet < 0)
{
userlog("error on tuxreadenv SVR1");
tpfree(char *)RcvBuf;
return -1;
}
.......................
iRet = tuxreadenv("tuxenv.ini","SVR2");
/* 访问SVR2 host */
if (iRet < 0)
{
userlog("error on tuxreadenv SVR2");
tpfree(char *)RcvBuf;
return -1;
}
tuxenv.ini 文件内容如下:
[SVR1]
TUXDIR=/home/tuxdeo /* TUXDIR=c:/tuxedo on windows */
PATH=$PATH:$TUXDIR/bin /* %PATH%;%TUXDIR%/bin on Windwos*/
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib
WSNADDR=//192.168.0.1:6000
[SVR2]
TUXDIR=/home/tuxdeo /* TUXDIR=c:/tuxedo on windows */
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
PATH=$PATH:$TUXDIR/bin /* %PATH%;%TUXDIR%/bin on Windwos*/
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TUXDIR/lib
WSNADDR=//192.168.0.1:6001
1.4 bea 的文档里就有一个客户端连接不通服务端的例子
(html 帮助文档)。
这样做的好处是显而易见的:服务器不用配置成复杂的多域模式。
不通的服务器要用独立的context。
#include <stdio.h>
#include "atmi.h" /* BEA Tuxedo header file */
main(int argc, char *argv[])
{
TPINIT * tpinitbuf;
TPCONTEXT_T firstapp_contextID, secondapp_contextID;
/* Attach to the BEA Tuxedo system in multicontext mode.*/
tpinitbuf=tpalloc(TPINIT, NULL, TPINITNEED(0));
tpinitbuf->flags = TPMULTICONTEXTS;
if (tpinit((TPINIT *) tpinitbuf) == -1)
{
(void) fprintf(stderr, "Tpinit failed/n");
exit(1);
}
/* Obtain a handle to the current context. */ tpgetctxt(&firstapp_contextID, 0);
/* Use tuxputenv to change the value of TUXCONFIG, so we now tpinit to another
application. */
1.5 系统环境变量的设置
如果使用tuxreadenv()函数,可以直接修改环境变量的配置文件。立刻生效。如
果使用windows 98 系统的环境变量,那么需要重新启动系统啊。如果windows
2000 可以立刻生效。
1.6 TMS 起来后,但运行客户端取不到数据,是什么原因?
setenv 就是在写程序时候设置环境变量的一个shell。如果在unix上就是setenv
(或其他的文件,可以执行,更改环境变量的shell 文件),如果在windows 上就
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
是setenv.bat(也可以是其他的名字,可以改变当前的环境变量)
1.7 在Redhat8.0 下怎么安装Tuxedo8.1?
经过分析安装脚本我现在知道了。是内部解压缩包出错。原因是没有
uncompress 这个命令。只需cp /bin/gunzip /bin/uncompress 即可。
1.8 环境变量设置需要在几个地方?
关于环境变量有两个地方是必须设置的:
1、当前shell 环境变量
2、配置文件ubb 中
由于Windows 平台比较特殊,所以可以在“我的电脑”里设置环境变量。但可
以在命令行窗口中重新设置来覆盖,你的问题看起来是你TUXCONFIG 这个环
境变量和UBB 中的不一致,你可以在命令行窗口下用echo %TUXCONFIG% 显
示当前窗口的TUXCONFIG 环境变量。另外如果还不行就把你原来那个
TUXCONFIG 文件删掉,重新tmloadcf
1.9 UNIX 库文件环境变量如何设置?
LD_LIBARARY_PATH 是unix 的设置库文件环境变量,类似windows 下的
LIB=c:/tuxedo 设置lib 环境变量的,其他的unix 还有SHLIB_PATH 等
1.10 Delphi 开发客户端的环境变量设置?
delphi 客户端需要配置两个环境参数,如果是win98,放在autoexec.bat 中,如
果是win2000,在"我的电脑"->“高级”配置Path,指向tuxedo 的根目录和/bin 目
录。
例如path = ...;c:/bea/tuxedo8.0;c:/bea/tuxedo8.0/bin
tuxdir,指向tuxedo 的根目录
tuxdir=c:/bea/tuxedo8.0
2 UBB 配置
2.1 机器名怎么找?
在windows machine 中:
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
machine name = 大写的机器名字(控制面板中的机器名字)!一定要记住大写机器
名,还有就是如果你的机器名字不是一个字符串的话,比如下面的情况jian yi
这个机器名,你需要在UBB 中写成这样的形式“JIAN YI” 。
在unix :
machine name = uname –n 。
2.2 TUXEDO 版本6.5 和8.0 可以混用吗?
可以应用的。
1.低联高(6.5--->8.0) : 在WSL中加入-t 即可
如:CLOPT="-A -t -- -n //vt8000:3345
2. 高联低(8.0--->6.5),除了设置环境变量WSNADDR=//host:port 外, 还应设
WSINTOPPRE71 = yes
2.3 TUXEDO 与ORACLE 不采用XA 方式连接,怎么在
UBB 文件中写?
不采用XA 的ubbconfig 跟正常情况一样写。没有TMS 组(OPENINFO、
TMSNAME
等),没有TLOG 的信息。例如:
*RESOURCES
IPCKEY 50012
MASTER simple
PERM 0666
MAXACCESSERS 260
DOMAINID domsj
MAXSERVICES 100
MODEL SHM
LDBAL N
*MACHINES
"ins1" LMID="simple"
TUXCONFIG="/home/test/conf/tuxconfig"
TUXDIR="/tuxedo"
APPDIR="/home/test/bin"
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
MAXWSCLIENTS=60
*GROUPS
"APPGRP" LMID="simple" GRPNO=1
DOMGRP
LMID=simple GRPNO=20 OPENINFO=NONE
*SERVERS
"Filercv" SRVGRP="APPGRP" SRVID=200
2.4 Tmloadcf can not run on a Non-Master Node?
检查你的ubbconfig 配置文件,机器名是否和你的主机名相同。
win***: set 查看COMPUTER NAME,注意区分大小写。
unix: uname -n 查看。
2.5 MSSQ 配置问题?
反面声音:
“BEA 好像不建议用MSSQ,因为很多Service 共用一个Queue,而Queue
空间是操作系统分配的规定大小空间,不会动态分配。多个Service 多个请求时,
MSSQ 的Queue 很容易满。这样请求被拒绝的几率就大。”
正面声音:
我有不同的看法。首先我接触的BEA 工程师没有建议不用。而且这个确实
可以提高性能,我们现在主要的server 都起了几份(2-12 之间是推荐的)。而
且从理论上讲也是有可以理解的。没有MSSQ 时,每个server 一个队列,用户
接收请求和返回结果。客户端和server 一对一,这时你可以将一个server 启多份
但不是MSSQ,因为每个server 都有自己的队列,用tmadmin->pq 看一下,更糟
的是所有的请求几乎都是发给多个同名server 中的一个,其它都闲着,就没有起
多份的意义了。用了MSSQ(顺便可以加一个返回队列,是很有必要的,用于将
请求和返回分开)之后,多个server 共用一个请求队列(在pq 里可以看到,你
可以自己命名),都从这个队列取请求去处理,就像在食堂有几个师傅在卖饭,
但是只有一条队,比一个师傅一条队还是要快些的。psr 的时候你会看到每个
server 处理的数目是比较平均的,我有一次做了40,000 笔交易,起10 个,几
乎都是4000 个。在一个server 处理的时候,其它空闲的server 可以继续接受请
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
求。队列满的快是客户端的量大,并发快,不是server 的关系,当然server 处理
快就不会堵塞。这一点和oracle 的MTS 的原理惊人的相似,oracle 说这种模式
相比专用服务器模式可以增加客户端数目。
2.6 Tuxedo MP 方式的切换说明
环境:master: LMID app_server1
slave: LMID app_server2
1. 管理的切换
(实现方法:在UBB 文件的*RESOURCES 部分的MASTER 写法如下:
MASTER app_server1,app_server2)
1.正常情况下切换:
在slave 机器上,tmadmin---> master
系统会提示是否切换,输入y,回车,就可以把DBBL 切换过来
如果想切换回来,可以在master 机器上,tmadmin---> master
系统会提示是否切换,输入y,回车,就可以把DBBL 切换过来
2.slave 机器出现问题,tuxedo shutdown 后,机器重新启动情况下切换:
在master 机器上,tmadmin-----> rco app_server1 app_server2
pcl app_server2
tmboot –y 会把app_server2 上的server 启动起来
注:也可以使用tmboot –s <app_server2 上serve r 的名字> 把app_server2 上的
server 启动起来
3.Master 机器出现问题,tuxedo shutdown 后,机器重新启动情况下切换:
在slave 机器上,tmadmin-------> master
系统会提示是否切换,输入y,回车,就可以把DBBL 切换过来
在slave 机器上,tmadmin-----> rco app_server2 app_server1
pcl app_server1
tmboot –y 会把app_server1 上的server 启动起来
注:也可以使用tmboot –s <app_server1 上server 的名字> 把app_server1 上的
server 启动起来,此时,slave 机器是master,如果想切换到master 机器上,参
照1 种的方法
4.两台机器连接出现问题,恢复以后:
在master 机器上,tmadmin-----> rco app_server1 app_server2
2. 组的切换
(实现方法:在UBB 文件的*RESOURCES 部分的MASTER 写法如下:
OPTIONS LAN,MIGRATE
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
在UBB 文件的*GROUPS 部分的MASTER 写法如下:
GROUP1
LMID= app_server1, app_server2 GRPNO=1 OPENINFO=NONE

1.正常情况下切换:
在主机上把要切换的组停掉:
tmshutdown –R –g GROUP1
在slave 机器上,tmadmin---> migg GROUP1
2.master 机器出现问题,组的切换:
首先把该机器切换成主机(方法在前面)
在slave 机器上,tmadmin-----> pcl app_server1
migg GROUP1
tmboot –g GROUP1 会把app_server2 上的GROUP1 启动起来
3.如果是要把组反方向切换(上面的配置要作相应的修改):
在master 机器上,tmadmin-----> pcl app_server2
migg groupname
tmboot –g groupname 会把app_server1 上的groupname 启动起来
说明:采用MP 完全可以实现高可用性
2.7 如何在不同的机器上实现simpapp?以及探讨一下c/s
and B/s 的各自有缺点。
第一个问题。你把ubbconfig 的配置文件更改一下, 在machine 加入
MAXWSCLIENTS 参数,在server 段加入WSL server。具体可以参加以前发的
贴子,或察看文档。在client 配置WSNADDR=//serverIP:port.
第二个:其实tuxedo 是OLTP 应用处理的最佳选择产品。至于产品升级,可
以使用tuxedo 的功能,将升级作为自动的。那么通过网络完成升级功能,不需
要人工干预。也是可以做到的。只不过方式有人工有程序实现,与B/S 的thin client
不一样。但是tuxedo 的一些功能b/s 是不能替代的
2.8 防火墙+端口映射的配置问题和不安装客户端打包
1、在服务端的ubbconfig 中的WSL加入-H 参数。例如:
WSL = ... -n //inside IP:port -H //outside IP:port -p minPort -P MaxPort -m 5
-M 10 -x 10
例如: WSL = ... - n //10.54.0.51:9001 -H //123.100.1.90:MMMM -p 9001 -P 9011
-m 5 -M 10 -x 6
不过需要在防火墙上至少开M 个端口。
2、不安装客户端直接打包了TUXEDO 的文件并配置环境变量,
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
但是,需要把$TUXDIR/local 目录下的message 文件给打包上。否则不能报告
正确的错误信息。提示什么:$TUXDIR=NULL 等错误信息。
3、直接用的动态库的函数,编译时没有什么-W 参数了.
这种情况,在制作动态库的时候已经暗示把-w 参数给使用了。因为你使用了ws
方式的lib 库或者ws 方式的dll 了。
2.9 WSL 和WSH 的关系
1- 如果连接数会很多,应该多起几个WSH(因为连接数太多,WSH 数目少则
会成为系统数据转发的瓶颈),如果能够人为管理的话,在不同的网点分配不同
WSL 地址(启动多个WSL的情况下),可以适当地分担WSL的负载;
2- 应用的service/server 分配的原则应该是最大化共享资源、最小化系统开销、
并尽量避免瓶颈,没有最好理论方案,根据具体的系统硬件、软件性能、应用的
具体情况具体安排吧。假如所有的service 都在一个server 实现,而其中一个
service 特别繁忙,那么其他的service 都要等待此service,这时我认为应该把这
个service 单独实现比较好;如果是8 个service 分布的8 个server 中,那么比较
便于维护和程序调试,我比较主张同一类的service 分布在同一个server 中,因
为开发时毕竟同一类的功能是由一个人来负责的,这样开发、维护时比较方便,
系统逻辑也清楚些。如果操作系统和硬件不是很强的话,启动太多进程那么会大
大增加系统开销,瓶颈就转移到操作系统了。还是具体情况具体分析,要靠实践
中的测试数据来证明真理吧。
2.10 Service 的合并问题
如果你的机器硬件允许,可以不需要合并多个service 到一个server。可以一
个service 就是一个server。然后多启动几个server。另外,你的连接网点(电脑
终端)多,可以多启动几个WSL.减少连接的阻塞。
因为你的服务不多,就8 个,可以这样做。如果服务很多,机器硬件内存
等少,可以合并N 个service 到一个server。那么合并也要讲究原则的。
2.11 TUXEDO LICENS 的估算
交易频率(F1):平均每个用户的处理时间为约60 秒即1 分钟
交易后台处理时间(T):4~5 秒(包括多个TUXEDO 服务完成时间和数据打包来
回传输时间),平均为4。
高峰瞬间业务放大因子(F2):通常为5~10,平均为7
总的并发用户连接数和服务数目的比例为:(T:F1) * F2=(4:60)*7,约1:2。
即如果系统要支撑120 个终端请求,需要至少60 个License。
需要指出的是:
1.这种估算方法的准确程度比较依赖于应用的实现方法和对性能的准确了解上。
2.无法估算来自Internet 和其他系统接口的服务请求所需要的License 数目,这
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
些请求的并发连接数需要另外估算。
2.12 关于tmloadcf 的问题
ubbsimple 文件在最后一行后面必须要跟一个空白行,否则tmloadcf 就会出
错。
2.13 tuxedo 负载均衡
1。如果是会话的话应该也没有问题,因为建立会话的时候,client 和那个server
之间应该有context 之类的东西就可以标示和相互找到了。因为文档没有提到说
会话方式server 不能启多份。(要是那样就很没劲 :) )。我们会话用得很少,
你可以试一下。
2。TUXEDO 的负载均衡大致可以分为两种,单机的和多机。单机的就是多个
server 分担来均衡,我的那篇文章主要说这个,并做了些测试。至于多机的前面
有一个朋友贴了关于MP 的很好的帖子,还有WSNADDR 配两个进行轮询等办
法。
3。在只有一个client 多次调用时,我的测试结果是如果MSSQ,还是会分担到
多个,但是多Q 多server 就不会,你也可以试一下。这是一个区别。
4。在MP 的时候,优先用本地的server,再考虑remote 的,因为这样少了网络
的开销,当然,这其中也要考虑每个server 当前的负载。
2.14 TUXEDO_XA 的使用方法
使用TUXEDO XA 需要做以下几件事
以下以ORACLE V815 为例:
1. 修改%TUXDIR%/udataobj/RM 文件,在RM 文件中指定数据库提供的XA
库。
Oracle_XA;xaosw; e:/Oracle/Ora81/rdbms/xa/oraxa8.lib
e:/Oracle/Ora81/precomp/lib/msvc/orasql8.lib(windows)
(unix:Oracle_XA:xaosw:-L${ORACLE_HOME}/lib - lclntsh.sl)
2. 编译TMS(全局交易管理服务)
命令:buildtms –o TMS_ORA –r Oracle_XA
3.COPY TMS_ORA 到%TUXDIR/bin 目录下(或者放到$APPDIR)
4.在UBBCONFIG 中配置TLOG 日志和TMS_ORA 服务
*MACHINES
APPDIR="/disk2/tuxedo/demo"
TUXCONFIG="/disk2/tuxedo/demo/tuxconfig"
TUXDIR="/disk2/tuxedo"
TLOGDEVICE="/disk2/tuxedo/demo/TLOG"
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
TLOGNAME="TLOG"
TLOGSIZE=1024*GROUPS
GROUP1
LMID=simple GRPNO=1
TMSNAME=TMS_ORA TMSCOUNT=3
OPENINFO="Oracle_XA:Oracle_XA+Acc=P/tuxedo/odexut+SesTM=120+LogDir
=/disk2/tuxedo/demo/XALOG"
5. 编译UBBCONFIG
命令:tmloadcf -y UBBCONFIG
7. 创建TLOG(交易日志)
命令:tmadmin
crdl -b 2048 -z /disk2/tuxedo/demo/TLOG
crlog -m simple(假定逻辑机器名是simple)
10. 启动TUXEDO
tmboot –y
11. 检查是否正常
1) 检查TMS_ORA 是否启动
命令:tmadmin
psr
查看TMS_ORA 是否启动。
2) 用程序检查是否正常
如果TUXEDO 和ORACLE 连接正常那么对数据库的操作将会成功。
如果连接不正常,请检查ULOG日志,定位错误。
2.15 tuxedo 能否与Ms Sql Server 相连呢?
SQLServer 6.5:
RM:
SQL_SERVER;msqlsrvxa1;E:/MSSQL/PTK/XASWITCH.OBJ
or SQL_SERVER;msqlsrvxa1;%MSTOOLS%/lib/xaswitch.obj
2.16 jolt 的配置问题
一般jolt 需要配置两个进程,一个是jsl,
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
一个是jrepsvr,如下:
JSL SRVGRP = GROUP_JOLT SRVID = 755
CLOPT = "-A -t -- -n //aa.aa.aa.aa:5000 -m 5 -M 20 -x 10 -I 10 -T 5"
JREPSVR SRVGRP = GROUP_JOLT SRVID = 760
RESTART=Y GRACE=0 CLOPT="-A -- -W -P /app/jrepository"
JREPSVR SRVGRP = GROUP_JOLT SRVID = 765
RESTART=Y RQADDR=JREPQ REPLYQ=Y GRACE=0 CLOPT="-A -- -P
/app/jrepository"
JREPSVR SRVGRP = GROUP_JOLT SRVID = 770
RESTART=Y RQADDR=JREPQ REPLYQ=Y GRACE=0 CLOPT="-A -- -P
/app/jrepository"
其中jrepository(用来存放服务端需要发布的服务列表及参数信息)需要生成,
需要在服务端启动tuxwsvr,wlisten,然后在客户端
访问服务端jolt 目录下的html,然后就可以配置服务端发布的服务。
3 程序开发
3.1 Tuxedo CLIENT 连接不到server 端的网络问题?
如果网络是通的,那么还有一个问题:
就是如果你的网络部太好,就是ping(默认是64 bytes)大的包(例如:512,
1024bytes)不通(或者丢包率太大),也不行。因为这个跟你写的程序有关。如果
在网络传输时要求网络特别好,那么这个地方也容易出现问题。
另外你client 设置的WSNADDR 的IP and Port 必须没有问题,否则也会出现这
样的问题,这个跟我以前说的问题是一样的。就是网络不通。
3.2 分多次返回数据的问题
(1) Conversation 的方式是可行的,只要在客户端做好控制,就不会出现等待
太久的情况(比如用循环连续地把结果分多次取完),队列方面BBL 会处
理,只是资源使用肯定会比同步方式多,还有如果返回量太大,需要经过
长时间分多次传送,就要注意ubb 中的关于超时的设置,否则会出现13
的超时错误。
(2) 使用tpcall 方式。客户端多次tpcall 取回所需要的数据。
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
3.3 tmshutdown -y 出错?
关于这个问题,我也遇到过,无法shutdown,后来只有kill掉,但是这样的话tmboot
的时候会有问题,因为kill 的时候IPC 没有被释放,有两个办法:换一个IPC 值
(2^15+1--2^18)或者用ipcrm(UNIX)将原来的IPC 释放掉。
3.4 如何用TUXEDO 同步调用存储过程?
#if defined(__STDC__)||defined(__cplusplus)
QUERY(TPSVCINFO *rqst)
#else
QUERY(rqst)
TPSVCINFO *rqst;
#endif
{
/* declare section */
................
/*定义接收变量与光标变量*/
EXEC SQL BEGIN DECLARE SECTION;
sql_cursor sys_cursor;
.......
EXEC SQL VAR error IS STRING(ERRINFO_LEN);
EXEC SQL END DECLARE SECTION;
......
transftemp =(FBFR *)rqst->data;
transf = (FBFR *)tpalloc("FML32",NULL,10240);
if (transf == (FBFR *)NULL)
{
tpreturn(TPFAIL,0,(char *)transf,0L,0);
}
Finit(transf,(FLDLEN)Fsizeof(transf));
/*分配关闭内存*/
EXEC SQL ALLOCATE :test_cursor;
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
/*执行存储过程*/
EXEC SQL EXECUTE
BEGIN
proc_query(:test_cursor,:error,:iRet);
END;
END-EXEC;
3.5 TMS 老是启动不了的问题?
错误原因不是权限的问题!
是因为我的setenv 中设置
set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280
set NLS_DATE_FORMAT='YYYY-MM-DD'
我的DB 字符集为SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280
可能在WIN2000 下不能设置NLS_LANG 和NLS_DATE_FORMAT(但是UNIX
中可以)
去掉这两句后就可以启动TMS 了!
3.6 tuxedo 中XA 错误解析
如果tuxedo 中使用XA,出现如下错误的解决方法:
Tuxedo ULOG
144225.rs43p!BBL.24850: LIBTUX_CAT:262: INFO: Standard main starting
144240.rs43p!TMS_ORACLE.36242: 101300: TUXEDO Version 6.4 AIX 2 4
007025954C00. 144240.rs43p!TMS_ORACLE.36242: LIBTUX_CAT:262: INFO:
Standard main starting 144240.rs43p!TMS_ORACLE.36242: LIBTUX_CAT:466:
ERROR: tpopen TPERMERR xa_open re turned XAER_INVAL 144240.rs43p!
TMS_ORACLE.36242: LIBTUX_CAT:250: ERROR: tpsvrinit() failed
144240.rs43p!tmboot.39820: 101300: TUXEDO Version 6.4 AIX 2 4
007025954C00. 144240.rs43p!tmboot.39820: CMDTUX_CAT:825: ERROR:
Process TMS_ORACLE at SITE1 fa iled with /T tperrno (TPERMERR -
resource manager error) 144240.rs43p!TMS_ORACLE.38768: 101300: TUXEDO
Version 6.4 AIX 2 4 007025954C00. 144240.rs43p!TMS_ORACLE.38768:
LIBTUX_CAT:262: INFO: Standard main starting 144240.rs43p!
TMS_ORACLE.38768: LIBTUX_CAT:466: ERROR: tpopen TPERMERR xa_open
re
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
turned XAER_INVAL 144240.rs43p!TMS_ORACLE.38768: LIBTUX_CAT:250:
ERROR: tpsvrinit() failed 144240.rs43p!tmboot.39820: CMDTUX_CAT:825:
ERROR: Process TMS_ORACLE at SITE1 fa iled with /T tperrno (TPERMERR -
resource manager error)
有三个问题导致出现这样的错误:
(1)你的RM 配置文件是否有错误,通过buildtms 就可以测试出来。如果
buildtms 成功,则证明RM 配置没有问题。如果不能正确 buildtms 成功,请先
配置正确的RM 文件。
(2)XA 配置文件中Open string 配置出现错误,正确的格式:
OPENINFO="Oracle_XA:Oracle_XA+SqlNet=alias+Acc=P/un/pw+SesTm=10+Log
Dir=<xxx>"
(3)tuxedo device 没有正确的建立,请重新建立一遍。使用如下命令(例子,请
使用符合你的实际要求的做):
crdl -b 2000 -z /home/tuxedo/TLOG
crlog -m LMID
3.7 编译客户端程序,运行时调用tpinit 出错?
你未使用cb 时候,你肯定没有使用WS 方式,现在你使用WS 方式,所以你必
须配置WSNADDR 环境变量和buildclient 使用-w 参数
3.8 tuxedo 与sybase 如何联结怎么连接?自己写连接?还
是采用tuxedo 的XA 直连?
在应用XA Interface 编译执行TUXEDO 应用时,应注意的几个问题
本文所针对的应用环境:
OS:Win2000
ASE:ASE125(安装路径e:/sybase)
OCS:Open Client125(安装路径e:/sybase/ocs-12_5)
TUXEDO:Tuxedo8.0(安装路径e:/program files/tuxedo8.0)
1.Open Client125 要求必须安装EBF10420 或者EBF10419 补丁
2.修改RM TUXEDO 文件
#----------NT-----------begin--------
SYBASE_XA_SERVER;sybase_TUX_xa_switch;E:/sybase/OCS-12_5
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
/lib/libxadtm.lib E:/sybase/OCS-12_5/lib/libcobct.lib
E:/sybase/OCS-12_5/lib/libct.lib E:/sybase/OCS-12_5/lib/libcs.lib
#----------NT-----------end----------
注意必须放在同一行.
3.修改UBB 文件
OPENINFO="SYBASE_XA_SERVER: -Nconnection1 -Uuserid1 -
Ppassword1 -Le:/SYBASE/ocs-12_5/sample/xadtm/
tuxedo/simprpc.ct/xa_log -V125 -Tall"
注意-V -T 参数的使用
测试Open Client125 自带样本应用simprpc 时,
4.修改makefile 文件,并使用"nmake - fmakefile all"命令进行编译
CFLAGS= -I$(SYBASE)OCS-12_5include -I$(TUXDIR)include
RM= SYBASE_XA_SERVER
TMS= tms_simprpc
all: simprpc simpsrv
clean:
rm -f *.o simprpc simpsrv $(TMS)
.SUFFIXES: .c .o
.c.o:
$(CC) $(CFLAGS) -c $*.c
simpsrv: simpsrv.o
set CFLAGS=$(CFLAGS);
$(TUXDIR)binbuildserver -s SIMPSRV -o simpsrv - f simpsrv.c -r
$(RM)
$(TUXDIR)binbuildtms -o $(TMS) -r $(RM)
simprpc: simprpc.o
set CFLAGS=$(CFLAGS);
$(TUXDIR)binbuildclient -o simprpc - f simprpc.c
5.修改simpsrv.c 文件
if (cs_ctx_global(CS_VERSION_125, &ctx) != CS_SUCCEED)
return (NULL);
注意版本信息:CS_VERSION_125
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
3.9 关于安装WEB GUI 的问题?
在登录这个gui 模式的TUXEDO 管理器的时候,是会遇到一些问题,因为大
部分人在安装的时候可能把这步的用户名和密码给省略了,这样造成了后面的问
题,比如在安装的时候,是以两个空为代价装完之后,在配置tuxedo 的管理控
制台,就有可能在login 这步卡住,其实解决这个问题是很简单的,你可以打开
tlisten.pw 文件在第一行写入你的用户名,然后回车(记得回车呀)在写入密码,
就可以了,然后在你的login 中输入就可以轻松的进入控制台的界面了,因为
tlisten.pw 里面是明码的,所以写入就可以了,在6。5 上成功。在别的版本中
administrator/anypass 是用户名和密码,但是在6。5 好象不能成功的。
3.10 ATMI 的C++编程问题
在TUXEDO 中是可以使用C++的,因为用C/C++关键是你的编译器,而不
是TUXEDO,在编程方面,TUXEDO 只是提供了函数库和一些数据结构而已。另
外用C++要小心TUXEDO 中间的tpreturn函数采用了longjmp 的远程goto 方式,
所以导致在tpreturn 之前申明的栈上的对象无法自动析构,存在memory leak
的危险!
3.11 有关SECURITY的问题?
你可以在程序中用tpchkauth() 取得授权信息,检查授权,再根据返回值设置用
户名及口令。用户名和口令应放入 TPINIT 类型的数据中。此类型在使用时也
要分配内存空间。
SECURITY 的组是用tpgrpadd 命令加入的,用户是用tpusradd 加入的,ACL 是
用tpacladd 加入的。这样在APPDIR 下tuxedo 自动产生tpgrp 和tpusr、tpacl 文
件来保存相关的密码和帐户。你说的用tmadmin 加入,
我没有试过。你可以看看tuxedo 的security 相关文档了解一下。
tpinit 中的passwd 是指tmloadcf 时候输入的密码,username 是指tpusradd 时候的
user name,data 是指tpusradd 时提示输入的密码。
3.12 用什么方法可以看到我创好的用户和组呢?
web-gui 管理界面中有有关 ACL 组及用户的设置信息。
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
3.13 如何把FML 的描述文件编译成DLL 文件,包含在如
VB 或POWERBUILDER 中的客户端进行调用?
第一种方式:
把头文件中的定义改成PB 中的变量声明即可
你可以参照如下定义:
#define ACCOUNT_ID ((Fldid)8302) /* 110 is long*/
在PB 中:
long ACCOUNT_ID = 8302
第二种方式:
1。制作dll,把fml table 的内容制作到dll 中,调用。
3.14 在编译TUXEDO 客户端,出现无法定位输入点
xxxx.dll 是不是编写的DLL 程序有问题?
可以在程序中直接把___dllexport 加上就可以。
3.15 TUXEDO LICENSE 的说明资料
BEA公司对TUXEDO 中间件的使用许可(License)控制的是同时与TUXEDO
服务器连接的并发客户端的数量,即每秒种同时用tpinit()连接到TUXEDO 服务
器调用服务做交易的客户端数目。需要说明的常见问题有几点:
l Tuxedo License 数目与后台的应用有多少个服务无关,Tuxedo 只控制用户数,
不控制应用服务的数目和类型。
l Tuxedo License 数目与后台的应用服务器主机的数目、型号、性能高低无关。
用户升级主机无须更换License
l Tuxedo License 中的并发用户License 主要根据应用的并发交易量来确定,此处
“交易”的概念是业务角度的交易,即指客户端发起的业务交易,而不是指后台
运行的服务程序。一个交易包含客户端程序的一次服务器连接过程所调用的所有
服务。比如用户的一次联机缴费交易,可能包括运行多个后台服务程序。
l Tuxedo License 中的并发用户License 与总的终端连接数无直接关系,对于常见
的应用模型,BEA 可以提供一些仅供参考的并发百分比经验值,比如某类应用
一般的并发用户率为30%-35%。
一般来说,一个基于TUXEDO 的三层应用所需要的TUXEDO Licenses 数目主要
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
取决于以下几个因素:
业务量大小,既用户在单位时间内预期的行为次数。
业务模型,包括影响业务量变化的因素和各种业务的组成模型。
高峰时的业务量放大因子、系统配置富裕量因子。
若干年内用户数增长百分比和系统功能扩展的因素。
3.16 PowerBuilder 中声明、调用tuxedo 方法例子
声明例子:
Function Integer tpinit (Long TPINFO ) LIBRARY "wtuxws32.dll"
Function Integer tpterm () LIBRARY "wtuxws32.dll"
Function Integer tpcall (String SVCNAME , Long IDATA , Long ILEN, ref Long
ODATA ,ref Long OLEN , Long flags ) LIBRARY "wtuxws32.dll"
Function Integer tpacall (String SVCNAME , Long IDATA , Long
ILEN , Long flags ) LIBRARY "wtuxws32.dll"
Function Long tpalloc (String BUFTYPE , String SUBTYPE , Long
BUFSIZE ) LIBRARY "wtuxws32.dll"
Function Long tprealloc (Long buffer , Long BUFSIZE ) LIBRARY
"wtuxws32.dll"
Subroutine tpfree (Long buffer ) LIBRARY "wtuxws32.dll"
Function integer gettperrno() library "wtuxws32.dll"
Function integer getFerror() library "wtuxws32.dll"
Function Integer Fchg32( Long RCVBUF,long FLDID,long OCC,ref String value,ref
long LEN ) LIBRARY "wtuxws32.dll"
Function integer Fget32( Long RCVBUF,long FLDID,long OCC,ref String value,ref
long LEN) library"wtuxws32.dll"
Function integer Foccur32( Long fbfr,long FLDID) library"wtuxws32.dll"
程序中调用tuxedo 例子:
tpinfo=tpalloc("TPINIT","",240)
tpalloc (String BUFTYPE , String SUBTYPE , Long BUFSIZE )
ret = tpinit(0)
if ret<0 then
ret=gettperrno( )
messagebox('信息提示','tpinit error')
else
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
reqbuf = tpalloc("FML32", "", 65535)
Fchg32(reqbuf,iv_gh_code,0,gv_gh,gh_len)//Fchg32( Long RCVBUF,long
FLDID,long OCC,ref String value,ref long LEN )
Fchg32(reqbuf,iv_fhy_code,0,gv_gh,fh_len)
Fchg32(reqbuf,iv_tx_code,0,gv_tx,gv_tx_len)
ret= tpcall("ADP_MILK",reqbuf,my_len,reqbuf,my_len,0)
if (ret<0) then
ret=gettperrno( )
retstr="tpcall:"+ tpstrerror(ret)
messagebox('信息提示',retstr)
else
my_len=0
Fget32(reqbuf,iv_zhye_code,0,ls_zhye,my_len)
Fget32(reqbuf,iv_cwbm_code,0,is_error_code,my_len)
end if
tpfree(reqbuf)
ret=tpterm()
end if
end if
3.17 pb 与tuxedo 函数说明
Function Integer Fchg32( Long RCVBUF,long FLDID,long OCC,ref String
value,ref long LEN ) LIBRARY “wtuxws32.dll“
Fchg32 函数说明:
Long RCVBUF:你使用tpalloc 申请的buffer
long FLDID:你要传输到后台的字段id
long OCC:FLDID 的occ 值.就是往buffer 中放FLDID 的次数
ref String value:FLDID 的值
ref long LEN :value 的长度
LIBRARY “wtuxws32.dll“ : 表示引用的动态库
例子:Fchg32(SndBuf ,NAME ,0,"bea",0)
Function integer Fget32( Long RCVBUF,long FLDID,long OCC,ref String value,ref
long LEN) library“wtuxws32.dll“
Fget32 函数说明:
同Fchg32 函数说明。
3.18 pb 与tuxedo 的FML 函数Fchg 参数解释
我的例子是把bea 的value 放到NAME的字段buffer 中。长度我设置的为0。
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
因为carray 类型需要指定具体的长度,FML 的buffer 类型可以不指定字段的具
体长度,可以使用统一使用0 长度。这些你可以读读有关Fchg 函数的online book
说明。在 http://edocs.bea.com 中有。
fadd32 是往buffer 中增加,occ 值依次累加,不能更改已经有的occ 的value,
但是fchg 函数却可以。通过occ 来控制。
3.19 BCB 开发Tuxedo 客户端配置详解!!
大家知道很多编程语言都可以开发Tuxedo 客户端;Delphi,PB,Vc,BCB
等等。
今天就将用BCB 开发Tuxedo 客户端的心得体会写出来,与大家共同探讨。
机器配置:win2k、Tuxedo7.1、BCB6.0;
通常要做以下5 步:
1、把%TuxedoDir%/bin 目录下的wtuxws32.dll 用BCB 自带的implib 生成
wtuxws32.lib;
方法是implib wtuxws32.lib wtuxws32.dll,这样就生成了符合BCB 的链接库
wtuxws32.lib。
2、把这个wtuxws32.lib 加到BCB的project 中(Project --> Add to Project) 。
3、在实现单元(如unit1.cpp)中要#include "atmi.h",当然你必须在project->option->
directories/conditional->include path 中加入%TuxedoDir%/inlude 这个目录。
4、在调用Tpinit 之前,必须加两条语句:tuxputenv("WSWADDR=//ip:端口");
tuxputenv("WSENVFILE=");
5、很关键,必须在服务器端的Tuxconfig 文件中的SERVICES 节点后加入:
WSL SRVGRP=GROUP1 SRVID=10 CLOPT="-t -- -n //192.168.0.236:6677"
(注:192.168.0.236 是服务器断的ip 地址,6677 是端口号);其次要在MACHINE
节点后面加入
MAXWSCLIENTS =5 ,可以不是5,但一定要非0;这一步很重要,否则客
户端始终连接不了服务器的应用。
如果不成功,可以察看C:/根目录下的ULOG.XXXX,里面会有详细的出错信息。
下面贴一段我用BCB 改造的SimpApp:
#include <vcl.h>
#pragma hdrstop
#include "atmi.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ char *sendbuf, *rcvbuf;
long sendlen, rcvlen;
int ret;
tuxputenv("WSNADDR=//192.168.0.235:6677");
tuxputenv("WSENVFILE=");
if (tpinit(NULL)==-1)
{
Panel1->Caption = "error";
}
else
{
Panel1->Caption = "ok";
sendlen = LabeledEdit1->Text.Length();
if((sendbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL)
{
ShowMessage("分配发送存贮空间失败!!") ;
tpterm();
}
if((rcvbuf = (char *) tpalloc("STRING", NULL, sendlen+1)) == NULL)
{
ShowMessage("分配接受存贮空间失败!!") ;
tpfree(sendbuf);
tpterm();
}
StrCopy(sendbuf,(LabeledEdit1->Text).c_str());
ret = tpcall("TOUPPER", sendbuf, 0, &rcvbuf, &rcvlen, 0);
if (ret == -1)
{ ShowMessage("调用服务失败");
tpfree(sendbuf);
tpfree(rcvbuf);
tpterm();
Abort();
}
LabeledEdit2->Text = StrPas(rcvbuf);
tpfree(sendbuf);
tpfree(rcvbuf);
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
tpterm();
}
}
希望对大家有帮助!! --------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//------
3.20 tuxedo6.5 和weblogic7.0 通过wtc 互联
昨天自己想试一下wtc,发现网上没有很好的文档,只有徐春金的一个,是
针对weblogic6.0 的,和weblogic7.0 的配置区别还是挺大的,就写了写
版主,这个文章放在这可以吗?如果不行就删掉吧
TUXEDO6.5 与WEBLOGIC7.0 通过WTC 进行互连的配置
WEBLOGIC 与TUXEDO 的互连有两种方式, 通过JOLT 或通过
WTC(WEBLOGIC TUXEDO CONNECTOR)。它们都是BEA 公司的产品,WTC
不仅能让
WEBLOGIC 调用TUXEDO 中的SERVICE,而且能让TUXEDO 调用WEBLOGIC
中的EJB。
一、WTC 配置说明:
TUXEDO 与WEBLOGIC 之间通过DOMAIN 方式实现互相调用,在这个例子
中有两个DOMAIN:TUXEDO 所在的DOMAIN 名为TDOM1, WEBLOGIC 所
在的
DOMAIN 名为TDOM2。TDOM1 上有TOUPPER 它是一个TUXEDO
SERVEICE,TDOM2 上有TOLOWER 它是一个EJB,
下面以WTC 安装带的例子simpapp( 在WTC 安装目录的
samples/server/src/examples/wtc/atmi/simpapp 下)说明配置过程:
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
TUXEO 版本: TUXEDO65
WEBLOGIC 版本: WEBLOGIC7.0
TUXEO 安装目录: D:/TUXEDO
WEBLOGIC 安装目录: D:/bea
操作系统: WIN2000
例子目录: E:/tuxedo-test(把samples/server/src/examples/wtc/atmi/simpapp 目录
COPY 到E:/tuxedo-test)
服务器名: localhost
二、TUXEDO 要做的配置
(1)首先确保你的PATH 环境变量已经包含了你的C 的编译器路径,如果没有
可以使用set 来设置。
(2)把samples/server/src/examples/wtc/atmi/simpapp 目录COPY 到E:/tuxedo-test
(3)进入到E:/tuxedo-test 路径,修改setEnv.cmd 文件:
set TUXDIR=D:/TUXEDO
set WSNADDR=//localhost:17000
set APPDIR=E:/tuxedo-test
set PATH=%TUXDIR%/bin;%APPDIR%;%PATH%
set TUXCONFIG=%APPDIR%/tuxconfig
运行该文件,使环境变量生效。最好能够逐个检查一下,因为在UNIX 系统上有
时候会设置不上。如果环境变量都生效了,就可以进行
下一步了
建议大家在真正做的时候把这些环境变量加到:windows 放到系统的环境变量
中;如果是UNIX 加入到该用户的.profile 文件中,这样
在你下次进入的时候环境变量就已经正确设置了。
(4) 编译客户端和服务端程序:
buildclient -o simpcl - f simpcl.c
buildserver -o simpserv - f simpserv.c -s TOUPPER
这个编译应该不会有什么问题,只要环境变量设置正确
(5)从samples/server/src/examples/wtc/atmi/simpapp 路径拷贝ubbdomain 和
dom1config 文件到E:/tuxedo-test
(6)从samples/server/src/examples/wtc/atmi/simpserv 路径拷贝tolower.c 文件到
E:/tuxedo-test
(7)修改ubbdomain 文件,主要是<braced> 部分,例子如下:
APPDIR="E:/tuxedo-test"
TUXCONFIG="E:/tuxedo-test/tuxconfig"
TUXDIR="D:/TUXEDO"
(8)编译ubbdomain :
tmloadcf -y ubbdomain
(9)修改dom1config 文件如下:
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
*DM_RESOURCES
VERSION=U22
*DM_LOCAL_DOMAINS
TDOM1 GWGRP=GROUP2
TYPE=TDOMAIN
DOMAINID="TDOM1"
*DM_REMOTE_DOMAINS
TDOM2 TYPE=TDOMAIN
DOMAINID="TDOM2"
*DM_TDOMAIN
TDOM1 NWADDR="//localhost:18000"
TDOM2 NWADDR="//localhost:18001"
*DM_REMOTE_SERVICES
TOLOWER RDOM="TDOM2"
(10)编译dom1config:
set BDMCONFIG=E:/tuxedo-test/bdmconfig
dmloadcf -y dom1config
注意在编译前增加环境变量BDMCONFIG,最好也是像前面的环境变量一样加
到系统环境变量或者.profile 文件中
(11)编译tolower 文件:
buildclient -v -f tolower.c -o tolower
此处编译可能会出错,原因是tolower.c 文件中一个注释写反了,修改后应该可
以编译
(12)启动server:
tmboot -y
(13)此时可以验证一下系统启动的情况,使用tmadmin-->psc,应该可以看到
启动的如下service:
DMADM, GWADM 和 GWTDOMAIN
TOUPPER---->simpserv 提供的
TOLOWER---->GWTDOMAIN 提供的
如果上面的service 都正确的启动了,就可以作weblogic 的配置了.
三、WEBLOGIC 要做的配置:
(1) 启动WebLogic examplesServer , 可以从开始菜单启动, 或者直接运行
D:/bea/weblogic700/samples/server/config/
examples/setExamplesEnv.cmd, 然后运行
D:/bea/weblogic700/samples/server/config/examples/startExamplesServer.cmd
注意:1.确保没有WTCServer Mbeans 在这个server 上存在,否则会有问题.
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
2.在WebLogic 中增加一个用户TDOM1,如果没有增加,在运行tolower 的时候
后有如下错误:
Can't send request to service TOLOWER
Tperrno = 13
(2) 打开一个command 窗口, 进入到
D:/bea/weblogic700/samples/server/config/examples 路径下, 运行
setExamplesEnv.cmd
(3)编译wtc_toupper.jar :
ant
(4)修改setWTCMbeans 文件:
set wlsNWAddr=//localhost:18001
set tuxNWAddr=//localhost:18000
set interop
3.21 tuxedo 服务器端中是否可以写一个全局的对象或变
量,所有SERVICE 都可调用的?
TUXEDO 好像没有对象池之类的方法,因为它是用C/C++,所以很多是要自己
去实现的,没有java 应用服务的那么多方便的东东.我想共享定义可以分两种.
一是service 之间的共享.这个你可以把需要共享定义的service 放在同一个server
里面,然后在service 函数外面(比如头文件)声明一些对象或者简单变量等,可以实
现共享或者常驻内存.这个方法我们也在用.
二是多个server 之间的共享.毕竟我们不可能把很多不相关的service 都堆在一起,
实现上面的共享.关于这个我没有很方便有便宜的方法.我们自己封装了UNIX 下
的share memory 类可以实现进程间的共享,但没有实际用在TUXEDO 服务中,应
该是可以的.还有或者可以借助数据库实现吧.有好方法的朋友可以提出来讨论.
如果可以的话请详细说一下你为什么需要全局的定义,要共享的信息量大吗.
3.22 tuxedo 服务器端中是否可以写一个全局的对象或变
量,所有SERVICE 都可调用的?
我不清楚,在TUXEDO 里是否可捕获我的SERVICE 启动时的事件比如
onServiceStartup 事件以及onServiceShutdown 事件,这样的话,我就能做很多事
情无论是多个SERVICE 间共享还 是多个SERVER 间共享都容易得多。我之前
写过一个应用服务器架构
它支持多线程(线程池技术)、连接池(TUXEDO 现版本里没提供WEBLOGIC
里有)、提供对象池技术等
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
这些技术一起使得我的应用服务器具有足够的处理响应能力。
最近我还为它增加安全方面的内容,比如支持数据包加密(3DES),openssl 等
总之我想在TUXEDO 里也能提供这些东西。
我发现TUXEDO 这种把每个服务(函数)都暴露的方式不友好(个人观点)
当我的系统非常大的时间,我要暴露的东西实在太多了,无论在编程开发还是后
来维护上来说都不是件容易的事,当然TUXEDO 在这方面有自己的考虑。
我的做法是如果能通过某种方式来组织应用、代码、项目的话也许会更好些。
比如我会按面向对象的设计原理,所有业务逻辑显示为对象,而TUXEDO 里的
SERVICE 其实就是我的业务组件提供的方法(公布的)而已不是吗?
其实我要让客户端调用我的组件的服务(方法),至少可以有两种方式:
1.rpc
2.Request-response 方式
第一种就不要说了,第二种其实就是TUXEDO 里的同步方式对吗?,对于这种
方式的实现其实也有N 种之多(见仁见智),而TUXEDO 是把他要条用的方法
直接给出客户端,这样做性能上有所优势但却缺少了灵活性,在这里我的做法是
采用设计模式:cOMMAND,ABSTRACT FACTORY,ADAPTER 等模式就可
以设计得更有弹性,要说出设计可能要一大篇,说重点:其实就是TUXEDO 里
根本不用把每个业务组件的方法都做成TUXEDO 的方法,而是采用一个接收
SERVICE 就足够了,
这个SERVICE会根据客户端指定要调用的业务组件的服务(方法)动态地从对
象池里取得对象调用后把结构告诉客户端就行了,而在业务组件这块,我们的数
据库连接采用连接池技术,提高性能,减少数据库负载,对于并发的多用户环境
下我们采用线程池技术
以上是我的一点经验与看法,丘老大您看看
其实我也是刚结束TUXEDO,所以对于TUXEDO 还是很陌生的,,对于它什么
特性没不了解,比如在服务器端她支持对象编程吗?支持C++编程吗,支持STL
泛型编程吗,等等
3.23 tuxedo 服务器端中是否可以写一个全局的对象或变
量,所有SERVICE 都可调用的?
呵呵,hu 兄看来是高人啊.不要搞那些尊称了,很怕,而且我肯定比你小.
其实我仔细阅读了TUXEDO 的官方文档,发现它的内容比我想象的要丰富得多,
而且还在不断发展.用BEA President Alfred 的话说,"TUXEDO is alive and kicking".
而且我在看J2EE 的一些东西的时候发现不少借鉴了交易中间件的思想.这些是
题外话了.
你说的"onServiceStartup 事件以及onServiceShutdown 事件",TUXEDO 通过提供
tpsvrinit 和tpsvrdone 两个函数来实现,分别在启动和停止的时候被执行.你可以在
这个函数里面写你的代码,也可以不,利用这个可以做你说的很多事情.
TUXEDO 也可以应用第三方的安全机制,这个我没有研究,你看文档.
你说的暴露的问题,以及后面的问题,都是可以的.因为TUXEDO 是支持C++的,而
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
且我一直觉得这种支持不是刻意的支持,因为TUXEDO 服务在编译的时候也是
借助OS 的编译器,所以认为是比较自然的事情.OK,既然可以用C++,那就可以为
所欲为了,其它的支持就是自然的事情.确实如你所说,都放在service 里面不好.
所以你可以把很多的实现放在外面的类里面,然后在service里面调用,这样就可以
利用面向对象的很多好处了.比如模块的重用,我们在这方面走出了很好的一步,
也可以说得到了好处.但是还是在进一步的摸索中.
关于数据库连接的问题,前面专门讨论过,特别是关于性能,不才还写了个帖子在
精华区里,你可以看一下
3.24 关于使用XA 时数据库的连接数的问题
前面有几个帖子讨论到使用XA 时的数据库连接数问题,当server 数目增多的
时候,这个问题就开始凸现出来,为此,我自己做了一下相关的验证.现在告知一下
我的结果.
假设我的TMS 的数目是m 个,所有用到XA 的server 数(直接启多份或者MSSQ
都相当于多个server)为n.首先数据库会有m 个连接.这个基本是固定的,是
TMSCOUNT 的数目.关键是server 增加的连接数问题,主要是看你在哪里做连接.
大致有两种.一是在tpsvrinit 中连接,伪码如下:
...
tpsvrinit(int argc, char *argv[])
{
tpopen();
return(0);
}
tpsvrdone(void)
{
tpclose();
}
MYSERVICE(TPSVCINFO *rqst)
{
//service code with sql
tpreturn(...);
}
因为tpsvrinit 是在server 启动的时候被执行的,所以server 一启动之后,就建立了
和数据库的连接,数据库这边看到的连接-->程序就是你的server 名.所以有m+n
个连接.然后在server 的生存期里这个连接一直保持,知道server 被tmshutdown 时
执行tpsvrdone 函数才会断开.
第二种就是把连接放在服务函数中.
tpsvrinit(int argc, char *argv[])
{
return(0);
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
}
tpsvrdone(void)
{
}
MYSERVICE(TPSVCINFO *rqst)
{
tpopen();
//service code with sql
tpclose();
tpreturn(...);
}
这样就只有m 个连接,service 每次被调用的时候取一个连接来用.
有一个问题要注意的是如果tpopen之后没有tpclose 可能会增加连接.知道这个原
因之后大家就可以更好的分析问题了,也可以根据你的需要来进行选择
3.25 如何在delphi 中进行tuxedo 函数的声明、调用?
unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button2: TButton;
Button3: TButton;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
Label8: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private-d 閏larations }
public
{ Public-d 閏larations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function tpinit (tpinfo : longint): integer;far;external 'wtuxws' name 'tpinit';
function tpterm : integer;far;external 'wtuxws' name 'tpterm';
procedure tpfree (ptr : pchar);far;external 'wtuxws' name 'tpfree';
function tpalloc (types : pChar; subtype : pchar; size : longint): pchar;far;external
'wtuxws' name 'tpalloc';
function tpcall
(svc:pChar;idata:pchar;ilen:longint;odata:pointer;olen:pointer;flags:longint):integer;fa
r;
external 'wtuxws' name 'tpcall';
procedure TForm1.Button1Click(Sender: TObject);
begin
Label8.caption:=IntToStr(TpInit(0));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Chaine : pChar;
TmpLg : Longint;
Ch : string;
pCh : pChar;
begin
Ch:='STRING';
pCh:=stralloc(80);
strPCopy(pCh,Ch);
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
Chaine:=TpAlloc(pCh,nil,80);
strpCopy(Chaine,Edit1.Text);
Ch:='SIMPUPPER';
strPCopy(pCh,Ch);
Label3.Caption:=intToStr(tpCall(pCh,Chaine,0,@Chaine,@TmpLg,0));
Edit2.Text:=StrPas(Chaine);
tpfree(Chaine);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Label6.Caption:=intToStr(Tpterm);
end;
end.
3.26 Delphi 开发客户端的问题请教
针对于/atmi/simpapp 下面的那个小程序,想用Delphi 实现客户端(取代
Simpcl.exe),但出现问题,我是这么做的:
1,弄到了Tuxedo32.pas(可能有点老,不过应该没关系吧,编译也没有出现问
题,dll 当然用的是现在Tuxedo8.1 的)。
2,把用Delphi 编写的程序放在F:/SimpDir(我是按照《Tuxedo8.1 安装终结篇》
中配置的)。
3,该程序的代码如下:
procedure TForm1.Button1Click(Sender: TObject);
const
SERVICE_NAME = 'TOUPPER';
MAX_PKG_LEN = 40;
var
Ans: Integer;
A, B: PChar;
Len: Longint;
begin
Ans:= TPInit(nil); //程序在这里就出错了,我靠
if Ans = -1 then
begin
ShowMessage('TUXEDO 初始化错误' );
Exit;
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
end;
A := TPAlloc('STRING', nil, MAX_PKG_LEN);
if A = nil then
begin
ShowMessage('TUXEDO 分配内存错误');
TPAbort(0);
Exit;
end;
B := TPAlloc('STRING', nil, MAX_PKG_LEN);
if B = nil then
begin
ShowMessage('TUXEDO 分配内存错误');
TPAbort(0);
Exit;
end;
A := 'hello,tuxedo';
Ans := TPCall(SERVICE_NAME, A, 0, @B, @Len, 0);
if Ans = -1 then
begin
ShowMessage('Error Occured!' + TPStrError(GetTPErrno));
TPFree(A);
TPFree(B);
TPTerm;
Exit;
end;
ShowMessage('The Returned is :' + B);
TPFree(A);
TPFree(B);
end;
4,程序编译顺利通过。
5,启动tmboot,顺利。
6,启动Simpcl.exe,能够成功。
7,启动project1,失败。单步调试,发现Ans:= TPInit(nil);返回值为-1。
很是困惑,我的程序就在Simpcl.exe 所在的目录中,不应该会出现这样的问题啊。
用Delphi 开发客户端的同志看看这个。这应该是最简单的Delphi 客户端程序了,
这个要是不行,开发数据库的我就更不行了.
xuq 说得对,实际开发中很多是俺逻辑来分的,一个小模块的几个服务放在
一个server 里,比如某个模块的查询,修改,新增在一个server 中,是很自然的。
你看一下你的8 个service 是怎样的情况。wsy 兄的建议也可以参考,如果硬件
好,当然多开些,但是用MSSQ 的时候启的server 份数也不是越多越好,一般
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
在2-12 直接吧,文档是成队列的开销增大。
3.27 如何使用tuxedo 开发大型软件系统?
这个问题问得好.TUXEDO 就是为大型应用开发准备的,打听一下价格你就知
道它不适合小的应用.另外它良好的性能和稳定性,以及可扩充的特别也很适合大
的应用.你说的是很常见的情况,关于FML 的头文件问题,不久前的一个帖子我们
有讨论到,你看一下,这里就不赘述了.首先,你要相信这些问题都是别人已经很好
的解决了的.我觉得只有写TUXEDO 应用的人需要很好的了解它,前端的根据接
口调用就可以了.如果对一些诸如FML 操作之类的封装很好的话,其实应用开发
的人都可以不了解TUXEDO.有一次我们组比较忙,就把一个demo 给报表组的同
事,他们就很快写出了需要的服务.你们前端用CB,那用TUXEDO 的DLL 就可以
了,并不需要很了解中间的处理过程.我觉得这也是中间件的一个特点,就是服务
对调用者变得透明,他不知道你的服务程序是什么(只知道SERVICE NAME),在哪
里(物理的),业务逻辑是怎么处理的,正是这样,它更适合大的团体的开发,我们现
在几十个人也运作得很好.呵呵,很粗略.
3.28 Tuxedo 在UNIX 下开发,需要看的书
关于UNIX C,推荐两本书吧,第一本当然是Richard Stevens 的《UNIX 环境
高级编程》,在公司里能搜出几十本,公认的好书。另外一本就是比较薄的《UNIX
进程间通信》,讲些UNIX 的进程机制,以及队列,信号量和共享内存等东西,
这些TUXEDO 全部用到了,尤其是队列用了很多,ipcs 看一下就知道了。看看
有助于理解一些东西
呵呵。至于移植,我想肯定是可以的,其实主要就是C/C++代码的移植,
TUXEDO 的api 本身也是C 的,这个你请教一下又C/C++代码移植经验的人吧,
3.29 启动XA,出现错误:xaorecover: xaofetch rtn -3
的解决方法
Starting TUXEDO fails
错误信息:
ORA-00942: table or view does not exist
xaorecover: xaofetch rtn -3
原因: The "SELECT" privilege must be given on the
DBA_PENDING_TRANSACTIONS VIEW to all applications using XA and the
MTS SERVICE.
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
Issue the following command as DBA :
GRANT SELECT ON DBA_PENDING_TRANSACTIONS TO PUBLIC;
4 RM 配置
4.1 怎样和sybase 数据库连接?
SYBASE 11 on aix:
SYBASE_XA_SERVER:sybase_xa_switch:-L/usr/sybase/lib -lxaserver –lct
-lcs -lcomn - ltcl –lintl
OPENINFO="SYBASE_XA_SERVER: -Utuxedo -Psybase –Nconnection1 -
L/usr/tuxedo/apps/simp1/xa.log -Tall"
winnt:
SYBASE_XA_SERVER;sybase_xa_switch;C:/SYBASE_SERVER/lib/libxasrvlib.lib
OPENINFO="SYBASE_XA_SERVER: -Uuserid1 -Ppassword1 -Nconnection2 -
Lxa_log -Tall"
4.2 RM 文件配置for Informix 7.2.3
#the RM is good for informix 723
INFORMIX-OnLine:infx_xa_switch: - lixsql - lixasf -lixgen - lixos - lixgls -lnsl_s
-lcrypt_i -lsocket -lm -lsuds - lx /informix/informix/lib/esql/checkapi.o
4.3 sybase 是基于WIN2000 的,怎么配制RM?
SYBASE 10 的:
SYBASE_XA_SERVER:sybase_xa_switch:-L/opt/sybase/lib -lxaserver -lct -
lcs -lcomn - ltcl - ltli –lintl
4.4 tuxedo 的数据库服务器为unix 上的oracle9i!客户机
用win2000 的9i 或8i 可以吗?
肯定没有问题。我现在服务器是AIX+Oracle9iServer,客户端是
WIN2K+Oracle9iClient.一点问题都没有。
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
4.5 tuxedo 与sybase 如何联结
1.首次安装ASE12.0 服务器时,需要进行软件资产管理,输入合法的licence ,
否则无法运行SYSAM,则SERVER 软件便不可用。在管理工具—〉服务中可以
查看SYSAM 是否正确运行。并最好首次安装时,就安装数据库服务。安装服务
器时,需要具有正确的DTM licence,否则无法使用DTM 功能,该licence 需要
单独向SYBASE 公司购买。
2.激活DTM 配置 sp_configure "enable DTM",1 并重启ASE,检查DTM 运行

3.配置RM 文件:
SYBASE_XA_SERVER;sybase_TUX_xa_switch;C:/sybase/OCS-12_0/lib/libxadtm.l
ib C:/sybase/OCS-12_0/lib/libcobct.lib C:/sybase/OCS-12_0/lib/libct.lib
C:/sybase/OCS-12_0/lib/libcs.lib 只要这些lib 就可以了,网上提供有些资料不准
确。
4.6 如何配置TUXEDO 与Oracle 的连接
proc 组件是在oracle 的服务器的安装中没有的,即使你全部安装了oracle 服
务器的组件也没有proc 组件,proc 组件是放在oracle 的客户端安装中的一个组
件,你可以在安装ORACLE 中点客户端安装,然后点定制安装就可以在安装的
列表中找到PROC 了,选中安装即可,然后在看你的ORACLE 目录中就可以找
到相应的文件了。
4.7 MP 启动注意问题
每台Application Server 必须先启动tlisten
要求$APPDIR/.adm/tlisten.pw 或者
$TUXDIR/udataobj/tlisten.pw
必须存在且可读
tlisten -d [device] –l nlsaddr –u uid/uid_name
4.8 防火墙+端口映射的配置问题和不安装客户端打包
在服务端的ubbconfig 中的WSL加入-H 参数。例如:
WSL = ... -n //inside IP:port -H //outside IP:port -p minPort -P MaxPort -m 5 -M
10 -x 10
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
1、 例如: WSL = ... -n //10.54.0.51:9001 -H //123.100.1.90:MMMM -p 9001 -P
9011 -m 5 -M 10 -x 6
不过需要在防火墙上至少开M 个端口。
2、不安装客户端直接打包了TUXEDO 的文件并配置环境变量,
但是,需要把$TUXDIR/local 目录下的message 文件给打包上。否则不能报告
正确的错误信息。提示什么:$TUXDIR=NULL 等错误信息。
3、直接用的动态库的函数,编译时没有什么-W 参数了.
这种情况,在制作动态库的时候已经暗示把-w 参数给使用了。因为你使用了ws
方式的lib 库或者ws 方式的dll 了。
4.9 RM 文件的构成(oracle 为例)
RM 文件包含所有的资源管理器的入口,它们被tuxedo 应用访问。RM 文件
在$TUXDIR/udataobj 目录下。每一个入口使用冒号分隔。
第一个字段是资源管理器的唯一名字。你可以使用任何指定的名字,通常启比
较被人容易理解的名字。
第二个字段是xa_switch_t 结构名字。Oracle 叫做 xaosw,oracle7 引用的是静
态注册。从oracle 后使用另外一个结构xaoswd 用来动态注册。(具体的查看the
Oracle8i Application Developer's Guide - Fundamentals 获得更多信息)
第三个字段是使用空格分隔的建立TM 所需要的lib 库文件列表。这些库文件
通过访问RM 文件建立tuxedo server 还是需要的。 一旦资源管理器入口正确
建立到该RM 文件中,就可以build 事务管理server 了。
RM 的例子如下:
如果你没有使用cobol,oracle 的RM 使用:
Oracle_XA:xaosw:-L${ORACLE_HOME}/lib -lclntsh
如果使用cobol:
Oracle_XA:xaosw:-L${ORACLE_HOME}/lib
${ORACLE_HOME}/precomp/lib/cobsqlintf.o - lclntsh
5 程序示例
5.1 会话程序示例(附调试通过原程序及配置文件)
5.1.1 会话server's demo source
#include <stdio.h>
#include <ctype.h>
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
#include <atmi.h> /* TUXEDO Header File */
#include <userlog.h> /* TUXEDO Header File */
#define SRECV 1
#define SSEND 2
#define SDONE 3
#ifdef __cplusplus
extern "C"
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
TOUPPER(TPSVCINFO *rqst)
#else
TOUPPER(rqst)
TPSVCINFO *rqst;
#endif
{
static state = SRECV;
long len,revent;
char *buf;
long i;
userlog("servic ----start -----/n");
if((buf = (char *) tpalloc("STRING", NULL, 1024)) == NULL)
{
(void) userlog("*******Error allocating send buffer");
}
userlog("server recv cd = %ld",rqst->cd);
i=0;
for( ; ;)
{
userlog("for i =[%d]",i);
switch(state)
{
case SRECV:
userlog("----1---[%s]/n",buf);
if (tprecv(rqst->cd,&buf,&len,0,&revent)==-1)
{
userlog("----2---[%s]/n",buf);
if(tperrno==TPEEVENT && revent==TPEV_SENDONLY)
{
userlog("*******state change from recerive to send");
state=SSEND;
}
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
else
{
tpfree(buf);
userlog("******server recerive error is %s:",revent);
tpreturn(TPFAIL,0,rqst->data,0,0);
}
}
userlog("----3--- %s /n",buf);
userlog("******server received message is %s", buf);
break;
case SSEND:
strcpy(buf,"all done & protocol complete");
if (tpsend(rqst->cd,buf,0,0,&revent)==-1)
{
userlog("*******tpsend:%s",revent,tpstrerror(tperrno));
}
else
{
userlog("*******SEND MESSAGE successfully");
}
state=SDONE;
break;
case SDONE:
tpfree(buf);
state=SRECV;
userlog("******convertional is done");
userlog("----4--- %s /n",buf);
tpreturn(TPSUCCESS,0,rqst->data,0,0);
break;
}
i++;
}
}
5.1.2 会话client's demo source
#include <stdio.h>
#include "atmi.h" /* TUXEDO Header File */
#if defined(__STDC__) || defined(__cplusplus)
main(int argc, char *argv[])
#else
main(argc, argv)
int argc;
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
char *argv[];
#endif
{
char *buf;
long len;
int ret,cd;
long revent;
int i;
if (tpinit((TPINIT *) NULL) == -1) {
(void) fprintf(stderr, "Tpinit failed/n");
exit(1);
}
printf("tpinit succ/n");
if((buf = (char *) tpalloc("STRING", NULL, 1024)) == NULL) {
(void) fprintf(stderr,"Error allocating send buffer/n");
tpterm();
exit(1);
}
if (cd = tpconnect("TOUPPER",NULL,0,TPSENDONLY)==-1)
{
printf("tpconnect():%s /n",tpstrerror(tperrno));
printf("tpconnect():ret=%d/n",tpconnect("TOUPPER",NULL,0,TPSENDONLY));
tpfree(buf);
tpterm();
exit(1);
}
(void) strcpy(buf,"tpsend wsy once");
if (tpsend(cd,buf,(long)strlen(buf),0,&revent)==-1)
{
printf("tpsend():%s/n",tpstrerror(tperrno));
if(tperrno==TPEEVENT && revent==TPEV_SVCFAIL)
{
printf("tpsend error /n");
tpfree(buf);
exit(1);
}
}
(void) strcpy(buf,"tpsend wsy second");
if (tpsend(cd,buf,(long)strlen(buf),0,&revent)==-1)
{
printf("tpsend():%s/n",tpstrerror(tperrno));
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
tpfree(buf);
exit(1);
}
if (tpsend(cd,NULL,0,TPRECVONLY,&revent)==-1)
{
printf("tpsend():%s/n",tpstrerror(tperrno));
tpfree(buf);
exit(1);
}
if (tprecv(cd,&buf,&len,0,&revent)==-1)
{
printf("tprecv():%s/n",tpstrerror(tperrno));
if(tperrno==TPEEVENT && revent==TPEV_SVCERR)
{
printf("abcdef is %s/n",revent);
tpfree(buf);
exit(1);
}
}
printf("client receiving is %s/n",buf);
tpdiscon(cd);
tpfree(buf);
tpterm();
return(0);
}
5.1.3 会话的ubbconfig 配置demo
*RESOURCES
IPCKEY 32904
DOMAINID simpapp
MASTER simple
MAXACCESSERS 10
MAXSERVERS 5
MAXSERVICES 10
MODEL SHM
LDBAL N
*MACHINES
DEFAULT:
APPDIR="d:/beademo/democon"
TUXCONFIG="d:/beademo/democon/tuxconfig"
TUXDIR="c:/tuxedo"
"WSY" LMID=simple
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
MAXCONV=2
*GROUPS
GROUP1
LMID=simple GRPNO=1 OPENINFO=NONE
*SERVERS
DEFAULT:
CLOPT="-A"
simpserv SRVGRP=GROUP1 SRVID=1 CONV=Y
*SERVICES
TOUPPER
5.2 TUXEDO6.5 连接操作ORACLE8i 的例子,FML32 格
式的
tpsvrinit(int argc, char *argv[])
{
int ret;
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR uid[20];
VARCHAR pwd[20];
/* char db_link_name[20]; */
EXEC SQL END DECLARE SECTION;
argc = argc;
argv = argv;
EXEC SQL WHENEVER SQLERROR DO sqlerr();
strcpy( uid.arr, "test" );
uid.len = strlen( uid.arr );
strcpy( pwd.arr, "test" );
pwd.len=strlen( pwd.arr );
/*
strcpy(dbstring.arr,"testhost");
dbstring.len=strlen(dbstring.arr);
EXEC SQL DECLARE db_link_name DATABASE;
*/
EXEC SQL CONNECT :uid IDENTIFIED BY :pwd ;/*AT db_link_name
using :dbstring;*/
userlog("connect->sqlcode= %d sqlerrmc=%
s/n",sqlca.sqlcode ,sqlca.sqlerrm.sqlerrmc);
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
if (sqlca.sqlcode == 0)
userlog("server ->tpsvrinit:the EXEC SQL CONNECT
to database success!");
return (0);
}
5.3 Tuxedo 中不采用XA 连接oracle 数据库的例子
int tpsvrinit(int argc,char** argv)
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR username[20];
VARCHAR password[20];
EXEC SQL END DECLARE SECTION;
strcpy(username.arr,"scott");
username.len = strlne(username.arr);
strcpy(password.arr,"tiger");
password.len = strlen(password.arr);
EXEC SQL WHENEVER SQLERROR GOTO sqlerror;
EXEC SQL CONNECT :username IDENTIFIED BY :password /* AT abc
USING :dbstring (if use dblink use it)*/;
sqlerror:
EXEC SQL WHENEVER SQLERROR CONTINUE;
userlog("tpsvrinit connect db sqlcode=[%d] err=[%
s]",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
return(0);
}
void tpsvrdone()
{
EXEC SQL COMMIT WORK RELEASE;
if(sqlca.sqlcode)
userlog( " Close database failed sqlcode=[%d]",sqlca.sqlcode);
else
userlog( "tpsvrdone(): Shutdown server successful!" );
}
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
5.4 delphi 中调用tuxedo 的简单demo
procedure TForm1.Button1Click(Sender: TObject);
LongInt ): Pointer; stdcall;
var
SndBuf : PTFbfr;
RcvBuf :PTFbfr;
ret :integer;
lBillCount :longint;
fRecNum :single;
fDeposit:single;
lNumLong:longint;
BILLCOUNT,RECNUM,DEPOSIT,NUMLONG :FLDIDD32;
SvcName:array[1..20] of char;
Ilen: LongInt;
Olen: PLongInt;
lFlag :longint;
Tpinfo: PTTpinit;
begin
tuxputenv('WSNADDR=//wsy:6060');
Tpinfo :=nil;
ret := tpinit(Tpinfo);
if (ret < 0) then
begin
application.MessageBox(pchar(inttostr(ret)),'tpinit error',MB_OK);
application.MessageBox(pchar (inttostr(gettperrno)),'tpinit error',MB_OK);
end;
SndBuf := tpalloc('FML32',nil,1024);
if (SndBuf = nil) then
begin
application.MessageBox('','error in tpalloc SndBuf',MB_OK);
tpterm();
exit;
end;
RcvBuf := tpalloc('FML32',nil,1024);
if (RcvBuf = nil) then
begin
application.MessageBox('','error in tpalloc RcvBuf',MB_OK);
tpfree(pchar(Sndbuf));
tpterm();
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
exit;
end;
BILLCOUNT :=33556580;
lBillCount := 1680;
Value: Pointer; Len: FLDLEN32 ): Integer; stdcall;
ret :=Fchg32(SndBuf,BILLCOUNT,0,@lBillCount,0);
if (ret < 0) then
begin
application.MessageBox('Fchg32 long error','Fchg32 long error',MB_OK);
tpfree(pchar(SndBuf));
tpfree(pchar(RcvBuf));
tpterm();
exit;
end;
RECNUM := 100665536;
fRecNum := 60.96;
ret :=Fchg32(SndBuf,RECNUM,0,@fRecNum,0);
if (ret < 0) then
begin
application.MessageBox('Fchg32 long error','Fchg32 double RECNUM
error',MB_OK);
tpfree(pchar(Sndbuf));
tpfree(pchar(RcvBuf));
tpterm();
exit;
end;
Ilen := 0;
Olen := 0;
lFlag :=0;
{
strcopy(@SvcName,pchar( 'FMLTMP'));
ret := tpcall (@SvcName,pchar(SndBuf),Ilen,@SndBuf,Olen,TPNOTRAN);
}
ret := tpcall ('FMLTMP',pchar(SndBuf),0,@SndBuf,0,0);
if (ret < 0) then
begin
application.MessageBox(pchar(inttostr(ret)),'tpcall error',MB_OK);
application.MessageBox(pchar (inttostr(gettperrno)),'tpcall error',MB_OK);
application.MessageBox(tpstrerror(gettperrno),'tpcall error',MB_OK);
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
tpfree(pchar(SndBuf));
tpfree(pchar(RcvBuf));
tpterm();
exit;
end;
DEPOSIT := 100665348;
ret := Fget32(SndBuf,DEPOSIT,0,@fDeposit,0);
if (ret < 0) then
begin
application.MessageBox(pchar(inttostr(ret)),'Fget32 float DEPOSIT
error',MB_OK);
application.MessageBox(pchar (inttostr(gettperrno)),'Fget32 float
DEPOSIT error',MB_OK);
application.MessageBox(tpstrerror(gettperrno),'Fget32 float DEPOSIT
error',MB_OK);
tpfree(pchar(SndBuf));
tpfree(pchar(RcvBuf));
tpterm();
exit;
end;
application.MessageBox(pchar(floattostr(fDeposit)),'Fget32 float DEPOSIT
value ',MB_OK);
NUMLONG := 33556847;
ret := Fget32(SndBuf,NUMLONG,0,@lNumLong,0);
if (ret < 0) then
begin
application.MessageBox(pchar(inttostr(ret)),'Fget32 long NUMLONG
error',MB_OK);
application.MessageBox(pchar (inttostr(gettperrno)),'Fget32 long
NUMLONG error',MB_OK);
application.MessageBox(tpstrerror(gettperrno),'Fget32 long NUMLONG
error',MB_OK);
tpfree(pchar(SndBuf));
tpfree
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
5.5 power builder 中解决float,long 等类型demo
int iRet=0 ;
string str;
iRet = TuxInit(2);
MessageBox ("tuxinit ret val" ,string(iRet) )
str = '101011.98'
iRet = TuxSetFld32(100665536,str,2,0,0)
MessageBox ("RECNUM float ret val" ,string(iRet)+"|"+str )
str = '8981'
iRet = TuxSetFld32(33556580,str,1,0,0)
MessageBox ("BILLCOUNT long ret val" ,string(iRet)+"|"+str )
if (iRet < 0) then
MessageBox ("BILLOUT long ret val" ,string(iRet)+"|"+str )
end if
messagebox("begin tpcall","begin tpcall");
str = "FMLTMP"
iRet = TuxTpCall(str,0)
MessageBox ("TuxTpCall ret val" ,string(iRet))
if ( iRet < 0) then
MessageBox ("TuxTpCall ret val" ,string(iRet) )
end if
str=space(10)
iRet = TuxGetFld32(100665536,str,2,0)
messagebox("str--->aaaaaa",str)
MessageBox ("TuxGetFld32 RecNum float ret val" ,string(iRet)+"|"+str )
str=space(10)
iRet = TuxGetFld32(33556580,str,1,0)
MessageBox ("TuxGetFld32 BILLCOUNT long ret val" ,string(iRet)+"|"+str )
str=space(10)
iRet = TuxGetFld32(100665348,str,2,0)
MessageBox ("TuxGetFld32 DEPOSIT float ret val" ,string(iRet)+"|"+str )
str=space(10)
iRet = TuxGetFld32(33556847,str,1,0)
MessageBox ("TuxGetFld32 NUMLONG long ret val" ,string(iRet)+"|"+str )
iRet = TuxTpFree();
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
MessageBox ("TuxFree ret val" ,string(iRet) )
iRet = TuxTpTerm();
MessageBox ("TuxTpTerm ret val" ,string(iRet) )
5.6 关于TMS 和事务管理的问题
刚用TUXEDO 的时候在本机配置了XA,写了一个小server,试验通过了的。
可以参考一下,错误判断比较罗嗦,先可以跳过不看。当然用法也会不唯一,这
只是一种。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <atmi.h>
#include <userlog.h>
EXEC SQL INCLUDE oraca;
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE sqlda;
tpsvrinit(int argc, char *argv[])
{
argc = argc; argv = argv; /* Some compilers warn if argc and argv aren't used. */
userlog("Welcome to the gettime server");
/*open the RM*/
tpopen();
return(0);
}
void tpsvrdone(void)
{
userlog("leave the gettime server");
tpclose();
}
GETNAME(TPSVCINFO *rqst)
{
EXEC SQL BEGIN DECLARE SECTION;
char bank_id[10];
char bank_name[128+1] = "";
EXEC SQL END DECLARE SECTION;
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
userlog("Welcome to the gettime server 2");
strcpy(bank_id,rqst->data);
EXEC SQL SELECT bank_name
INTO :bank_name
FROM BANK
WHERE bank_id = :bank_id
and rownum = 1;
if (sqlca.sqlcode)
{
sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '/0';
userlog(">>>Oracle Error:%s/n", sqlca.sqlerrm.sqlerrmc);
strcpy(rqst->data, sqlca.sqlerrm.sqlerrmc);
tpreturn(TPFAIL, 0, rqst->data, 0,0);
}
if (sqlca.sqlcode == 1403)
{
sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '/0';
userlog("SELECT NOT FOUND:%s/n", sqlca.sqlerrm.sqlerrmc);
strcpy(rqst->data, "SQL NOT FOUND");
tpreturn(TPFAIL, 0, rqst->data, 0,0);
strcpy(rqst->data, bank_name);
tpreturn(TPSUCCESS, 0, rqst->data, 0, 0);
}
5.7 VIEW 的完整例子(附调试通过原程序及配置文件)
5.7.1 view server program ,not using XA
/*
view server program ,not using XA
*/
#include "stdio.h"
#include "atmi.h"
#include "fml32.h"
#include "userlog.h"
#include "emp.h"
EXEC SQL INCLUDE SQLCA;
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
#ifdef __cplusplus
extern C
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
VIEWORA(TPSVCINFO *rqst)
#else
VIEWORA(rqst)
TPSVCINFO *rqst;
#endif
{
struct emp *RcvBuf , *SndBuf;
EXEC SQL BEGIN DECLARE SECTION;
long lEmpNo;
VARCHAR sEname[20];
VARCHAR sDepartNo[20];
VARCHAR sHireDate[20];
VARCHAR username[20];
VARCHAR password[20];
EXEC SQL END DECLARE SECTION;
FILE *fp;
int i;
char sErrInfo[100];
strcpy(username.arr,"scott");
username.len = strlen(username.arr);
strcpy(password.arr,"tiger");
password.len = strlen(password.arr);
EXEC SQL CONNECT :username IDENTIFIED BY :password;
userlog("CONNECT sqlcode = [%d]",sqlca.sqlcode);
RcvBuf = (struct emp *)rqst->data;
SndBuf = (struct emp *)tpalloc("VIEW32","emp",1024);
lEmpNo = RcvBuf->empno;
userlog("RcvBuf->empno = [%ld]",lEmpNo);
EXEC SQL DECLARE cur_emp CURSOR FOR SELECT
LTRIM(RTRIM(ENAME)),
LTRIM(RTRIM(DEPTNO)),
LTRIM(RTRIM(TO_CHAR(HIREDATE,'YYYY-MM-DD HH24:MI:SS')))
FROM EMP
WHERE EMPNO = :lEmpNo;
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
userlog("declare cursor sqlcode = [%d]",sqlca.sqlcode);
EXEC SQL OPEN cur_emp ;
userlog("open sqlcode = [%d][%s]",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
i = 0;
while (1)
{
EXEC SQL WHENEVER SQLERROR goto err;
EXEC SQL FETCH cur_emp INTO :sEname,:sDepartNo,:sHireDate;
if (sqlca.sqlcode == 1403 ) break;
sEname.arr[sEname.len]='/0';
sDepartNo.arr[sDepartNo.len]='/0';
sHireDate.arr[sHireDate.len]='/0';
userlog("ENAME = [%s]",sEname.arr);
userlog("DEPARTNO = [%s]",sDepartNo.arr);
userlog("HIREDATE = [%s]",sHireDate.arr);
userlog("fetch sqlcode = [%d]",sqlca.sqlcode);
strcpy(SndBuf->ename , sEname.arr);
strcpy(SndBuf->departno , sDepartNo.arr);
strcpy(SndBuf->hiredate , sHireDate.arr);
i++;
}
EXEC SQL CLOSE cur_emp;
userlog("FML SERVER SUCCESS!!!!");
tpfree((char *)RcvBuf);
tpreturn(TPSUCCESS, 0, (char *)SndBuf, 0L, 0);
err:
userlog("fail sqlcode = [%d]",sqlca.sqlcode);
userlog("FML SERVER FAIL!!!!");
tpfree((char *)RcvBuf);
tpreturn(TPFAIL, 0, (char *)SndBuf, 0L, 0);
}
5.7.2 View client 端程序
/*
View client 端程序.
*/
#include "stdio.h"
#include "atmi.h"
#include "fml32.h"
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
#include "userlog.h"
#include "emp.h"
main()
{
struct emp *RcvBuf;
struct emp *SndBuf;
int iRet;
long len,lEmpNo,lErrInfoOcc;
char sEname[20];
char sDepartNo[20];
char sHireDate[20];
char sErrInfo[100];
if (tpinit((TPINIT *) NULL) == -1) {
printf("Tpinit failed/n");
exit(1);
}
SndBuf = (struct emp *)tpalloc("VIEW32", "emp", sizeof(struct emp));
if (SndBuf == (struct emp *)NULL)
{
printf("tpalloc view32 sndbuf buffer error tpstrerror=[%s]/n",tpstrerror(tperrno));
tpterm();
return -1;
}
printf("1 /n");
RcvBuf = (struct emp *)tpalloc("VIEW32", "emp", sizeof(struct emp));
if (RcvBuf == (struct emp *)NULL)
{
printf("tpalloc view32 rcvbuf buffer error/n");
tpfree((char *)SndBuf);
tpterm();
return -2;
}
printf("Please input number EMPNO(eg:7566,7900,etc.):");
scanf("%d",&lEmpNo);
printf("lEmpNo = [%ld]/n",lEmpNo);
SndBuf->empno = lEmpNo;
printf("SndBuf->lEmpNo = [%ld]/n",lEmpNo);
printf("begin tpcall FMLVIEWORA/n");
iRet = tpcall("VIEWORA",(char *)SndBuf,0L,(char **)&RcvBuf,(long *)&len,0L);
if (iRet == -1)
{
fprintf(stdout, "tpcall server tperrno = %d, %s/n",tperrno, tpstrerror(tperrno));
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
tpfree((char *)SndBuf);
tpfree((char *)RcvBuf);
tpterm();
return -2;
}
printf("ENAME=[%s]/n",RcvBuf->ename);
printf("DEPARTNO=[%s]/n",RcvBuf->departno);
printf("HIREDATE=[%s]/n",RcvBuf->hiredate);
tpfree((char *)RcvBuf);
tpfree((char *)SndBuf);
tpterm();
return 0;
}
5.8 FML 的完整例子(附调试通过原程序及配置文件)
5.8.1 FML 服务端程序,没使用XA
/*
FML 服务端程序,没使用XA
*/
#include "stdio.h"
#include "atmi.h"
#include "fml32.h"
#include "userlog.h"
#include "emptbl.h"
EXEC SQL INCLUDE SQLCA;
#ifdef __cplusplus
extern C
#endif
void
#if defined(__STDC__) || defined(__cplusplus)
FMLVIEWORA(TPSVCINFO *rqst)
#else
FMLVIEWORA(rqst)
TPSVCINFO *rqst;
#endif
{
FBFR32 *RcvBuf , *SndBuf;
EXEC SQL BEGIN DECLARE SECTION;
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
long lEmpNo;
VARCHAR sEname[20];
VARCHAR sDepartNo[20];
VARCHAR sHireDate[20];
VARCHAR username[20];
VARCHAR password[20];
EXEC SQL END DECLARE SECTION;
FILE *fp;
int i;
char sErrInfo[100];
strcpy(username.arr,"scott");
username.len = strlen(username.arr);
strcpy(password.arr,"tiger");
password.len = strlen(password.arr);
EXEC SQL CONNECT :username IDENTIFIED BY :password;
userlog("CONNECT sqlcode = [%d]",sqlca.sqlcode);
RcvBuf = (FBFR32 *)rqst->data;
SndBuf = (FBFR32*)tpalloc("FML32",NULL,1024);
Fget32(RcvBuf,EMPNO,0,(char *)&lEmpNo,0);
userlog("Fget32 from client EMPNO = [%ld]",lEmpNo);
EXEC SQL DECLARE cur_emp CURSOR FOR SELECT
LTRIM(RTRIM(ENAME)),
LTRIM(RTRIM(DEPTNO)),
LTRIM(RTRIM(TO_CHAR(HIREDATE,'YYYY-MM-DD HH24:MI:SS')))
FROM EMP
WHERE EMPNO < :lEmpNo;
userlog("declare cursor sqlcode = [%d]",sqlca.sqlcode);
EXEC SQL OPEN cur_emp ;
userlog("open sqlcode = [%d][%s]",sqlca.sqlcode,sqlca.sqlerrm.sqlerrmc);
i = 0;
while (1)
{
EXEC SQL WHENEVER SQLERROR goto err;
EXEC SQL FETCH cur_emp INTO :sEname,:sDepartNo,:sHireDate;
userlog("fetch sqlcode = [%d]",sqlca.sqlcode);
if (sqlca.sqlcode == 1403 ) break;
sEname.arr[sEna me.len]='/0';
sDepartNo.arr[sDepartNo.len]='/0';
sHireDate.arr[sHireDate.len]='/0';
Fchg32(SndBuf,ENAME,i,(char *)sEname.arr,(FLDLEN32)0);
Fchg32(SndBuf,DEPARTNO,i,(char *)sDepartNo.arr,(FLDLEN32)0);
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
Fchg32(SndBuf,HIREDATE,i,(char *)sHireDate.arr,(FLDLEN32)0);
userlog("ENAME = [%s]",sEname.arr);
userlog("DEPARTNO = [%s]",sDepartNo.arr);
userlog("HIREDATE = [%s]",sHireDate.arr);
i++;
}
EXEC SQL CLOSE cur_emp;
userlog("FML SERVER SUCCESS!!!!");
tpfree((char *)RcvBuf);
tpreturn(TPSUCCESS, 0, (char *)SndBuf, 0L, 0);
err:
userlog("fail sqlcode = [%d]",sqlca.sqlcode);
userlog("FML SERVER FAIL!!!!");
tpfree((char *)RcvBuf);
memset(sErrInfo,0x00,strlen(sErrInfo));
strcpy(sErrInfo,"you input EMPNO Not exist,please input another empno again");
Fchg32(SndBuf,ERRINFO,i,(char *)sErrInfo,(FLDLEN32)0);
tpreturn(TPFAIL, 0, (char *)SndBuf, 0L, 0);
}
[sEname.len]='/0';
sDepartNo.arr[sDepartNo.len]='/0';
sHireDate.arr[sHireDate.len]='/0';
Fchg32(SndBuf,ENAME,i,(char *)sEname.arr,(FLDLEN32)0);
Fchg32(SndBuf,DEPARTNO,i,(char *)sDepartNo.arr,(FLDLEN32)0);
Fchg32(SndBuf,HIREDATE,i,(char *)sHireDate.arr,(FLDLEN32)0);
userlog("ENAME = [%s]",sEname.arr);
userlog("DEPARTNO = [%s]",sDepartNo.arr);
userlog("HIREDATE = [%s]",sHireDate.arr);
i++;
}
EXEC SQL CLOSE cur_emp;
userlog("FML SERVER SUCCESS!!!!");
tpfree((char *)RcvBuf);
tpreturn(TPSUCCESS, 0, (ch
5.8.2 FML client program
*/
#include "stdio.h"
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
#include "atmi.h"
#include "fml32.h"
#include "userlog.h"
#include "emptbl.h"
main()
{
FBFR32 *RcvBuf,*SndBuf;
int iRet,i;
long len,lEmpNo,lOcc;
char sEname[20];
char sDepartNo[20];
char sHireDate[20];
char sErrInfo[100];
SndBuf = (FBFR32 *)tpalloc("FML32", NULL, 1024);
if (SndBuf == NULL)
{
fprintf(stdout,"tpalloc sndbuf error errno=[%d] err=[%s]/n",tpstrerror(tperrno));
tpterm();
return -1;
}
RcvBuf = (FBFR32 *)tpalloc("FML32", NULL, 1024);
if (RcvBuf == NULL)
{
fprintf(stdout,"tpalloc rcvbuf error errno=[%d] err=[%s]/n",tpstrerror(tperrno));
tpfree((char *)SndBuf);
tpterm();
return -2;
}
printf("Please input number EMPNO(eg:7566,7900,etc.):");
scanf("%d",&lEmpNo);
printf("lEmpNo = [%ld]/n",lEmpNo);
iRet = Fchg32(SndBuf,EMPNO,0,(char *)&lEmpNo,(FLDLEN32)0);
if (iRet <0)
{
fprintf(stdout,"client->Fchg(EMPNO) error/n");
tpfree((char *)SndBuf);
tpfree((char *)RcvBuf);
tpterm();
return -2;
}
Fprint32(SndBuf);
printf("begin tpcall FMLVIEWORA/n");
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
iRet = tpcall("FMLVIEWORA",(char *)SndBuf,0L,(char **)&RcvBuf,(long
*)&len,0L);
if (iRet == -1)
{
fprintf(stdout, "tpcall server tperrno = %d, %s/n",tperrno, tpstrerror(tperrno));
tpfree((cha r *)SndBuf);
tpfree((char *)RcvBuf);
tpterm();
return -2;
}
lOcc=Foccur32(RcvBuf,ENAME);
Fprint32(RcvBuf);
for (i=0;i<lOcc ;i++ )
{
iRet = Fget32(RcvBuf, ENAME, i, (char *)sEname, 0);
if (iRet <0)
{
fprintf(stdout,"srv->Fget(ENAME) errno=[%d]
err=[%s]/n",tperrno,tpstrerror(tperrno));
tpfree((char *) SndBuf);
tpfree((char *)RcvBuf);
return -2;
}
iRet = Fget32(RcvBuf, DEPARTNO, i, (char *)sDepartNo, 0);
if (iRet <0)
{
fprintf(stdout,"srv->Fget(DEPARTNO) errno=[%d]
err=[%s]/n",tperrno,tpstrerror(tperrno));
tpfree((char *) SndBuf);
tpfree((char *)RcvBuf);
return -2;
}
iRet = Fget32(RcvBuf, HIREDATE, i, (char *)sHireDate, 0);
if (iRet <0)
{
fprintf(stdout,"srv->Fget(ENAME) errno=[%d]
err=[%s]/n",tperrno,tpstrerror(tperrno));
tpfree((char *) SndBuf);
tpfree((char *)RcvBuf);
return -2;
}
printf("ENAME[%d]=[%s]/n",i,sEname);
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
printf("DEPARTNO[%d]=[%s]/n",i,sDepartNo);
printf("HIREDATE[%d]=[%s]/n",i,sHireDate);
} /* end of for */
tpfree((char *)RcvBuf);
tpfree((char *)SndBuf);
tpterm();
return 0;
}Occ=Foccur32(RcvBuf,ENAME);
Fprint32(RcvBuf);
for (i=0;i<lOcc ;i++ )
{
iRet = Fget32(RcvBuf, ENAME, i, (char *)sEname, 0);
if (iRet <0)
{
fprintf(stdout,"srv->Fget(ENAME) errno=[%d]
err=[%s]/n",tperrno,tpstrerror(tperrno));
tpfree((char *) SndBuf);
tpfree((char *)RcvBuf);
return -2;
}
iRet = Fget32(RcvBuf, DEPARTNO, i, (char *)sDepartNo, 0);
if (iRet <0)
{
fprintf(stdout,"srv->Fget(DEPARTNO) errno=[%d] err=[%s]/n",tpe
5.9 数据库中的多条记录如何用Tuxedo 的Buffer Type 来
组织?有没有比较好的软件架构?
oracle 的proc 编程返回数据集的函数例子
void
#if defined(__STDC__) || defined(__cplusplus)
InqueryBHistory(TPSVCINFO *transb)
#else
InqueryBHistory(transb)
TPSVCINFO *transb;
#endif
{
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
int occ=0;
FBFR * ibuf;
char sjbuf[256],tempStr[256];
ibuf=(FBFR *)tpalloc("FML",NULL,1024);
strcpy(sjbuf, (char *)transb->data);
strcpy(t_CustomerID.arr, sjbuf);
t_CustomerID.len=strlen(t_CustomerID.arr);
strcpy(t_Errono.arr,"0");
t_Errono.len=strlen(t_Errono.arr);
Fchg(ibuf, FERRONO, 0, (char *)t_Errono.arr,0);
EXEC SQL DECLARE billhistory_cursor CURSOR FOR
select
Month,NativeAmount,RemoteAmount,Amount,to_char(PaymentDate,'YYYY/MM/D
D') from
BEABILLHISTORY where CustomerID=:t_CustomerID ;
if (sqlca.sqlcode < 0) {
strcpy(t_Errono.arr,"2");
t_Errono.len=strlen(t_Errono.arr);
Fchg(ibuf,FERRONO, 0, (char *)t_Errono.arr, 0);
tpreturn(TPFAIL,0,(char *)ibuf, 0, 0);
}
EXEC SQL OPEN billhistory_cursor;
EXEC SQL WHENEVER NOT FOUND DO break;
for (;;) {
EXEC SQL FETCH
billhistory_cursor into :t_Month,:t_NativeAmount,:t_RemoteAmount,:t_Amount,:t
_PaymentDate ;
if (sqlca.sqlcode < 0) {
sql_msg("Error in select BEABILLHISTORY");
EXEC SQL CLOSE billhistory_cursor;
strcpy(t_Errono.arr,"2");
userlog("Errono is %s/n",t_Errono.arr);
t_Errono.len=strlen(t_Errono.arr);
Fchg(ibuf, FERRONO, 0, (char *)t_Errono.arr, 0);
tpreturn(TPFAIL, 0, (char *)ibuf, 0, 0);
}
else if (sqlca.sqlcode == 1403) {
sql_msg("No record in select BEABILLHISTORY");
EXEC SQL CLOSE billhistory_cursor;
tpreturn(TPFAIL, 0, (char *)ibuf, 0, 0);
}
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
t_CustomerID.arr[t_CustomerID.len]=0;
Fchg(ibuf, FCUSTOMERID, occ, (char *)t_CustomerID.arr, 0);
t_Month.arr[t_Month.len]=0;
Fchg(ibuf, FMONTH,occ,(char *)t_Month.arr,0);
sprintf( tempStr, "%10.2f", t_NativeAmount );
Fchg(ibuf, FNATIVEAMOUNT, occ, (char *)tempStr, 0);
sprintf( tempStr, "%10.2f", t_RemoteAmount );
Fchg(ibuf, FREMOTEAMOUNT, occ, (char *)tempStr, 0);
sprintf( tempStr, "%10.2f", t_Amount );
Fchg(ibuf, FAMOUNT, occ, (char *)tempStr, 0);
t_PaymentDate.arr[t_PaymentDate.len]=0;
Fchg(ibuf, FPAYMENTDATE, occ, (char *)t_PaymentDate.arr, 0);
occ=occ+1;
}
EXEC SQL CLOSE billhistory_cursor;
if(occ == 0) {
strcpy(t_Errono.arr,"2");
t_Errono.len=strlen(t_Errono.arr);
Fchg(ibuf, FERRONO, 0, (char *)t_Errono.arr, 0);
}
tpreturn(TPSUCCESS, 0, (char *)ibuf, 0, 0);
}
上面程序中FMONTH、FREMOTEAMOUNT 等是地址偏移量,一般在一个文本
文件生成
文本文件为
*base 100
FUSERNAME 1 string
FCUSTOMERID 2 string
FADDRESS 3 string
FSTATUS 4 string
FSTARTDATE 5 string
FPREPAYMENT 6 string
FREMARK 7 string
FPAYMENTDATE 8 string
FPAYMENTAMOUNT 9 string
FMONTH 10 string
FNATIVEAMOUNT 11 string
FREMOTEAMOUNT 12 string
FAMOUNT 13 string
FERRONO 14 string
FTYPE 15 string
执行mkfldhdr 命令把上面的文件生成头文件得到地址偏移量
mkfldhdr 地址偏移文件
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
/* fname fldid */
/* ----- ----- */
#define FUSERNAME ((FLDID)41061) /* number: 101 type: string */
#define FCUSTOMERID ((FLDID)41062) /* number: 102 type: string */
#define FADDRESS ((FLDID)41063) /* number: 103 type: string */
#define FSTATUS ((FLDID)41064) /* number: 104 type: string */
#define FSTARTDATE ((FLDID)41065) /* number: 105 type: string */
#define FPREPAYMENT ((FLDID)41066) /* number: 106 type: string */
#define FREMARK ((FLDID)4106
5.10 Tuxedo8.1 安装终结篇(Buckets Stop here!)
看来安装Tuxedo 出问题的人还不少啊!
我上次出问题后,来这儿问了,后来自己摆弄,终于弄好了。
现在也来介绍一下我的经验,愿大家都走出初学者的阴影,早日成为像
wsywin,qiupeng,damask 一样的高手!
我这里把我的安装经历说一下。
1,安装准备:
安装前一定要注意,如果想卸载掉原有版本,就注意一定要停止当前行的
Tuxedo 版本,并且程序-〉管理工具-〉服务中停止掉关于
Tuxedo 的几个服务。
下载到Tuxedo8.1 版本以及相应的Lic.txt 文件,这个可以在Bea 的网站上下载
(ft,好像白天下载快些,老外的嘛)。
2,安装,选择路径D:/Bea(随便选择),选择Full 安装模式,一路点击OK。
Create tlisten Password, 不知道干什么的,随便输入一个吧。
Would you like to configure LDAP for SSL Support? yes.管她呢,以后问
wsywin,damask 他们了,
看资料也行,写得很详细。后面的LDAP Configuration 配置不用管她,就用缺
省的吧。
3,选择好License 文件的位置,安装到次结束。
安装告一段落,不过还早着呢,下面的配置直到运行一个简单的Simpapp 很重要!
1,我们准备测试D:/bea/tuxedo8.1/samples/atmi/simpapp 下面的例子,所以我们把
这里文件
拷贝到,例如: F:/SimpApp。
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
2,配置环境变量:
我的电脑-〉属性-〉高级-〉环境变量,在Administator 的用户变量中:
添加:TUXDIR="D:/BEA/Tuxedo8.1"
TUXCONFIG="F:/SimpApp/tuxconfig"
PATH 后面加上"D:/BEA/Tuxedo8.1/bin"
LD_LIBARARY_PATH=%TUXDIR%/lib
3,检查并编译客户程序
运行cmd,到F:/SimpApp 目录下, 输入buildclient -o simpcl - f simpcl.c
4,检查并编译服务程序
运行cmd,到F:/SimpApp 目录下,输入buildserver –o simpserv –f simpserv.c –
s TOUPPER
5,编辑并加配置文件(这里有些麻烦,其实文件提示写得很清楚,需要认真看,改
写的地方不多)
# (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
IPCKEY 123456 #这个地方被我改写
#Example:
#IPCKEY 123456
DOMAINID simpapp
MASTER simple
MAXACCESSERS 10
MAXSERVERS 5
MAXSERVICES 10
MODEL SHM
LDBAL N
*MACHINES
DEFAULT:
APPDIR="F:/SimpDir" #这个地方被我改写
TUXCONFIG="F:/SimpApp/tuxconfig" #这个地方被我改写
TUXDIR="D:/bea/tuxedo8.1" #这个地方被我改写
#Example:
# APPDIR="/home/me/simpapp"
# TUXCONFIG="/home/me/simpapp/tuxconfig"
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
# TUXDIR="/usr/tuxedo"
CNH LMID=simple #这个地方被我改写
#Example:
#beatux LMID=simple
*GROUPS
GROUP1
LMID=simple GRPNO=1 OPENINFO=NONE
*SERVERS
DEFAULT:
CLOPT="-A"
simpserv SRVGRP=GROUP1 SRVID=1
*SERVICES
TOUPPER
编辑好后:
tmloadcf ubbsimple
Initialize TUXCONFIG file: /usr/me/simpdir/tuxconfig [y, q] ? y
6,启动应用程序
tmboot
7,执行运行时应用程序
simpcl “hello, world”
Returned string is: HELLO, WORLD
8,关闭应用程序
tmshutdown
参考文献:
《Bea Tuxedo 应用程序开发指南》经乾。网上可以下载
稍候我将会把Delphi 开发客户端的体会写出来,用View 方式.
我的QQ 是:77764686,欢迎又诚意者探讨Tuxedo 开发的问题.
此文被Tuxedoer 在2003/04/21 23:16:46 修改!ULT:
APPDIR="F:/SimpDir" #这个地方被我改写
TUXCONFIG="F:/SimpApp/tuxconfig" #这个地方被我改写
TUXDIR="D:/bea/tuxedo8.1" #这个地方被我改写
#Example:
# APPDIR="/home/me/simpapp"
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
# TUXCONFIG="/home/me/simpapp/tuxconfig"
# TUXDIR="/usr/tuxedo"
CNH LMID=simple #这个地方被我改写
#Example:
#beatux LMID=simple
*GROUPS
GROUP1
LMID=simple GRPNO=1 OPENINFO=NONE
*SERVERS
DEFAULT:
CLOPT="-A"
simpserv SRVGRP=GROUP1 SRVID=1
*SERVICES
TOUPPER
6 TUXEDO 心得
6.1 实现与Tuxedo 的第一次亲密接触--给自学Tuxedo
的朋友
实现与Tuxedo 的第一次亲密接触-给自学Tuxedo 的朋友
写本贴甚是犹豫,毕竟自己也还是个“棒槌”,而且这些也仅仅是自己的感觉,
未必适合其他人。于是抛砖引玉,请各路大虾赐教。
其它诸如搭建一个实验平台之类的方法就不说了,我这里仅从如何看文档、看哪
些文档方面说些感受。从网上搜索一番,中文的资料也有一些,但全面的却极少,
大多是简单的一些介绍。对于稍微长一些的入门、方法性质的文章,觉得还是没
那么细致。关键是还有两条,中文的资料无论翻译的也都没有索引,对于几个关
键词如server、service、transaction 等的译法也不统一,很容易令初学者迷糊。
所以我积极建议初学者能够直接查阅Tuxedo 的原版文档。对于不太常看英文的
网友起初觉得会有些困难,但这只是暂时的,坚持一个礼拜之后肯定就不会有什
么问题,需要的只是一些耐心而已。
初学阶段,建议从下面这些文档看起。每个文档不一定非要先全部看完,几个文
档之间可以交叉阅读。为方便起见文档名称已译为中文,具体下载地址请参考后
面的链接。
BEA dev2dev BBS Tuxedo 精华总结
BEA dev2dev 中国网站 http://dev2dev.bea.com.cn 版权所有
《ATMI 介绍》,介绍BEA Tuxedo 系统的基本概念和术语,C/S 结构剖析;
Tuxedo ATMI 的基本框架,对Tuxedo 所提供的“系统服务层”各service 的详细
解释和原理说明,消息模式机制的详细描述。第三章重点说明Tuxedo 的底层结
构,包括管理工具的使用介绍,应用队列管理,事件管理,如何创建UBBCONFIG,
如何实时动态管理UBB 配置,如何集中管理分布式应用环境,如何管理安全机
制,如何管理事务,如何启动、关闭应用,对Tuxedo 系统各概念如BRIDGE、
LOG、BBL、DBBL、MESSAGE 等的详细描述,单节点、多节点、域的配置和
管理等等。共3 章138 页。
《建立BEA Tuxedo 应用》,包括如何配置UBBCONFIG 的详细说明,UBB 各参
数的意义,事务、分布式事务的详细解释,TMS 的说明;如何配置应用使用事
务以及对应的UBB 参数设置以及示例;分布式应用环境的原理、意义详细解释
及示例;分布式应用环境UBB 的详细参数配置;具体建立一个分布式应用的方
法和步骤;工作站客户端工作原理和配置方法等等。共12 章254 页。
《文件格式数据描述系统处理参考》,主要查阅UBBCONFIG 那部分,包含
了UBB 配置文件各参数的详细说明。共578 页。
《实时管理Tuxedo 应用》,包含如何启动、关闭一个应用以及应用启动的详细过
程,如何创建配置文件、LOG 等,如何启动tlisten 进程等;如何实时监控应用;
如何动态修改应用的各种情况的详细介绍;如何管理一个分布式应用,如负载平
衡等;如何订阅各种事件;如何迁移应用;如何微调应用;Tuxedo 应用的问题
解决等等。共9 章190 页。
《ATMI 应用开发指导》,通过详细的示例建立几个不同的应用。共5 章166 页。
《用C 语言编写Tuxedo ATMI 应用》,介绍编程环境;管理类型缓冲;如何编写
客户端程序;如何编写服务程序;编写请求/应答式的客户端和服务;编写对话
模式的客户端和服务;编写基于事件的客户端和服务;编写全局事务;编写多线
程、多上下文(或者说多关联)的ATMI 应用;管理错误信息等。共11 章306
页。
BEA Tuxedo 在线电子文档: http://e-docs.bea.com/tuxedo/tux80/index.htm
全部链接: http://e-docs.bea.com/more_tux.html
BEA Tuxedo 系统信息文档:
http://edocs.bea.com/tuxedo/tux80/messages/index.htm
BEA dev2dev在线中文论坛: http://dev2dev.bea.com.cn/index.jsp
BEA dev2dev在线英文论坛: http://dev2dev.bea.com/index.jsp
本总结所提到的相关源程序点击此处下载
http://dev2dev.bea.com.cn/download/school/tuxedo/tuxedo_jinghua.zip
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值