TLOGNAME=TLOG
TLOGSIZE=100 *GROUPS GROUP1
LMID = SITE1 GRPNO = 1 TMSNAME=TMS TMSCOUNT=2
QUE1
*SERVERS DEFAULT:
CLOPT=\
LMID = SITE1 GRPNO = 2 TMSNAME = TMS_QM TMSCOUNT = 2
OPENINFO = \
TMQUEUE SRVGRP = QUE1 SRVID = 1
GRACE = 0 RESTART = Y CONV = N MAXGEN=10 CLOPT = \
TMQFORWARD SRVGRP=QUE1 SRVID= 5 GRACE=0 RESTART=Y CONV=N MAXGEN=10 CLOPT=\
server
*SERVICES
编译运行
确保make文件qsample.nt中include和lib变量已经包含了Tuxedo系统的头文件和库文件,然后使用如下命令进行编译:
c:\\qsample\\nmake/f qsample.nt all
成功后,用tmloadcf命令加载配置文件,用tmboot命令启动应用程序,最后,运行客户程序client.exe,就可以看到STRING服务的处理结果。
SRVGRP=GROUP1 SRVID=1111
10.5 /Q与事务
TUXEDO的/Q也是一种资源管理器, 可以和其他资源管理器如数据库协作,完成全局事务。下面通过例子来说明在/Q中使用事务一些应注意的地方.
例子的UBBCONFIG文件的内容为:
*RESOURCES IPCKEY DOMAINID MASTER MODEL
52617 qsample SITE1 SHM
*MACHINES MYSERVER LMID = SITE1 TUXDIR =\
APPDIR = \
TUXCONFIG = \TLOGDEVICE =\TLOGNAME=TLOG TLOGSIZE=100 MAXWSCLIENTS=5
*GROUPS
GROUP1 LMID = SITE1 GRPNO = 1 TMSNAME=TMS TMSCOUNT=2 QUE1 \
LMID = SITE1 GRPNO = 2
TMSNAME = TMS_QM TMSCOUNT = 2
OPENINFO = \
GROUP3
LMID=SITE1 GRPNO=3
TMSNAME=\
OPENINFO=\
GROUP4 LMID=SITE1
GRPNO=4
*SERVERS DEFAULT:
CLOPT=\
TMQUEUE SRVGRP = QUE1 SRVID = 1
TMQFORWARD SRVGRP=QUE1 SRVID= 5 GRACE=0 RESTART=Y CONV=N MAXGEN=10
CLOPT=\
GRACE = 0 RESTART = Y CONV = N MAXGEN=10 CLOPT = \
server SRVGRP=GROUP3 SRVID=1111
test SRVGRP=GROUP3 SRVID=111
*SERVICES
1.如果时采用转发模式,那么与QUEUE同名的SERVCIE所在的GROUP,必须是配置了TMS才能正常工作。
假设在TUXEDO带的例子qsample中,有上面UBBCONFIG中列的4个GROUP,那么:
(1)当STRING在GROUP1中时要这样编译:
buildserver -o server -f server.c -s STRING 或
buildserver -o server -f server.c -s STRING -r NONE
说明:TMS是TUXEDO系统自带的一个TMS SERVER,它对应RM文件中的NONE:tmnull_switch: 。
实际上你当编译SERVER时,如果你不带-r 参数,TUXEDO会自动加上-r NONE的。 这时候在程序中你也可以调用tpbegin(),tpcommit()等与事务操作有关的ATMI
(2)当STRING在QUE1中时要这样编译:
buildserver -o server -f server.c -r TUXEDO/QM -s STRING
如果不加 -r TUXEDO/QM,启动时会出现如下错误: 193628.XCJ!server.1144: GP_CAT:214: ERROR: Null version of xa_open() found non-null info string
193628.XCJ!server.1144: LIBTUX_CAT:466: ERROR: tpopen TPERMERR xa_open returned XAER_INVAL
193628.XCJ!server.1144: LIBTUX_CAT:1353: ERROR: tpopen failed - TPERMERR - resource manager error
193628.XCJ!server.1144: LIBTUX_CAT:250: ERROR: tpsvrinit() failed
(3)当STRING在GROUUP3中时要这样编译:
buildserver -o server -f server.c -r Oracle_XA -s STRING
(4)在STRING在GROUP4中时要这样编译: buildserver -o server -f server.c -s STRING
server能启动,但tpenqueue()调用能成功,tpdequeue()调用不成功。因为GROUP4中没有TMS。
2. 在与QUEUE同名的那个SERVICE 中的事务处理
在与QUEUE同名的那个SERVICE中不能再开始一个事务,因为QMFORWORD会自动启动一个TRANSACTION,如果在
该SERVICE 中又启动一个事务,会导致事务的嵌套,而TUXEDO不支持事务的嵌套。下面以qsample为例说明,
假设UBBCONFIG中也包括上面列的4个GROUP,那么如果STRING SERVICE在GROUP3中,并且把STRING STRING改写成 如下各种方式.
(1)
#include
EXEC SQL INCLUDE sqlca;
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
STRING(msg)
TPSVCINFO *msg; {
if(tpbegin(30,0) == -1) { userlog(\char *str; int i;
}
tpreturn( TPFAIL, 0, NULL, 0, 0 );
}
EXEC SQL INSERT INTO ss VALUES(\if(tpcommit(0) == -1) { }
str = (char *)msg->data;
for (i = 0; i < msg->len; i++) {
str[i] = toupper(str[i]);
}
tpreturn(TPSUCCESS, 0, msg->data, 0L, 0);
userlog(\tpreturn( TPFAIL, 0, NULL, 0, 0 );
会出现错误:203414.XCJ!server.1392: gtrid x0 x3affcb5e x2bf: tpbegin() fail=TPEPROTO - protocol error
写表操作失败,并且tpdequeue也失败,TMQFORWORD把tpenqueue()发送的消息写到ERRQUE中.
(2)
#include
EXEC SQL INCLUDE sqlca;
EXEC ORACLE OPTION (RELEASE_CURSOR = YES);
STRING(TPSVCINFO *msg) {
EXEC SQL INSERT INTO ss VALUES('1113'); if(sqlca.sqlcode!=0) { }
userlog(\tpreturn(TPFAIL, 0, NULL, 0L, 0); char *str; int i;